patch 9.1.0525: Right release selects immediately when pum is truncated. Commit: https://github.com/vim/vim/commit/761a420c66402545acd8ee3ffa17c3a1fc3110e4 Author: zeertzjq <zeert...@outlook.com> Date: Thu Jul 4 17:26:37 2024 +0200
patch 9.1.0525: Right release selects immediately when pum is truncated. Problem: Right release selects immediately when pum is truncated. Solution: Use pum_height instead of pum_size when checking click row. Don't place it above mouse row when there is more space below. (zeertzjq) fixes: #15101 closes: #15102 Signed-off-by: zeertzjq <zeert...@outlook.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/popupmenu.c b/src/popupmenu.c index 6e9d82647..c18c97f7b 100644 --- a/src/popupmenu.c +++ b/src/popupmenu.c @@ -1332,9 +1332,10 @@ pum_set_event_info(dict_T *dict) static void pum_position_at_mouse(int min_width) { - if (Rows - mouse_row > pum_size) + if (Rows - mouse_row > pum_size || Rows - mouse_row > mouse_row) { - // Enough space below the mouse row. + // Enough space below the mouse row, + // or there is more space below the mouse row than above. pum_row = mouse_row + 1; if (pum_height > Rows - pum_row) pum_height = Rows - pum_row; @@ -1633,7 +1634,7 @@ pum_select_mouse_pos(void) { int idx = mouse_row - pum_row; - if (idx < 0 || idx >= pum_size) + if (idx < 0 || idx >= pum_height) pum_selected = -1; else if (*pum_array[idx].pum_text != NUL) pum_selected = idx; diff --git a/src/testdir/test_menu.vim b/src/testdir/test_menu.vim index 22292289e..40fec4058 100644 --- a/src/testdir/test_menu.vim +++ b/src/testdir/test_menu.vim @@ -481,13 +481,48 @@ func Test_popup_menu() unmenu PopUp endfunc +func Test_popup_menu_truncated() + CheckNotGui + + set mouse=a mousemodel=popup + aunmenu PopUp + for i in range(2 * &lines) + exe $'menu PopUp.{i} <Cmd>let g:res = {i}<CR>' + endfor + + func LeftClickExpr(row, col) + call test_setmouse(a:row, a:col) + return "\<LeftMouse>" + endfunc + + " Clicking at the bottom should place popup menu above click position. + " <RightRelease> should not select an item immediately. + let g:res = -1 + call test_setmouse(&lines, 1) + nnoremap <expr><F2> LeftClickExpr(4, 1) + call feedkeys("\<RightMouse>\<RightRelease>\<F2>", 'tx') + call assert_equal(3, g:res) + + " Clicking at the top should place popup menu below click position. + let g:res = -1 + call test_setmouse(1, 1) + nnoremap <expr><F2> LeftClickExpr(5, 1) + call feedkeys("\<RightMouse>\<RightRelease>\<F2>", 'tx') + call assert_equal(3, g:res) + + nunmap <F2> + delfunc LeftClickExpr + unlet g:res + aunmenu PopUp + set mouse& mousemodel& +endfunc + " Test for MenuPopup autocommand func Test_autocmd_MenuPopup() CheckNotGui - set mouse=a - set mousemodel=popup - aunmenu * + set mouse=a mousemodel=popup + aunmenu PopUp autocmd MenuPopup * exe printf( \ 'anoremenu PopUp.Foo <Cmd>let g:res = ["%s", "%s"]<CR>', \ expand('<afile>'), expand('<amatch>')) diff --git a/src/version.c b/src/version.c index 47b60760b..66ed6a6f6 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 525, /**/ 524, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1sPOPN-002UVJ-6V%40256bit.org.