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)
This commit is contained in:
Bram Moolenaar
2021-03-30 22:12:12 +02:00
parent 82820d9bf1
commit ae0f151ddf
4 changed files with 57 additions and 6 deletions

View File

@ -377,6 +377,20 @@ update_screen(int type_arg)
return OK;
}
/*
* 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.
*
@ -401,6 +415,8 @@ win_redr_status(win_T *wp, int ignore_pum UNUSED)
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_pum UNUSED)
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_pum UNUSED)
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, int ignore_pum)
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;

View File

@ -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

View File

@ -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

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
2679,
/**/
2678,
/**/