summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-06-28 04:06:50 +0200
committerBram Moolenaar <Bram@vim.org>2019-06-28 04:06:50 +0200
commit711d02c96da996e3423a6518909687e1d45ce45a (patch)
tree67b534fc0ca4f4f3ea6cab47b0d4208487a3c9ad
parent8da41816316f17382817df3f9449b55df8d39651 (diff)
patch 8.1.1602: popup window cannot overflow on the left or rightv8.1.1602
Problem: Popup window cannot overflow on the left or right. Solution: Only set the "fixed" option when it is in the dict. Set w_leftcol to allow for the popup overflowing on the left and use it when applying the mask.
-rw-r--r--src/popupwin.c32
-rw-r--r--src/version.c2
2 files changed, 30 insertions, 4 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 5aab84a4aa..aa0bda3c96 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -78,6 +78,7 @@ get_pos_options(win_T *wp, dict_T *dict)
{
char_u *str;
int nr;
+ dictitem_T *di;
nr = popup_options_one(dict, (char_u *)"line");
if (nr > 0)
@@ -86,7 +87,9 @@ get_pos_options(win_T *wp, dict_T *dict)
if (nr > 0)
wp->w_wantcol = nr;
- wp->w_popup_fixed = dict_get_number(dict, (char_u *)"fixed") != 0;
+ di = dict_find(dict, (char_u *)"fixed", -1);
+ if (di != NULL)
+ wp->w_popup_fixed = dict_get_number(dict, (char_u *)"fixed") != 0;
str = dict_get_string(dict, (char_u *)"pos", FALSE);
if (str != NULL)
@@ -666,10 +669,12 @@ popup_adjust_position(win_T *wp)
int org_wincol = wp->w_wincol;
int org_width = wp->w_width;
int org_height = wp->w_height;
+ int org_leftcol = wp->w_leftcol;
int minwidth;
wp->w_winrow = 0;
wp->w_wincol = 0;
+ wp->w_leftcol = 0;
if (wp->w_popup_pos == POPPOS_CENTER)
{
// center after computing the size
@@ -785,10 +790,21 @@ popup_adjust_position(win_T *wp)
else if (wp->w_popup_pos == POPPOS_BOTRIGHT
|| wp->w_popup_pos == POPPOS_TOPRIGHT)
{
+ int leftoff = wp->w_wantcol - (wp->w_width + extra_width);
+
// Right aligned: move to the right if needed.
// No truncation, because that would change the height.
- if (wp->w_width + extra_width < wp->w_wantcol)
- wp->w_wincol = wp->w_wantcol - (wp->w_width + extra_width);
+ if (leftoff >= 0)
+ wp->w_wincol = leftoff;
+ else if (wp->w_popup_fixed)
+ {
+ // "col" specifies the right edge, but popup doesn't fit, skip some
+ // columns when displaying the window.
+ wp->w_leftcol = -leftoff;
+ wp->w_width += leftoff;
+ if (wp->w_width < 0)
+ wp->w_width = 0;
+ }
}
wp->w_height = wp->w_buffer->b_ml.ml_line_count - wp->w_topline
@@ -823,6 +839,7 @@ popup_adjust_position(win_T *wp)
// And redraw windows that were behind the popup.
if (org_winrow != wp->w_winrow
|| org_wincol != wp->w_wincol
+ || org_leftcol != wp->w_leftcol
|| org_width != wp->w_width
|| org_height != wp->w_height)
{
@@ -1078,6 +1095,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
for (i = 0; i < 8; ++i)
wp->w_border_char[i] = 0;
wp->w_want_scrollbar = 1;
+ wp->w_popup_fixed = 0;
// Deal with options.
apply_options(wp, argvars[1].vval.v_dict);
@@ -1909,7 +1927,7 @@ popup_check_cursor_pos()
static int
popup_masked(win_T *wp, int screencol, int screenline)
{
- int col = screencol - wp->w_wincol + 1;
+ int col = screencol - wp->w_wincol + 1 + wp->w_leftcol;
int line = screenline - wp->w_winrow + 1;
listitem_T *lio, *li;
int width, height;
@@ -1988,7 +2006,13 @@ update_popup_transparent(win_T *wp, int val)
linee = height + linee + 1;
--cols;
+ cols -= wp->w_leftcol;
+ if (cols < 0)
+ cols = 0;
+ cole -= wp->w_leftcol;
--lines;
+ if (lines < 0)
+ lines = 0;
for (line = lines; line < linee && line < screen_Rows; ++line)
for (col = cols; col < cole && col < screen_Columns; ++col)
popup_transparent[(line + wp->w_winrow) * screen_Columns
diff --git a/src/version.c b/src/version.c
index 55c62dfde8..d44171dc67 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1602,
+/**/
1601,
/**/
1600,