Mercurial > vim
changeset 24275:6062e10a7e72 v8.2.2679
patch 8.2.2679: status line missing for non-current window with winbar
Commit: https://github.com/vim/vim/commit/ae0f151ddf76dcbb233cff02282deb4f98a355ec
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Mar 30 22:12:12 2021 +0200
patch 8.2.2679: status line missing for non-current window with winbar
Problem: Winbar drawn over status line for non-current window with winbar
if frame is zero height. (Leonid V. Fedorenchik)
Solution: Do not draw the window if the frame height is zero. (closes #8037)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 30 Mar 2021 22:15:03 +0200 |
parents | c5881745ef8e |
children | bce682a71e04 |
files | src/drawscreen.c src/testdir/dumps/Test_winbar_not_visible.dump src/testdir/test_winbar.vim src/version.c |
diffstat | 4 files changed, 57 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -378,6 +378,20 @@ update_screen(int type_arg) } /* + * Return the row for drawing the statusline and the ruler of window "wp". + */ + static int +statusline_row(win_T *wp) +{ +#if defined(FEAT_PROP_POPUP) + // If the window is really zero height the winbar isn't displayed. + if (wp->w_frame->fr_height == wp->w_status_height && !popup_is_popup(wp)) + return wp->w_winrow; +#endif + return W_WINROW(wp) + wp->w_height; +} + +/* * Redraw the status line of window wp. * * If inversion is possible we use it. Else '=' characters are used. @@ -401,6 +415,8 @@ win_redr_status(win_T *wp, int ignore_pu return; busy = TRUE; + row = statusline_row(wp); + wp->w_redr_status = FALSE; if (wp->w_status_height == 0) { @@ -500,7 +516,6 @@ win_redr_status(win_T *wp, int ignore_pu len = this_ru_col - 1; } - row = W_WINROW(wp) + wp->w_height; screen_puts(p, row, wp->w_wincol, attr); screen_fill(row, row + 1, len + wp->w_wincol, this_ru_col + wp->w_wincol, fillchar, fillchar, attr); @@ -524,8 +539,7 @@ win_redr_status(win_T *wp, int ignore_pu fillchar = fillchar_status(&attr, wp); else fillchar = fillchar_vsep(&attr); - screen_putchar(fillchar, W_WINROW(wp) + wp->w_height, W_ENDCOL(wp), - attr); + screen_putchar(fillchar, row, W_ENDCOL(wp), attr); } busy = FALSE; } @@ -680,7 +694,7 @@ win_redr_ruler(win_T *wp, int always, in cursor_off(); if (wp->w_status_height) { - row = W_WINROW(wp) + wp->w_height; + row = statusline_row(wp); fillchar = fillchar_status(&attr, wp); off = wp->w_wincol; width = wp->w_width; @@ -1468,8 +1482,13 @@ win_update(win_T *wp) wp->w_lines_valid = 0; } - // Window is zero-height: nothing to draw. - if (wp->w_height + WINBAR_HEIGHT(wp) == 0) + // Window frame is zero-height: nothing to draw. + if (wp->w_height + WINBAR_HEIGHT(wp) == 0 + || (wp->w_frame->fr_height == wp->w_status_height +#if defined(FEAT_PROP_POPUP) + && !popup_is_popup(wp) +#endif + )) { wp->w_redr_type = 0; return;
new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_winbar_not_visible.dump @@ -0,0 +1,10 @@ +|[+1&#ffffff0|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +> +0&&@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|~| @73 +|[+3#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74
--- a/src/testdir/test_winbar.vim +++ b/src/testdir/test_winbar.vim @@ -4,6 +4,7 @@ source check.vim CheckFeature menu source shared.vim +source screendump.vim func Test_add_remove_menu() new @@ -121,4 +122,23 @@ func Test_redraw_after_scroll() bwipe! endfunc +func Test_winbar_not_visible() + CheckScreendump + + let lines =<< trim END + split + nnoremenu WinBar.Test :test + set winminheight=0 + wincmd j + wincmd _ + END + call writefile(lines, 'XtestWinbarNotVisble') + let buf = RunVimInTerminal('-S XtestWinbarNotVisble', #{rows: 10}) + call VerifyScreenDump(buf, 'Test_winbar_not_visible', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XtestWinbarNotVisble') +endfunction + " vim: shiftwidth=2 sts=2 expandtab