diff options
author | Yee Cheng Chin <ychin.git@gmail.com> | 2022-10-13 13:17:40 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-10-13 13:17:40 +0100 |
commit | 17822c507c03d509037c9ee5eee5cfbb201b3f01 (patch) | |
tree | 71ab21115f394f99e74d76a56ccde2e124613dd9 | |
parent | 91ccbad5ded8bcf2cc93a873ff2c3179b0c548c7 (diff) | |
download | vim-git-17822c507c03d509037c9ee5eee5cfbb201b3f01.tar.gz |
patch 9.0.0739: mouse column not correctly used for popup_setposv9.0.0739
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)
-rw-r--r-- | src/mouse.c | 20 | ||||
-rw-r--r-- | src/testdir/test_termcodes.vim | 42 | ||||
-rw-r--r-- | 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) .. "\<Down>\<CR>", "x") - call assert_equal([1, 2], [line('.'), col('.')], msg) + call feedkeys('vee' .. MouseRightClickCode(1, 9) + \ .. MouseRightReleaseCode(1, 9) .. "\<Down>\<CR>", "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) .. "\<Down>\<CR>", "x") - call assert_equal([1, 20], [line('.'), col('.')], msg) + call feedkeys('vee' .. MouseRightClickCode(1, 18) + \ .. MouseRightReleaseCode(1, 18) .. "\<Down>\<CR>", "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) .. "\<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 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 @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 739, +/**/ 738, /**/ 737, |