To: vim_dev@googlegroups.com Subject: Patch 9.0.0739 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.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) Files: src/mouse.c, src/testdir/test_termcodes.vim *** ../vim-9.0.0738/src/mouse.c 2022-10-04 16:23:39.018042176 +0100 --- src/mouse.c 2022-10-13 13:05:44.879745093 +0100 *************** *** 141,147 **** # define NEED_VCOL2COL /* ! * Translate window coordinates to buffer position without any side effects */ static int get_fpos_of_mouse(pos_T *mpos) --- 141,149 ---- # define NEED_VCOL2COL /* ! * 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,179 **** mpos->col = vcol2col(wp, mpos->lnum, col); - if (mpos->col > 0) - --mpos->col; mpos->coladd = 0; return IN_BUFFER; } --- 174,179 ---- *************** *** 598,604 **** jump_flags = MOUSE_MAY_STOP_VIS; else { ! if ((LT_POS(curwin->w_cursor, VIsual) && (LT_POS(m_pos, curwin->w_cursor) || LT_POS(VIsual, m_pos))) || (LT_POS(VIsual, curwin->w_cursor) --- 598,616 ---- jump_flags = MOUSE_MAY_STOP_VIS; else { ! 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) *** ../vim-9.0.0738/src/testdir/test_termcodes.vim 2022-10-05 11:24:42.228494178 +0100 --- src/testdir/test_termcodes.vim 2022-10-13 13:02:47.387508198 +0100 *************** *** 1298,1317 **** call assert_equal([1, 10], [line('.'), col('.')], msg) call assert_equal('ran away', @", msg) ! " Test for right click in visual mode 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 assert_equal('', @", msg) ! " Test for right click in visual mode 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 assert_equal('', @", msg) " Test for right click in block-wise visual mode inside the selection --- 1298,1317 ---- call assert_equal([1, 10], [line('.'), col('.')], msg) call assert_equal('ran away', @", msg) ! " Test for right click in visual mode right before the selection let @" = '' call cursor(1, 10) ! 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 right after the selection let @" = '' call cursor(1, 10) ! 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,1336 **** --- 1331,1362 ---- 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) *** ../vim-9.0.0738/src/version.c 2022-10-13 12:51:09.544145472 +0100 --- src/version.c 2022-10-13 13:04:34.507670786 +0100 *************** *** 701,702 **** --- 701,704 ---- { /* Add new patch number below this line */ + /**/ + 739, /**/ -- [SIR LAUNCELOT runs back up the stairs, grabs a rope of the wall and swings out over the heads of the CROWD in a swashbuckling manner towards a large window. He stops just short of the window and is left swing pathetically back and forth.] LAUNCELOT: Excuse me ... could somebody give me a push ... "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///