]> granicus.if.org Git - vim/commitdiff
patch 8.2.2963: GUI: mouse move may start Visual mode with a popup visible v8.2.2963
authorBram Moolenaar <Bram@vim.org>
Tue, 8 Jun 2021 18:13:31 +0000 (20:13 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 8 Jun 2021 18:13:31 +0000 (20:13 +0200)
Problem:    GUI: mouse move may start Visual mode with a popup visible.
Solution:   Add special code for mouse move. (closes #8318)

src/gui.c
src/keymap.h
src/term.c
src/version.c
src/vim.h

index 2539a4f6422764b0d40fcc969ac8dd6b0782914a..b5ec007405f411125c7592daba67f2233ee3c150 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -3071,6 +3071,9 @@ gui_send_mouse_event(
      */
     switch (button)
     {
+       case MOUSE_MOVE:
+           button_char = KE_MOUSEMOVE_XY;
+           goto button_set;
        case MOUSE_X1:
            button_char = KE_X1MOUSE;
            goto button_set;
@@ -4925,7 +4928,7 @@ gui_mouse_moved(int x, int y)
     if (popup_visible)
        // Generate a mouse-moved event, so that the popup can perhaps be
        // closed, just like in the terminal.
-       gui_send_mouse_event(MOUSE_DRAG, x, y, FALSE, 0);
+       gui_send_mouse_event(MOUSE_MOVE, x, y, FALSE, 0);
 #endif
 }
 
index 6efb13d0651badc50b10382ca7f39c525d440c18..4ce5144d15ef7202748d00d8d04c3dcfa1adf6e6 100644 (file)
@@ -273,8 +273,9 @@ enum key_extra
     , KE_FOCUSGAINED = 98      // focus gained
     , KE_FOCUSLOST = 99                // focus lost
     , KE_MOUSEMOVE = 100       // mouse moved with no button down
-    , KE_CANCEL = 101          // return from vgetc()
-    , KE_COMMAND = 102         // <Cmd> special key
+    , KE_MOUSEMOVE_XY = 101    // KE_MOUSEMOVE with coordinates
+    , KE_CANCEL = 102          // return from vgetc()
+    , KE_COMMAND = 103         // <Cmd> special key
 };
 
 /*
index 99b33d4399c0442ce502b704d626150409cde184..cec16b608a25d89e254dea064a4421ed03b504cd 100644 (file)
@@ -5588,6 +5588,7 @@ check_termcode(
                && key_name[0] == (int)KS_EXTRA
                && (key_name[1] == (int)KE_X1MOUSE
                    || key_name[1] == (int)KE_X2MOUSE
+                   || key_name[1] == (int)KE_MOUSEMOVE_XY
                    || key_name[1] == (int)KE_MOUSELEFT
                    || key_name[1] == (int)KE_MOUSERIGHT
                    || key_name[1] == (int)KE_MOUSEDOWN
@@ -5601,6 +5602,9 @@ check_termcode(
            mouse_col = 128 * (bytes[0] - ' ' - 1) + bytes[1] - ' ' - 1;
            mouse_row = 128 * (bytes[2] - ' ' - 1) + bytes[3] - ' ' - 1;
            slen += num_bytes;
+           // equal to K_MOUSEMOVE
+           if (key_name[1] == (int)KE_MOUSEMOVE_XY)
+               key_name[1] = (int)KE_MOUSEMOVE;
        }
        else
 #endif
index 08cb9c98e828478659ae4ef53db266c07d773c57..cea97e8c5ef8b792d26b179ced2a1fec35f430ac 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2963,
 /**/
     2962,
 /**/
index 10f032f2b264fe831b152ebadc16e200dcb74214..61afe9730962d9a111df38be49037d7e79826b87 100644 (file)
--- a/src/vim.h
+++ b/src/vim.h
@@ -1859,6 +1859,8 @@ typedef int sock_T;
 #define MOUSE_6        0x500   // scroll wheel left
 #define MOUSE_7        0x600   // scroll wheel right
 
+#define MOUSE_MOVE 0x700    // report mouse moved
+
 // 0x20 is reserved by xterm
 #define MOUSE_DRAG_XTERM   0x40