vim-patch:9.1.0525: Right release selects immediately when pum is truncated. (#29568)

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: vim/vim#15101
closes: vim/vim#15102

761a420c66
This commit is contained in:
zeertzjq
2024-07-05 07:46:01 +08:00
committed by GitHub
parent 81d4e96bc8
commit 842725eedc
2 changed files with 42 additions and 6 deletions

View File

@@ -1265,8 +1265,9 @@ static void pum_position_at_mouse(int min_width)
pum_anchor_grid = mouse_grid; pum_anchor_grid = mouse_grid;
} }
if (max_row - mouse_row > pum_size) { if (max_row - mouse_row > pum_size || max_row - mouse_row > mouse_row - min_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_above = false; pum_above = false;
pum_row = mouse_row + 1; pum_row = mouse_row + 1;
if (pum_height > max_row - pum_row) { if (pum_height > max_row - pum_row) {
@@ -1322,7 +1323,7 @@ static void pum_select_mouse_pos(void)
int idx = mouse_row - pum_row; int idx = mouse_row - pum_row;
if (idx < 0 || idx >= pum_size) { if (idx < 0 || idx >= pum_height) {
pum_selected = -1; pum_selected = -1;
} else if (*pum_array[idx].pum_text != NUL) { } else if (*pum_array[idx].pum_text != NUL) {
pum_selected = idx; pum_selected = idx;

View File

@@ -482,13 +482,48 @@ func Test_popup_menu()
unmenu PopUp unmenu PopUp
endfunc 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 Ntest_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 Ntest_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 Ntest_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 " Test for MenuPopup autocommand
func Test_autocmd_MenuPopup() func Test_autocmd_MenuPopup()
CheckNotGui CheckNotGui
set mouse=a set mouse=a mousemodel=popup
set mousemodel=popup aunmenu PopUp
aunmenu *
autocmd MenuPopup * exe printf( autocmd MenuPopup * exe printf(
\ 'anoremenu PopUp.Foo <Cmd>let g:res = ["%s", "%s"]<CR>', \ 'anoremenu PopUp.Foo <Cmd>let g:res = ["%s", "%s"]<CR>',
\ expand('<afile>'), expand('<amatch>')) \ expand('<afile>'), expand('<amatch>'))