mirror of
https://github.com/vim/vim.git
synced 2025-07-25 10:54:51 -04:00
patch 8.1.2266: position unknown for a mouse click in a popup window
Problem: Position unknown for a mouse click in a popup window. Solution: Set v:mouse_col and v:mouse_lnum. (closes #5171)
This commit is contained in:
parent
638a4a7508
commit
f8b036bcae
@ -2862,12 +2862,31 @@ invoke_popup_filter(win_T *wp, int c)
|
|||||||
|
|
||||||
argv[2].v_type = VAR_UNKNOWN;
|
argv[2].v_type = VAR_UNKNOWN;
|
||||||
|
|
||||||
|
if (is_mouse_key(c))
|
||||||
|
{
|
||||||
|
int row = mouse_row - wp->w_winrow;
|
||||||
|
int col = mouse_col - wp->w_wincol;
|
||||||
|
linenr_T lnum;
|
||||||
|
|
||||||
|
if (row >= 0 && col >= 0)
|
||||||
|
{
|
||||||
|
(void)mouse_comp_pos(wp, &row, &col, &lnum, NULL);
|
||||||
|
set_vim_var_nr(VV_MOUSE_LNUM, lnum);
|
||||||
|
set_vim_var_nr(VV_MOUSE_COL, col + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: The callback might close the popup and make "wp" invalid.
|
// NOTE: The callback might close the popup and make "wp" invalid.
|
||||||
call_callback(&wp->w_filter_cb, -1, &rettv, 2, argv);
|
call_callback(&wp->w_filter_cb, -1, &rettv, 2, argv);
|
||||||
if (win_valid_popup(wp) && old_lnum != wp->w_cursor.lnum)
|
if (win_valid_popup(wp) && old_lnum != wp->w_cursor.lnum)
|
||||||
popup_highlight_curline(wp);
|
popup_highlight_curline(wp);
|
||||||
|
|
||||||
res = tv_get_number(&rettv);
|
res = tv_get_number(&rettv);
|
||||||
|
|
||||||
|
if (is_mouse_key(c))
|
||||||
|
{
|
||||||
|
set_vim_var_nr(VV_MOUSE_LNUM, 0);
|
||||||
|
set_vim_var_nr(VV_MOUSE_COL, 0);
|
||||||
|
}
|
||||||
vim_free(argv[1].vval.v_string);
|
vim_free(argv[1].vval.v_string);
|
||||||
clear_tv(&rettv);
|
clear_tv(&rettv);
|
||||||
return res;
|
return res;
|
||||||
@ -2891,8 +2910,6 @@ popup_do_filter(int c)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
recursive = TRUE;
|
recursive = TRUE;
|
||||||
|
|
||||||
popup_reset_handled();
|
|
||||||
|
|
||||||
if (c == K_LEFTMOUSE)
|
if (c == K_LEFTMOUSE)
|
||||||
{
|
{
|
||||||
int row = mouse_row;
|
int row = mouse_row;
|
||||||
@ -2903,6 +2920,7 @@ popup_do_filter(int c)
|
|||||||
res = TRUE;
|
res = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
popup_reset_handled();
|
||||||
state = get_real_state();
|
state = get_real_state();
|
||||||
while (!res && (wp = find_next_popup(FALSE)) != NULL)
|
while (!res && (wp = find_next_popup(FALSE)) != NULL)
|
||||||
if (wp->w_filter_cb.cb_name != NULL
|
if (wp->w_filter_cb.cb_name != NULL
|
||||||
|
@ -2166,6 +2166,44 @@ func Test_popupwin_filter_mode()
|
|||||||
delfunc MyPopupFilter
|
delfunc MyPopupFilter
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_popupwin_filter_mouse()
|
||||||
|
func MyPopupFilter(winid, c)
|
||||||
|
let g:got_mouse_col = v:mouse_col
|
||||||
|
let g:got_mouse_lnum = v:mouse_lnum
|
||||||
|
return 0
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
let winid = popup_create(['short', 'long line that will wrap', 'short'], #{
|
||||||
|
\ line: 4,
|
||||||
|
\ col: 8,
|
||||||
|
\ maxwidth: 12,
|
||||||
|
\ filter: 'MyPopupFilter',
|
||||||
|
\ })
|
||||||
|
redraw
|
||||||
|
call test_setmouse(4, 8)
|
||||||
|
call feedkeys("\<LeftMouse>", 'xt')
|
||||||
|
call assert_equal(1, g:got_mouse_col)
|
||||||
|
call assert_equal(1, g:got_mouse_lnum)
|
||||||
|
|
||||||
|
call test_setmouse(5, 8)
|
||||||
|
call feedkeys("\<LeftMouse>", 'xt')
|
||||||
|
call assert_equal(1, g:got_mouse_col)
|
||||||
|
call assert_equal(2, g:got_mouse_lnum)
|
||||||
|
|
||||||
|
call test_setmouse(6, 8)
|
||||||
|
call feedkeys("\<LeftMouse>", 'xt')
|
||||||
|
call assert_equal(13, g:got_mouse_col)
|
||||||
|
call assert_equal(2, g:got_mouse_lnum)
|
||||||
|
|
||||||
|
call test_setmouse(7, 20)
|
||||||
|
call feedkeys("\<LeftMouse>", 'xt')
|
||||||
|
call assert_equal(13, g:got_mouse_col)
|
||||||
|
call assert_equal(3, g:got_mouse_lnum)
|
||||||
|
|
||||||
|
call popup_close(winid)
|
||||||
|
delfunc MyPopupFilter
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_popupwin_with_buffer()
|
func Test_popupwin_with_buffer()
|
||||||
call writefile(['some text', 'in a buffer'], 'XsomeFile')
|
call writefile(['some text', 'in a buffer'], 'XsomeFile')
|
||||||
let buf = bufadd('XsomeFile')
|
let buf = bufadd('XsomeFile')
|
||||||
|
@ -741,6 +741,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
2266,
|
||||||
/**/
|
/**/
|
||||||
2265,
|
2265,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user