diff src/popupwin.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 6400d1ad5e4b
children f4de7ccdfd8c
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -164,6 +164,68 @@ set_moved_columns(win_T *wp, int flags)
     }
 }
 
+/*
+ * Return TRUE if "row"/"col" is on the border of the popup.
+ * The values are relative to the top-left corner.
+ */
+    int
+popup_on_border(win_T *wp, int row, int col)
+{
+    return (row == 0 && wp->w_popup_border[0] > 0)
+	    || (row == popup_height(wp) - 1 && wp->w_popup_border[2] > 0)
+	    || (col == 0 && wp->w_popup_border[3] > 0)
+	    || (col == popup_width(wp) - 1 && wp->w_popup_border[1] > 0);
+}
+
+// Values set when dragging a popup window starts.
+static int drag_start_row;
+static int drag_start_col;
+static int drag_start_wantline;
+static int drag_start_wantcol;
+
+/*
+ * Mouse down on border of popup window: start dragging it.
+ * Uses mouse_col and mouse_row.
+ */
+    void
+popup_start_drag(win_T *wp)
+{
+    drag_start_row = mouse_row;
+    drag_start_col = mouse_col;
+    // TODO: handle using different corner
+    if (wp->w_wantline == 0)
+	drag_start_wantline = wp->w_winrow + 1;
+    else
+	drag_start_wantline = wp->w_wantline;
+    if (wp->w_wantcol == 0)
+	drag_start_wantcol = wp->w_wincol + 1;
+    else
+	drag_start_wantcol = wp->w_wantcol;
+}
+
+/*
+ * Mouse moved while dragging a popup window: adjust the window popup position.
+ */
+    void
+popup_drag(win_T *wp)
+{
+    // The popup may be closed before dragging stops.
+    if (!win_valid_popup(wp))
+	return;
+
+    wp->w_wantline = drag_start_wantline + (mouse_row - drag_start_row);
+    if (wp->w_wantline < 1)
+	wp->w_wantline = 1;
+    if (wp->w_wantline > Rows)
+	wp->w_wantline = Rows;
+    wp->w_wantcol = drag_start_wantcol + (mouse_col - drag_start_col);
+    if (wp->w_wantcol < 1)
+	wp->w_wantcol = 1;
+    if (wp->w_wantcol > Columns)
+	wp->w_wantcol = Columns;
+
+    popup_adjust_position(wp);
+}
 
 #if defined(FEAT_TIMERS)
     static void
@@ -237,6 +299,8 @@ apply_options(win_T *wp, buf_T *buf UNUS
 	wp->w_p_wrap = nr != 0;
     }
 
+    wp->w_popup_drag = dict_get_number(dict, (char_u *)"drag");
+
     di = dict_find(dict, (char_u *)"callback", -1);
     if (di != NULL)
     {
@@ -798,6 +862,7 @@ popup_create(typval_T *argvars, typval_T
 	wp->w_popup_padding[3] = 1;
 	set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1,
 				(char_u *)"WarningMsg", OPT_FREE|OPT_LOCAL, 0);
+	wp->w_popup_drag = 1;
     }
 
     // Deal with options.