]> granicus.if.org Git - vim/commitdiff
patch 8.2.3697: cannot drag a popup without a border v8.2.3697
authorBram Moolenaar <Bram@vim.org>
Mon, 29 Nov 2021 17:38:02 +0000 (17:38 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 29 Nov 2021 17:38:02 +0000 (17:38 +0000)
Problem:    Cannot drag a popup without a border.
Solution:   Add the "dragall" option. (closes #9218)

runtime/doc/popup.txt
src/mouse.c
src/popupwin.c
src/testdir/dumps/Test_popupwin_drag_05.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_drag_06.dump [new file with mode: 0644]
src/testdir/test_popupwin.vim
src/version.c
src/vim.h

index af7dc7098156ae63fe10eb366d9d2375951f96fd..904abe73b104ea28bc389067aae13a13c6170b53 100644 (file)
@@ -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
                        starts and "pos" is "center" it is changed to
                        "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
                        by grabbing at the bottom right corner.  Has no effect
                        if the popup does not have a border.
index 77de8d584208834a78727f194967133bdc5b021c..6a32cac9d0b06c314d2763e8bf9994b834be064c 100644 (file)
@@ -1636,8 +1636,9 @@ retnomove:
            {
                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))
+                                      || (wp->w_popup_flags & POPF_DRAGALL))
            {
                popup_dragwin = wp;
                popup_start_drag(wp, row, col);
index 0ff26e1a24175e3b9f116e1d57d7e14592d1d80c..4b8b74102cbdae7f3e748a9d203d951a96d31181 100644 (file)
@@ -297,7 +297,7 @@ popup_drag(win_T *wp)
        return;
     }
 
-    if (!(wp->w_popup_flags & POPF_DRAG))
+    if (!(wp->w_popup_flags & (POPF_DRAG | POPF_DRAGALL)))
        return;
     wp->w_wantline = drag_start_wantline + (mouse_row - drag_start_row);
     if (wp->w_wantline < 1)
@@ -687,6 +687,14 @@ apply_general_options(win_T *wp, dict_T *dict)
        else
            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);
     if (nr != -1)
@@ -2358,7 +2366,7 @@ filter_handle_drag(win_T *wp, int c, typval_T *rettv)
     int        row = mouse_row;
     int        col = mouse_col;
 
-    if ((wp->w_popup_flags & POPF_DRAG)
+    if ((wp->w_popup_flags & (POPF_DRAG | POPF_DRAGALL))
            && is_mouse_key(c)
            && (wp == popup_dragwin
                          || 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_number(dict, "wrap", wp->w_p_wrap);
        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",
                                      (wp->w_popup_flags & POPF_MAPPING) != 0);
        dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
diff --git a/src/testdir/dumps/Test_popupwin_drag_05.dump b/src/testdir/dumps/Test_popupwin_drag_05.dump
new file mode 100644 (file)
index 0000000..3ca5513
--- /dev/null
@@ -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
diff --git a/src/testdir/dumps/Test_popupwin_drag_06.dump b/src/testdir/dumps/Test_popupwin_drag_06.dump
new file mode 100644 (file)
index 0000000..702f051
--- /dev/null
@@ -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
index 3b38102ddb21d61fc4468af8198951df1d6e4b82..45883b1e83338fb6c249cd94006d9e3a411a5d34 100644 (file)
@@ -565,22 +565,31 @@ func Test_popup_drag()
              \ line: &lines - 4,
              \ })
        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")
        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()
+         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")
        endfunc
-       map <silent> <F5> :call test_setmouse(6, 21)<CR>
-       map <silent> <F6> :call test_setmouse(7, 25)<CR>
        func ClickAndDrag()
-         call feedkeys("\<F7>\<LeftMouse>\<LeftRelease>", "xt")
-         call feedkeys("\<F8>\<LeftMouse>\<F9>\<LeftDrag>\<LeftRelease>", "xt")
+         map <silent> <F3> :call test_setmouse(5, 2)<CR>
+         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
-       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
   call writefile(lines, 'XtestPopupDrag')
   let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
@@ -596,6 +605,12 @@ func Test_popup_drag()
   call term_sendkeys(buf, ":call ClickAndDrag()\<CR>")
   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
   call StopVimInTerminal(buf)
   call delete('XtestPopupDrag')
index 954ea5b4f380089107ed09f3639306a4348690ce..b4eda3ec9ea135ae6d13820bf77587c56c55eb01 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3697,
 /**/
     3696,
 /**/
index 7c4d12c93d874070f3277c815305014d244227a8..c4f6f15d65f70ab856f83bfd259b9d6b5bab84b5 100644 (file)
--- a/src/vim.h
+++ b/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_CURSORLINE        0x04    // popup is highlighting at the cursorline
 #define POPF_ON_CMDLINE        0x08    // popup overlaps command line
-#define POPF_DRAG      0x10    // popup can be moved by dragging
-#define POPF_RESIZE    0x20    // popup can be resized by dragging
-#define POPF_MAPPING   0x40    // mapping keys
-#define POPF_INFO      0x80    // used for info of popup menu
-#define POPF_INFO_MENU 0x100   // align info popup with popup menu
-#define POPF_POSINVERT 0x200   // vertical position can be inverted
+#define POPF_DRAG      0x10    // popup can be moved by dragging border
+#define POPF_DRAGALL   0x20    // popup can be moved by dragging everywhere
+#define POPF_RESIZE    0x40    // popup can be resized by dragging
+#define POPF_MAPPING   0x80    // mapping keys
+#define POPF_INFO      0x100   // used for info of popup menu
+#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
 #define POPUP_HANDLED_1            0x01    // used by mouse_find_win()