diff src/ui.c @ 17051:221d4b82bc0b v8.1.1525

patch 8.1.1525: cannot move a popup window with the mouse commit https://github.com/vim/vim/commit/b53fb31a1e27a806396e38592055cfb3ebf43cf9 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jun 13 23:59:52 2019 +0200 patch 8.1.1525: cannot move a popup window with the mouse Problem: Cannot move a popup window with the mouse. Solution: Add the "drag" property and make it possible to drag a popup window by its border.
author Bram Moolenaar <Bram@vim.org>
date Fri, 14 Jun 2019 00:00:08 +0200
parents 5ed4965ebc7b
children 3147c7c2e86b
line wrap: on
line diff
--- a/src/ui.c
+++ b/src/ui.c
@@ -1002,7 +1002,7 @@ static void clip_update_modeless_selecti
 
 /*
  * Start, continue or end a modeless selection.  Used when editing the
- * command-line and in the cmdline window.
+ * command-line, in the cmdline window and when the mouse is in a popup window.
  */
     void
 clip_modeless(int button, int is_click, int is_drag)
@@ -2841,7 +2841,8 @@ jump_to_mouse(
     static int  in_winbar = FALSE;
 #endif
 #ifdef FEAT_TEXT_PROP
-    static int  in_popup_win = FALSE;
+    static int   in_popup_win = FALSE;
+    static win_T *popup_dragwin = NULL;
 #endif
     static int	prev_row = -1;
     static int	prev_col = -1;
@@ -2869,6 +2870,9 @@ jump_to_mouse(
 	    flags &= ~(MOUSE_FOCUS | MOUSE_DID_MOVE);
 	dragwin = NULL;
 	did_drag = FALSE;
+#ifdef FEAT_TEXT_PROP
+	popup_dragwin = NULL;
+#endif
     }
 
     if ((flags & MOUSE_DID_MOVE)
@@ -2910,7 +2914,15 @@ retnomove:
 #ifdef FEAT_TEXT_PROP
 	// Continue a modeless selection in a popup window.
 	if (in_popup_win)
+	{
+	    if (popup_dragwin != NULL)
+	    {
+		// dragging a popup window
+		popup_drag(popup_dragwin);
+		return IN_UNKNOWN;
+	    }
 	    return IN_OTHER_WIN;
+	}
 #endif
 	return IN_BUFFER;
     }
@@ -2936,29 +2948,36 @@ retnomove:
 
     if (!(flags & MOUSE_FOCUS))
     {
-	if (row < 0 || col < 0)			/* check if it makes sense */
+	if (row < 0 || col < 0)			// check if it makes sense
 	    return IN_UNKNOWN;
 
-	/* find the window where the row is in */
+	// find the window where the row is in
 	wp = mouse_find_win(&row, &col, FIND_POPUP);
 	if (wp == NULL)
 	    return IN_UNKNOWN;
 	dragwin = NULL;
 
 #ifdef FEAT_TEXT_PROP
-	// Click in a popup window may start modeless selection, but not much
-	// else.
+	// Click in a popup window may start dragging or modeless selection,
+	// but not much else.
 	if (bt_popup(wp->w_buffer))
 	{
 	    on_sep_line = 0;
 	    in_popup_win = TRUE;
+	    if (wp->w_popup_drag && popup_on_border(wp, row, col))
+	    {
+		popup_dragwin = wp;
+		popup_start_drag(wp);
+		return IN_UNKNOWN;
+	    }
 # ifdef FEAT_CLIPBOARD
 	    return IN_OTHER_WIN;
 # else
 	    return IN_UNKNOWN;
 # endif
 	}
-	    in_popup_win = FALSE;
+	in_popup_win = FALSE;
+	popup_dragwin = NULL;
 #endif
 #ifdef FEAT_MENU
 	if (row == -1)
@@ -3127,9 +3146,17 @@ retnomove:
 	    return IN_OTHER_WIN;
 #endif
 #ifdef FEAT_TEXT_PROP
-	// Continue a modeless selection in a popup window.
 	if (in_popup_win)
+	{
+	    if (popup_dragwin != NULL)
+	    {
+		// dragging a popup window
+		popup_drag(popup_dragwin);
+		return IN_UNKNOWN;
+	    }
+	    // continue a modeless selection in a popup window
 	    return IN_OTHER_WIN;
+	}
 #endif
 
 	row -= W_WINROW(curwin);