diff src/popupwin.c @ 17580:d5e5d0fc3fa8 v8.1.1787

patch 8.1.1787: cannot resize a popup window commit https://github.com/vim/vim/commit/9bcb70c18a740bf9d97a1420df5964618f218a89 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Aug 1 21:11:05 2019 +0200 patch 8.1.1787: cannot resize a popup window Problem: Cannot resize a popup window. Solution: Allow for resizing by dragging the lower right corncer.
author Bram Moolenaar <Bram@vim.org>
date Thu, 01 Aug 2019 21:15:07 +0200
parents 696030820746
children 65a8099fc0e8
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -235,13 +235,14 @@ static int drag_start_row;
 static int drag_start_col;
 static int drag_start_wantline;
 static int drag_start_wantcol;
+static int drag_on_resize_handle;
 
 /*
  * Mouse down on border of popup window: start dragging it.
  * Uses mouse_col and mouse_row.
  */
     void
-popup_start_drag(win_T *wp)
+popup_start_drag(win_T *wp, int row, int col)
 {
     drag_start_row = mouse_row;
     drag_start_col = mouse_col;
@@ -258,10 +259,26 @@ popup_start_drag(win_T *wp)
     // Stop centering the popup
     if (wp->w_popup_pos == POPPOS_CENTER)
 	wp->w_popup_pos = POPPOS_TOPLEFT;
+
+    drag_on_resize_handle = wp->w_popup_border[1] > 0
+			    && wp->w_popup_border[2] > 0
+			    && row == popup_height(wp) - 1
+			    && col == popup_width(wp) - 1;
+
+    if (wp->w_popup_pos != POPPOS_TOPLEFT && drag_on_resize_handle)
+    {
+	if (wp->w_popup_pos == POPPOS_TOPRIGHT
+		|| wp->w_popup_pos == POPPOS_BOTRIGHT)
+	    wp->w_wantcol = wp->w_wincol + 1;
+	if (wp->w_popup_pos == POPPOS_BOTLEFT)
+	    wp->w_wantline = wp->w_winrow + 1;
+	wp->w_popup_pos = POPPOS_TOPLEFT;
+    }
 }
 
 /*
- * Mouse moved while dragging a popup window: adjust the window popup position.
+ * Mouse moved while dragging a popup window: adjust the window popup position
+ * or resize.
  */
     void
 popup_drag(win_T *wp)
@@ -270,6 +287,39 @@ popup_drag(win_T *wp)
     if (!win_valid_popup(wp))
 	return;
 
+    if ((wp->w_popup_flags & POPF_RESIZE) && drag_on_resize_handle)
+    {
+	int width_inc = mouse_col - drag_start_col;
+	int height_inc = mouse_row - drag_start_row;
+
+	if (width_inc != 0)
+	{
+	    int width = wp->w_width + width_inc;
+
+	    if (width < 1)
+		width = 1;
+	    wp->w_minwidth = width;
+	    wp->w_maxwidth = width;
+	    drag_start_col = mouse_col;
+	}
+
+	if (height_inc != 0)
+	{
+	    int height = wp->w_height + height_inc;
+
+	    if (height < 1)
+		height = 1;
+	    wp->w_minheight = height;
+	    wp->w_maxheight = height;
+	    drag_start_row = mouse_row;
+	}
+
+	popup_adjust_position(wp);
+	return;
+    }
+
+    if (!(wp->w_popup_flags & POPF_DRAG))
+	return;
     wp->w_wantline = drag_start_wantline + (mouse_row - drag_start_row);
     if (wp->w_wantline < 1)
 	wp->w_wantline = 1;
