mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 9.0.0739: mouse column not correctly used for popup_setpos
Problem: Mouse column not correctly used for popup_setpos. Solution: Adjust off-by-one error and handle Visual line selection properly. (Yee Cheng Chin, closes #11356)
This commit is contained in:
committed by
Bram Moolenaar
parent
91ccbad5de
commit
17822c507c
20
src/mouse.c
20
src/mouse.c
@@ -141,7 +141,9 @@ find_end_of_word(pos_T *pos)
|
|||||||
# define NEED_VCOL2COL
|
# define NEED_VCOL2COL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Translate window coordinates to buffer position without any side effects
|
* Translate window coordinates to buffer position without any side effects.
|
||||||
|
* Returns IN_BUFFER and sets "mpos->col" to the column when in buffer text.
|
||||||
|
* The column is one for the first column.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
get_fpos_of_mouse(pos_T *mpos)
|
get_fpos_of_mouse(pos_T *mpos)
|
||||||
@@ -172,8 +174,6 @@ get_fpos_of_mouse(pos_T *mpos)
|
|||||||
|
|
||||||
mpos->col = vcol2col(wp, mpos->lnum, col);
|
mpos->col = vcol2col(wp, mpos->lnum, col);
|
||||||
|
|
||||||
if (mpos->col > 0)
|
|
||||||
--mpos->col;
|
|
||||||
mpos->coladd = 0;
|
mpos->coladd = 0;
|
||||||
return IN_BUFFER;
|
return IN_BUFFER;
|
||||||
}
|
}
|
||||||
@@ -598,7 +598,19 @@ do_mouse(
|
|||||||
jump_flags = MOUSE_MAY_STOP_VIS;
|
jump_flags = MOUSE_MAY_STOP_VIS;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((LT_POS(curwin->w_cursor, VIsual)
|
if (VIsual_mode == 'V')
|
||||||
|
{
|
||||||
|
if ((curwin->w_cursor.lnum <= VIsual.lnum
|
||||||
|
&& (m_pos.lnum < curwin->w_cursor.lnum
|
||||||
|
|| VIsual.lnum < m_pos.lnum))
|
||||||
|
|| (VIsual.lnum < curwin->w_cursor.lnum
|
||||||
|
&& (m_pos.lnum < VIsual.lnum
|
||||||
|
|| curwin->w_cursor.lnum < m_pos.lnum)))
|
||||||
|
{
|
||||||
|
jump_flags = MOUSE_MAY_STOP_VIS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((LTOREQ_POS(curwin->w_cursor, VIsual)
|
||||||
&& (LT_POS(m_pos, curwin->w_cursor)
|
&& (LT_POS(m_pos, curwin->w_cursor)
|
||||||
|| LT_POS(VIsual, m_pos)))
|
|| LT_POS(VIsual, m_pos)))
|
||||||
|| (LT_POS(VIsual, curwin->w_cursor)
|
|| (LT_POS(VIsual, curwin->w_cursor)
|
||||||
|
@@ -1298,20 +1298,20 @@ func Test_term_mouse_popup_menu_setpos()
|
|||||||
call assert_equal([1, 10], [line('.'), col('.')], msg)
|
call assert_equal([1, 10], [line('.'), col('.')], msg)
|
||||||
call assert_equal('ran away', @", msg)
|
call assert_equal('ran away', @", msg)
|
||||||
|
|
||||||
" Test for right click in visual mode before the selection
|
" Test for right click in visual mode right before the selection
|
||||||
let @" = ''
|
let @" = ''
|
||||||
call cursor(1, 10)
|
call cursor(1, 10)
|
||||||
call feedkeys('vee' .. MouseRightClickCode(1, 2)
|
call feedkeys('vee' .. MouseRightClickCode(1, 9)
|
||||||
\ .. MouseRightReleaseCode(1, 2) .. "\<Down>\<CR>", "x")
|
\ .. MouseRightReleaseCode(1, 9) .. "\<Down>\<CR>", "x")
|
||||||
call assert_equal([1, 2], [line('.'), col('.')], msg)
|
call assert_equal([1, 9], [line('.'), col('.')], msg)
|
||||||
call assert_equal('', @", msg)
|
call assert_equal('', @", msg)
|
||||||
|
|
||||||
" Test for right click in visual mode after the selection
|
" Test for right click in visual mode right after the selection
|
||||||
let @" = ''
|
let @" = ''
|
||||||
call cursor(1, 10)
|
call cursor(1, 10)
|
||||||
call feedkeys('vee' .. MouseRightClickCode(1, 20)
|
call feedkeys('vee' .. MouseRightClickCode(1, 18)
|
||||||
\ .. MouseRightReleaseCode(1, 20) .. "\<Down>\<CR>", "x")
|
\ .. MouseRightReleaseCode(1, 18) .. "\<Down>\<CR>", "x")
|
||||||
call assert_equal([1, 20], [line('.'), col('.')], msg)
|
call assert_equal([1, 18], [line('.'), col('.')], msg)
|
||||||
call assert_equal('', @", msg)
|
call assert_equal('', @", msg)
|
||||||
|
|
||||||
" Test for right click in block-wise visual mode inside the selection
|
" Test for right click in block-wise visual mode inside the selection
|
||||||
@@ -1331,6 +1331,32 @@ func Test_term_mouse_popup_menu_setpos()
|
|||||||
call assert_equal('v', getregtype('"'), msg)
|
call assert_equal('v', getregtype('"'), msg)
|
||||||
call assert_equal('', @", msg)
|
call assert_equal('', @", msg)
|
||||||
|
|
||||||
|
" Test for right click in line-wise visual mode inside the selection
|
||||||
|
let @" = ''
|
||||||
|
call cursor(1, 16)
|
||||||
|
call feedkeys("V" .. MouseRightClickCode(1, 10)
|
||||||
|
\ .. MouseRightReleaseCode(1, 10) .. "\<Down>\<CR>", "x")
|
||||||
|
call assert_equal([1, 1], [line('.'), col('.')], msg) " After yanking, the cursor goes to 1,1
|
||||||
|
call assert_equal("V", getregtype('"'), msg)
|
||||||
|
call assert_equal(len(getreg('"', 1, v:true)), 1, msg)
|
||||||
|
|
||||||
|
" Test for right click in multi-line line-wise visual mode inside the selection
|
||||||
|
let @" = ''
|
||||||
|
call cursor(1, 16)
|
||||||
|
call feedkeys("Vj" .. MouseRightClickCode(2, 20)
|
||||||
|
\ .. MouseRightReleaseCode(2, 20) .. "\<Down>\<CR>", "x")
|
||||||
|
call assert_equal([1, 1], [line('.'), col('.')], msg) " After yanking, the cursor goes to 1,1
|
||||||
|
call assert_equal("V", getregtype('"'), msg)
|
||||||
|
call assert_equal(len(getreg('"', 1, v:true)), 2, msg)
|
||||||
|
|
||||||
|
" Test for right click in line-wise visual mode outside the selection
|
||||||
|
let @" = ''
|
||||||
|
call cursor(1, 16)
|
||||||
|
call feedkeys("V" .. MouseRightClickCode(2, 10)
|
||||||
|
\ .. MouseRightReleaseCode(2, 10) .. "\<Down>\<CR>", "x")
|
||||||
|
call assert_equal([2, 10], [line('.'), col('.')], msg)
|
||||||
|
call assert_equal("", @", msg)
|
||||||
|
|
||||||
" Try clicking on the status line
|
" Try clicking on the status line
|
||||||
let @" = ''
|
let @" = ''
|
||||||
call cursor(1, 10)
|
call cursor(1, 10)
|
||||||
|
@@ -699,6 +699,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
739,
|
||||||
/**/
|
/**/
|
||||||
738,
|
738,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user