# HG changeset patch # User Bram Moolenaar # Date 1665664203 -7200 # Node ID ffdb7a6785af019d6a64f6e18f243c88c186d966 # Parent 384b77639588f20510c9142857ee1fc54d8c5864 patch 9.0.0739: mouse column not correctly used for popup_setpos Commit: https://github.com/vim/vim/commit/17822c507c03d509037c9ee5eee5cfbb201b3f01 Author: Yee Cheng Chin Date: Thu Oct 13 13:17:40 2022 +0100 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) diff --git a/src/mouse.c b/src/mouse.c --- 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 739, +/**/ 738, /**/ 737,