@@ -550,7 +600,23 @@ apply_general_options(win_T *wp, dict_T 
 
     di = dict_find(dict, (char_u *)"drag", -1);
     if (di != NULL)
-	wp->w_popup_drag = dict_get_number(dict, (char_u *)"drag");
+    {
+	nr = dict_get_number(dict, (char_u *)"drag");
+	if (nr)
+	    wp->w_popup_flags |= POPF_DRAG;
+	else
+	    wp->w_popup_flags &= ~POPF_DRAG;
+    }
+
+    di = dict_find(dict, (char_u *)"resize", -1);
+    if (di != NULL)
+    {
+	nr = dict_get_number(dict, (char_u *)"resize");
+	if (nr)
+	    wp->w_popup_flags |= POPF_RESIZE;
+	else
+	    wp->w_popup_flags &= ~POPF_RESIZE;
+    }
 
     di = dict_find(dict, (char_u *)"close", -1);
     if (di != NULL)
@@ -1477,7 +1543,7 @@ popup_create(typval_T *argvars, typval_T
 	wp->w_wantcol = 10;
 	wp->w_zindex = POPUPWIN_NOTIFICATION_ZINDEX;
 	wp->w_minwidth = 20;
-	wp->w_popup_drag = 1;
+	wp->w_popup_flags |= POPF_DRAG;
 	wp->w_popup_close = POPCLOSE_CLICK;
 	for (i = 0; i < 4; ++i)
 	    wp->w_popup_border[i] = 1;
@@ -1494,7 +1560,7 @@ popup_create(typval_T *argvars, typval_T
     {
 	wp->w_popup_pos = POPPOS_CENTER;
 	wp->w_zindex = POPUPWIN_DIALOG_ZINDEX;
-	wp->w_popup_drag = 1;
+	wp->w_popup_flags |= POPF_DRAG;
 	for (i = 0; i < 4; ++i)
 	{
 	    wp->w_popup_border[i] = 1;
@@ -1519,7 +1585,7 @@ popup_create(typval_T *argvars, typval_T
 
     if (type == TYPE_PREVIEW)
     {
-	wp->w_popup_drag = 1;
+	wp->w_popup_flags |= POPF_DRAG | POPF_RESIZE;
 	wp->w_popup_close = POPCLOSE_BUTTON;
 	for (i = 0; i < 4; ++i)
 	    wp->w_popup_border[i] = 1;
@@ -1707,7 +1773,7 @@ filter_handle_drag(win_T *wp, int c, typ
     int	row = mouse_row;
     int	col = mouse_col;
 
-    if (wp->w_popup_drag
+    if ((wp->w_popup_flags & POPF_DRAG)
 	    && is_mouse_key(c)
 	    && (wp == popup_dragwin
 			  || wp == mouse_find_win(&row, &col, FIND_POPUP)))
@@ -2244,7 +2310,8 @@ f_popup_getoptions(typval_T *argvars, ty
 	dict_add_number(dict, "fixed", wp->w_popup_fixed);
 	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_drag);
+	dict_add_number(dict, "drag", (wp->w_popup_flags & POPF_DRAG) != 0);
+	dict_add_number(dict, "resize", (wp->w_popup_flags & POPF_RESIZE) != 0);
 	dict_add_number(dict, "cursorline",
 				   (wp->w_popup_flags & POPF_CURSORLINE) != 0);
 	dict_add_string(dict, "highlight", wp->w_p_wcr);
@@ -2811,7 +2878,8 @@ update_popups(void (*win_update)(win_T *
 	    border_char[1] = border_char[3] = 0x2551;
 	    border_char[4] = 0x2554;
 	    border_char[5] = 0x2557;
-	    border_char[6] = 0x255d;
+	    border_char[6] = (wp->w_popup_flags & POPF_RESIZE)
+							     ? 0x21f2 : 0x255d;
 	    border_char[7] = 0x255a;
 	}
 	else
@@ -2820,6 +2888,8 @@ update_popups(void (*win_update)(win_T *
 	    border_char[1] = border_char[3] = '|';
 	    for (i = 4; i < 8; ++i)
 		border_char[i] = '+';
+	    if (wp->w_popup_flags & POPF_RESIZE)
+		border_char[6] = '@';
 	}
 	for (i = 0; i < 8; ++i)
 	    if (wp->w_border_char[i] != 0)