diff src/popupwin.c @ 18432:ee8db42dacf6 v8.1.2210

patch 8.1.2210: using negative offset for popup_create() does not work Commit: https://github.com/vim/vim/commit/b754b5bf6d9ac1f3654552973aa6f9c11239af3d Author: Bram Moolenaar <Bram@vim.org> Date: Thu Oct 24 19:25:00 2019 +0200 patch 8.1.2210: using negative offset for popup_create() does not work Problem: Using negative offset for popup_create() does not work. Solution: Use -1 instead of zero. (closes https://github.com/vim/vim/issues/5111)
author Bram Moolenaar <Bram@vim.org>
date Thu, 24 Oct 2019 19:30:03 +0200
parents 21c25bee9df8
children 144fa40ee706
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -71,8 +71,9 @@ popup_options_one(dict_T *dict, char_u *
     else // "col"
 	n = screen_screencol() + 1 + n;
 
-    if (n < 1)
-	n = 1;
+    // Zero means "not set", use -1 instead.
+    if (n == 0)
+	n = -1;
     return n;
 }
 
@@ -222,7 +223,7 @@ popup_start_drag(win_T *wp, int row, int
 {
     drag_start_row = mouse_row;
     drag_start_col = mouse_col;
-    if (wp->w_wantline == 0)
+    if (wp->w_wantline <= 0)
 	drag_start_wantline = wp->w_winrow + 1;
     else
 	drag_start_wantline = wp->w_wantline;
@@ -1081,7 +1082,9 @@ popup_adjust_position(win_T *wp)
     int		org_leftoff = wp->w_popup_leftoff;
     int		minwidth;
     int		wantline = wp->w_wantline;  // adjusted for textprop
+    int		use_wantline = wantline != 0;
     int		wantcol = wp->w_wantcol;    // adjusted for textprop
+    int		use_wantcol = wantcol != 0;
 
     wp->w_winrow = 0;
     wp->w_wincol = 0;
@@ -1097,6 +1100,11 @@ popup_adjust_position(win_T *wp)
     // If no line was specified default to vertical centering.
     if (wantline == 0)
 	center_vert = TRUE;
+    else if (wantline < 0)
+	// If "wantline" is negative it actually means zero.
+	wantline = 0;
+    if (wantcol < 0)
+	wantcol = 0;
 
     if (wp->w_popup_prop_type > 0 && win_valid(wp->w_popup_prop_win))
     {
@@ -1161,7 +1169,7 @@ popup_adjust_position(win_T *wp)
     }
     else
     {
-	if (wantline > 0 && (wp->w_popup_pos == POPPOS_TOPLEFT
+	if (use_wantline && (wp->w_popup_pos == POPPOS_TOPLEFT
 		|| wp->w_popup_pos == POPPOS_TOPRIGHT))
 	{
 	    wp->w_winrow = wantline - 1;
@@ -1169,7 +1177,7 @@ popup_adjust_position(win_T *wp)
 		wp->w_winrow = Rows - 1;
 	}
 
-	if (wantcol == 0)
+	if (!use_wantcol)
 	    center_hor = TRUE;
 	else if (wantcol > 0 && (wp->w_popup_pos == POPPOS_TOPLEFT
 		|| wp->w_popup_pos == POPPOS_BOTLEFT))
@@ -1372,8 +1380,8 @@ popup_adjust_position(win_T *wp)
 	    // bottom aligned: may move down
 	    wp->w_winrow = wantline - (wp->w_height + extra_height);
 	else
-	    // not enough space, make top aligned
-	    wp->w_winrow = wantline + 1;
+	    // Not enough space, make top aligned.
+	    wp->w_winrow = (wantline < 0 ? 0 : wantline) + 1;
     }
     if (wp->w_winrow >= Rows)
 	wp->w_winrow = Rows - 1;