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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2679,
+/**/
     2678,
 /**/
     2677,