forked from aniani/vim
patch 8.2.3697: cannot drag a popup without a border
Problem: Cannot drag a popup without a border. Solution: Add the "dragall" option. (closes #9218)
This commit is contained in:
parent
7f2c341664
commit
0b74d00693
@ -681,6 +681,9 @@ The second argument of |popup_create()| is a dictionary with options:
|
|||||||
popup does not have a border. As soon as dragging
|
popup does not have a border. As soon as dragging
|
||||||
starts and "pos" is "center" it is changed to
|
starts and "pos" is "center" it is changed to
|
||||||
"topleft".
|
"topleft".
|
||||||
|
dragall TRUE to allow the popup to be dragged from every
|
||||||
|
position. Makes it very difficult to select text in
|
||||||
|
the popup.
|
||||||
resize TRUE to allow the popup to be resized with the mouse
|
resize TRUE to allow the popup to be resized with the mouse
|
||||||
by grabbing at the bottom right corner. Has no effect
|
by grabbing at the bottom right corner. Has no effect
|
||||||
if the popup does not have a border.
|
if the popup does not have a border.
|
||||||
|
@ -1636,8 +1636,9 @@ retnomove:
|
|||||||
{
|
{
|
||||||
return IN_UNKNOWN;
|
return IN_UNKNOWN;
|
||||||
}
|
}
|
||||||
else if ((wp->w_popup_flags & (POPF_DRAG | POPF_RESIZE))
|
else if (((wp->w_popup_flags & (POPF_DRAG | POPF_RESIZE))
|
||||||
&& popup_on_border(wp, row, col))
|
&& popup_on_border(wp, row, col))
|
||||||
|
|| (wp->w_popup_flags & POPF_DRAGALL))
|
||||||
{
|
{
|
||||||
popup_dragwin = wp;
|
popup_dragwin = wp;
|
||||||
popup_start_drag(wp, row, col);
|
popup_start_drag(wp, row, col);
|
||||||
|
@ -297,7 +297,7 @@ popup_drag(win_T *wp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(wp->w_popup_flags & POPF_DRAG))
|
if (!(wp->w_popup_flags & (POPF_DRAG | POPF_DRAGALL)))
|
||||||
return;
|
return;
|
||||||
wp->w_wantline = drag_start_wantline + (mouse_row - drag_start_row);
|
wp->w_wantline = drag_start_wantline + (mouse_row - drag_start_row);
|
||||||
if (wp->w_wantline < 1)
|
if (wp->w_wantline < 1)
|
||||||
@ -687,6 +687,14 @@ apply_general_options(win_T *wp, dict_T *dict)
|
|||||||
else
|
else
|
||||||
wp->w_popup_flags &= ~POPF_DRAG;
|
wp->w_popup_flags &= ~POPF_DRAG;
|
||||||
}
|
}
|
||||||
|
nr = dict_get_bool(dict, (char_u *)"dragall", -1);
|
||||||
|
if (nr != -1)
|
||||||
|
{
|
||||||
|
if (nr)
|
||||||
|
wp->w_popup_flags |= POPF_DRAGALL;
|
||||||
|
else
|
||||||
|
wp->w_popup_flags &= ~POPF_DRAGALL;
|
||||||
|
}
|
||||||
|
|
||||||
nr = dict_get_bool(dict, (char_u *)"posinvert", -1);
|
nr = dict_get_bool(dict, (char_u *)"posinvert", -1);
|
||||||
if (nr != -1)
|
if (nr != -1)
|
||||||
@ -2358,7 +2366,7 @@ filter_handle_drag(win_T *wp, int c, typval_T *rettv)
|
|||||||
int row = mouse_row;
|
int row = mouse_row;
|
||||||
int col = mouse_col;
|
int col = mouse_col;
|
||||||
|
|
||||||
if ((wp->w_popup_flags & POPF_DRAG)
|
if ((wp->w_popup_flags & (POPF_DRAG | POPF_DRAGALL))
|
||||||
&& is_mouse_key(c)
|
&& is_mouse_key(c)
|
||||||
&& (wp == popup_dragwin
|
&& (wp == popup_dragwin
|
||||||
|| wp == mouse_find_win(&row, &col, FIND_POPUP)))
|
|| wp == mouse_find_win(&row, &col, FIND_POPUP)))
|
||||||
@ -3078,6 +3086,8 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
|
|||||||
dict_add_string(dict, "title", wp->w_popup_title);
|
dict_add_string(dict, "title", wp->w_popup_title);
|
||||||
dict_add_number(dict, "wrap", wp->w_p_wrap);
|
dict_add_number(dict, "wrap", wp->w_p_wrap);
|
||||||
dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0);
|
dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0);
|
||||||
|
dict_add_number(dict, "dragall",
|
||||||
|
(wp->w_popup_flags & POPF_DRAGALL) != 0);
|
||||||
dict_add_number(dict, "mapping",
|
dict_add_number(dict, "mapping",
|
||||||
(wp->w_popup_flags & POPF_MAPPING) != 0);
|
(wp->w_popup_flags & POPF_MAPPING) != 0);
|
||||||
dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
|
dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
|
||||||
|
10
src/testdir/dumps/Test_popupwin_drag_05.dump
Normal file
10
src/testdir/dumps/Test_popupwin_drag_05.dump
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
>1+0&#ffffff0| @35||+1&&|1+0&&| @35
|
||||||
|
|2| @35||+1&&|2+0&&| @35
|
||||||
|
|3| @2|h+0#0000001#ffd7ff255|e|l@1|o| +0#0000000#ffffff0@27||+1&&|3+0&&| @35
|
||||||
|
|4| @35||+1&&|4+0&&| @35
|
||||||
|
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p
|
||||||
|
|1+0&&| @35||+1&&|1+0&&| @35
|
||||||
|
|2| @35||+1&&|2+0&&| @35
|
||||||
|
|3| @35||+1&&|3+0&&| @35
|
||||||
|
|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p| |[|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p
|
||||||
|
|:+0&&|c|a|l@1| |D|r|a|g|A|l@1|S|t|a|r|t|(|)| @54
|
10
src/testdir/dumps/Test_popupwin_drag_06.dump
Normal file
10
src/testdir/dumps/Test_popupwin_drag_06.dump
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
>1+0&#ffffff0| @35||+1&&|1+0&&| @35
|
||||||
|
|2| @35||+1&&|2+0&&| @35
|
||||||
|
|3| @35||+1&&|3+0&&| @35
|
||||||
|
|4| @35||+1&&|4+0&&| @35
|
||||||
|
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|h+0#0000001#ffd7ff255|e|l@1|o|o+1#0000000#ffffff0| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p
|
||||||
|
|1+0&&| @35||+1&&|1+0&&| @35
|
||||||
|
|2| @35||+1&&|2+0&&| @35
|
||||||
|
|3| @35||+1&&|3+0&&| @35
|
||||||
|
|[+1&&|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p| |[|N|o| |N|a|m|e|]| |[|+|]| @5|1|,|1| @11|T|o|p
|
||||||
|
|:+0&&|c|a|l@1| |D|r|a|g|A|l@1|D|r|a|g|(|)| @55
|
@ -565,22 +565,31 @@ func Test_popup_drag()
|
|||||||
\ line: &lines - 4,
|
\ line: &lines - 4,
|
||||||
\ })
|
\ })
|
||||||
func Dragit()
|
func Dragit()
|
||||||
|
map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
|
||||||
|
map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
|
||||||
call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
|
call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
|
||||||
endfunc
|
endfunc
|
||||||
map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
|
|
||||||
map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
|
|
||||||
func Resize()
|
func Resize()
|
||||||
|
map <silent> <F5> :call test_setmouse(6, 21)<CR>
|
||||||
|
map <silent> <F6> :call test_setmouse(7, 25)<CR>
|
||||||
call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
|
call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
|
||||||
endfunc
|
endfunc
|
||||||
map <silent> <F5> :call test_setmouse(6, 21)<CR>
|
|
||||||
map <silent> <F6> :call test_setmouse(7, 25)<CR>
|
|
||||||
func ClickAndDrag()
|
func ClickAndDrag()
|
||||||
call feedkeys("\<F7>\<LeftMouse>\<LeftRelease>", "xt")
|
map <silent> <F3> :call test_setmouse(5, 2)<CR>
|
||||||
call feedkeys("\<F8>\<LeftMouse>\<F9>\<LeftDrag>\<LeftRelease>", "xt")
|
map <silent> <F4> :call test_setmouse(3, 14)<CR>
|
||||||
|
map <silent> <F5> :call test_setmouse(3, 18)<CR>
|
||||||
|
call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
|
||||||
|
call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
|
||||||
|
endfunc
|
||||||
|
func DragAllStart()
|
||||||
|
call popup_clear()
|
||||||
|
call popup_create('hello', #{line: 3, col: 5, dragall: 1})
|
||||||
|
endfunc
|
||||||
|
func DragAllDrag()
|
||||||
|
map <silent> <F3> :call test_setmouse(3, 5)<CR>
|
||||||
|
map <silent> <F4> :call test_setmouse(5, 36)<CR>
|
||||||
|
call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
|
||||||
endfunc
|
endfunc
|
||||||
map <silent> <F7> :call test_setmouse(5, 2)<CR>
|
|
||||||
map <silent> <F8> :call test_setmouse(3, 14)<CR>
|
|
||||||
map <silent> <F9> :call test_setmouse(3, 18)<CR>
|
|
||||||
END
|
END
|
||||||
call writefile(lines, 'XtestPopupDrag')
|
call writefile(lines, 'XtestPopupDrag')
|
||||||
let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
|
let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
|
||||||
@ -596,6 +605,12 @@ func Test_popup_drag()
|
|||||||
call term_sendkeys(buf, ":call ClickAndDrag()\<CR>")
|
call term_sendkeys(buf, ":call ClickAndDrag()\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_popupwin_drag_04', {})
|
call VerifyScreenDump(buf, 'Test_popupwin_drag_04', {})
|
||||||
|
|
||||||
|
" dragging without border
|
||||||
|
call term_sendkeys(buf, ":call DragAllStart()\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_popupwin_drag_05', {})
|
||||||
|
call term_sendkeys(buf, ":call DragAllDrag()\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_popupwin_drag_06', {})
|
||||||
|
|
||||||
" clean up
|
" clean up
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
call delete('XtestPopupDrag')
|
call delete('XtestPopupDrag')
|
||||||
|
@ -757,6 +757,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 */
|
||||||
|
/**/
|
||||||
|
3697,
|
||||||
/**/
|
/**/
|
||||||
3696,
|
3696,
|
||||||
/**/
|
/**/
|
||||||
|
13
src/vim.h
13
src/vim.h
@ -638,12 +638,13 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
|
|||||||
#define POPF_HIDDEN 0x02 // popup is not displayed
|
#define POPF_HIDDEN 0x02 // popup is not displayed
|
||||||
#define POPF_CURSORLINE 0x04 // popup is highlighting at the cursorline
|
#define POPF_CURSORLINE 0x04 // popup is highlighting at the cursorline
|
||||||
#define POPF_ON_CMDLINE 0x08 // popup overlaps command line
|
#define POPF_ON_CMDLINE 0x08 // popup overlaps command line
|
||||||
#define POPF_DRAG 0x10 // popup can be moved by dragging
|
#define POPF_DRAG 0x10 // popup can be moved by dragging border
|
||||||
#define POPF_RESIZE 0x20 // popup can be resized by dragging
|
#define POPF_DRAGALL 0x20 // popup can be moved by dragging everywhere
|
||||||
#define POPF_MAPPING 0x40 // mapping keys
|
#define POPF_RESIZE 0x40 // popup can be resized by dragging
|
||||||
#define POPF_INFO 0x80 // used for info of popup menu
|
#define POPF_MAPPING 0x80 // mapping keys
|
||||||
#define POPF_INFO_MENU 0x100 // align info popup with popup menu
|
#define POPF_INFO 0x100 // used for info of popup menu
|
||||||
#define POPF_POSINVERT 0x200 // vertical position can be inverted
|
#define POPF_INFO_MENU 0x200 // align info popup with popup menu
|
||||||
|
#define POPF_POSINVERT 0x400 // vertical position can be inverted
|
||||||
|
|
||||||
// flags used in w_popup_handled
|
// flags used in w_popup_handled
|
||||||
#define POPUP_HANDLED_1 0x01 // used by mouse_find_win()
|
#define POPUP_HANDLED_1 0x01 // used by mouse_find_win()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user