]> granicus.if.org Git - vim/commitdiff
patch 8.1.1652: GUI: popup window doesn't close on mouse movement v8.1.1652
authorBram Moolenaar <Bram@vim.org>
Mon, 8 Jul 2019 19:57:30 +0000 (21:57 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 8 Jul 2019 19:57:30 +0000 (21:57 +0200)
Problem:    GUI: popup window doesn't close on mouse movement. (Paul Jolly)
Solution:   Generate mouse-move events when a popup window is visible.

src/globals.h
src/gui.c
src/version.c

index ddafcc13dfa39df513393e9d24cdb07ed4bd583d..3562b5ee6cd756e9c2b0555f4932490f611e10f6 100644 (file)
@@ -603,6 +603,11 @@ EXTERN int aucmd_win_used INIT(= FALSE);   /* aucmd_win is being used */
 #ifdef FEAT_TEXT_PROP
 EXTERN win_T    *first_popupwin;               // first global popup window
 EXTERN win_T   *popup_dragwin INIT(= NULL);    // popup window being dragged
+
+// Set to TRUE if there is any visible popup.
+EXTERN int     popup_visible INIT(= FALSE);
+
+EXTERN int     text_prop_frozen INIT(= 0);
 #endif
 
 /*
@@ -1680,10 +1685,3 @@ typedef int HINSTANCE;
 EXTERN int ctrl_break_was_pressed INIT(= FALSE);
 EXTERN HINSTANCE g_hinst INIT(= NULL);
 #endif
-
-#ifdef FEAT_TEXT_PROP
-EXTERN int text_prop_frozen INIT(= 0);
-
-// Set to TRUE if there is any visible popup.
-EXTERN int popup_visible INIT(= FALSE);
-#endif
index 7c378c6fe16e74d93f4015867faa6cc75cfdbb2c..5dcab515aefbd09bd4b59d4da991c3fd220d33c6 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -4823,18 +4823,15 @@ gui_focus_change(int in_focus)
 }
 
 /*
- * Called when the mouse moved (but not when dragging).
+ * When mouse moved: apply 'mousefocus'.
+ * Also updates the mouse pointer shape.
  */
-    void
-gui_mouse_moved(int x, int y)
+    static void
+gui_mouse_focus(int x, int y)
 {
     win_T      *wp;
     char_u     st[8];
 
-    /* Ignore this while still starting up. */
-    if (!gui.in_use || gui.starting)
-       return;
-
 #ifdef FEAT_MOUSESHAPE
     /* Get window pointer, and update mouse shape as well. */
     wp = xy2win(x, y);
@@ -4893,6 +4890,27 @@ gui_mouse_moved(int x, int y)
     }
 }
 
+/*
+ * Called when the mouse moved (but not when dragging).
+ */
+    void
+gui_mouse_moved(int x, int y)
+{
+    // Ignore this while still starting up.
+    if (!gui.in_use || gui.starting)
+       return;
+
+    // apply 'mousefocus' and pointer shape
+    gui_mouse_focus(x, y);
+
+#ifdef FEAT_TEXT_PROP
+    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);
+#endif
+}
+
 /*
  * Called when mouse should be moved to window with focus.
  */
index cbfee049c8d8aabffcd917972fe3a27329369c51..50615798e2cbb72cbbb875bbf72bac0db135696e 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1652,
 /**/
     1651,
 /**/