]> granicus.if.org Git - vim/commitdiff
patch 8.2.2679: status line missing for non-current window with winbar v8.2.2679
authorBram Moolenaar <Bram@vim.org>
Tue, 30 Mar 2021 20:12:12 +0000 (22:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 30 Mar 2021 20:12:12 +0000 (22:12 +0200)
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)

src/drawscreen.c
src/testdir/dumps/Test_winbar_not_visible.dump [new file with mode: 0644]
src/testdir/test_winbar.vim
src/version.c

index c2752bdd8ac8b903a346aa7fc6eaa415e9770095..051d94b232fcbef1ec20e1c5cae378e9d4126e70 100644 (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;
diff --git a/src/testdir/dumps/Test_winbar_not_visible.dump b/src/testdir/dumps/Test_winbar_not_visible.dump
new file mode 100644 (file)
index 0000000..894ac21
--- /dev/null
@@ -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
index 3412ce5761bf809838118516aaccb5d2df806edb..2cbdd013c43637f068e1fca0bc04197d90743aa2 100644 (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
index 76ab0671ea3868f9d71f793e43d881f0aa388691..4947b563576de899421d0d2c1e1a4e897564a92c 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2679,
 /**/
     2678,
 /**/