1
0
forked from aniani/vim

patch 8.2.4665: popup with "minwidth" and scrollbar not updated properly

Problem:    Popup with "minwidth" and scrollbar not updated properly.
Solution:   Adjust the computation if the window width. (closes #10061)
This commit is contained in:
Bram Moolenaar
2022-04-02 15:32:16 +01:00
parent c1658a196b
commit eabddc425e
12 changed files with 145 additions and 41 deletions

View File

@@ -1149,6 +1149,8 @@ popup_adjust_position(win_T *wp)
linenr_T lnum;
int wrapped = 0;
int maxwidth;
int maxwidth_no_scrollbar;
int width_with_scrollbar = 0;
int used_maxwidth = FALSE;
int margin_width = 0;
int maxspace;
@@ -1421,6 +1423,7 @@ popup_adjust_position(win_T *wp)
// Terminal window never has a scrollbar, adjusts to window height.
wp->w_has_scrollbar = FALSE;
#endif
maxwidth_no_scrollbar = maxwidth;
if (wp->w_has_scrollbar)
{
++right_extra;
@@ -1447,7 +1450,27 @@ popup_adjust_position(win_T *wp)
if (wp->w_width > maxspace && !wp->w_p_wrap)
// some columns cut off on the right
wp->w_popup_rightoff = wp->w_width - maxspace;
wp->w_width = maxwidth;
// If the window doesn't fit because 'minwidth' is set then the
// scrollbar is at the far right of the screen, use the size without
// the scrollbar.
if (wp->w_has_scrollbar && wp->w_minwidth > 0)
{
int off = wp->w_width - maxwidth;
if (off > right_extra)
extra_width -= right_extra;
else
extra_width -= off;
wp->w_width = maxwidth_no_scrollbar;
}
else
{
wp->w_width = maxwidth;
// when adding a scrollbar below need to adjust the width
width_with_scrollbar = maxwidth_no_scrollbar - right_extra;
}
}
if (center_hor)
{
@@ -1535,7 +1558,8 @@ popup_adjust_position(win_T *wp)
else if (wp->w_popup_pos == POPPOS_TOPRIGHT
|| wp->w_popup_pos == POPPOS_TOPLEFT)
{
if (wantline + (wp->w_height + extra_height) - 1 > Rows
if (wp != popup_dragwin
&& wantline + (wp->w_height + extra_height) - 1 > Rows
&& wantline * 2 > Rows
&& (wp->w_popup_flags & POPF_POSINVERT))
{
@@ -1565,7 +1589,11 @@ popup_adjust_position(win_T *wp)
#ifdef FEAT_TERMINAL
if (wp->w_buffer->b_term == NULL)
#endif
{
wp->w_has_scrollbar = TRUE;
if (width_with_scrollbar > 0)
wp->w_width = width_with_scrollbar;
}
}
// make sure w_winrow is valid
@@ -3894,7 +3922,7 @@ update_popups(void (*win_update)(win_T *wp))
wp->w_flags |= WFLAG_WROW_OFF_ADDED;
}
total_width = popup_width(wp);
total_width = popup_width(wp) - wp->w_popup_rightoff;
total_height = popup_height(wp);
popup_attr = get_wcr_attr(wp);
@@ -3989,7 +4017,7 @@ update_popups(void (*win_update)(win_T *wp))
? border_char[4] : border_char[0],
border_char[0], border_attr[0]);
}
if (wp->w_popup_border[1] > 0 && wp->w_popup_rightoff == 0)
if (wp->w_popup_border[1] > 0)
{
buf[mb_char2bytes(border_char[5], buf)] = NUL;
screen_puts(buf, wp->w_winrow,
@@ -4039,7 +4067,7 @@ update_popups(void (*win_update)(win_T *wp))
--sb_thumb_height; // scrolled, no full thumb
if (sb_thumb_height == 0)
sb_thumb_height = 1;
if (linecount <= wp->w_height)
if (linecount <= wp->w_height || wp->w_height == 0)
// it just fits, avoid divide by zero
sb_thumb_top = 0;
else