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:
@@ -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
|
||||
|
Reference in New Issue
Block a user