From 17822c507c03d509037c9ee5eee5cfbb201b3f01 Mon Sep 17 00:00:00 2001 From: Yee Cheng Chin Date: Thu, 13 Oct 2022 13:17:40 +0100 Subject: 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) --- src/mouse.c | 20 ++++++++++++++++---- src/testdir/test_termcodes.vim | 42 ++++++++++++++++++++++++++++++++++-------- src/version.c | 2 ++ 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index 452a30131..9efd148ec 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -141,7 +141,9 @@ find_end_of_word(pos_T *pos) # 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 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); - if (mpos->col > 0) - --mpos->col; mpos->coladd = 0; return IN_BUFFER; } @@ -598,7 +598,19 @@ do_mouse( jump_flags = MOUSE_MAY_STOP_VIS; 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(VIsual, m_pos))) || (LT_POS(VIsual, curwin->w_cursor) diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index cb1d01a0b..12c5737ae 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -1298,20 +1298,20 @@ func Test_term_mouse_popup_menu_setpos() call assert_equal([1, 10], [line('.'), col('.')], 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 @" = '' call cursor(1, 10) - call feedkeys('vee' .. MouseRightClickCode(1, 2) - \ .. MouseRightReleaseCode(1, 2) .. "\\", "x") - call assert_equal([1, 2], [line('.'), col('.')], msg) + call feedkeys('vee' .. MouseRightClickCode(1, 9) + \ .. MouseRightReleaseCode(1, 9) .. "\\", "x") + call assert_equal([1, 9], [line('.'), col('.')], 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 @" = '' call cursor(1, 10) - call feedkeys('vee' .. MouseRightClickCode(1, 20) - \ .. MouseRightReleaseCode(1, 20) .. "\\", "x") - call assert_equal([1, 20], [line('.'), col('.')], msg) + call feedkeys('vee' .. MouseRightClickCode(1, 18) + \ .. MouseRightReleaseCode(1, 18) .. "\\", "x") + call assert_equal([1, 18], [line('.'), col('.')], msg) call assert_equal('', @", msg) " 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('', @", 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) .. "\\", "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) .. "\\", "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) .. "\\", "x") + call assert_equal([2, 10], [line('.'), col('.')], msg) + call assert_equal("", @", msg) + " Try clicking on the status line let @" = '' call cursor(1, 10) diff --git a/src/version.c b/src/version.c index e3a6f360f..4014da658 100644 --- a/src/version.c +++ b/src/version.c @@ -699,6 +699,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 739, /**/ 738, /**/ -- cgit v1.2.1