diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-02 15:32:16 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-02 15:32:16 +0100 |
commit | eabddc425ea23fb91b3b0058ff01e9e4ede53351 (patch) | |
tree | 6309cd6ad8131fbc522749e7f9df2b0242cc5981 /src/popupwin.c | |
parent | c1658a196bb05dd96562fd0a92409be2201b62e9 (diff) |
patch 8.2.4665: popup with "minwidth" and scrollbar not updated properlyv8.2.4665
Problem: Popup with "minwidth" and scrollbar not updated properly.
Solution: Adjust the computation if the window width. (closes #10061)
Diffstat (limited to 'src/popupwin.c')
-rw-r--r-- | src/popupwin.c | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/src/popupwin.c b/src/popupwin.c index 55f98f8a6f..883372c47f 100644 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -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 |