void command_height(void);
void last_status(int morewin);
int tabline_height(void);
+int last_stl_height(int morewin);
int min_rows(void);
int only_one_window(void);
void check_lnums(int do_curwin);
void
comp_col(void)
{
- int last_has_status = (p_ls == 2 || (p_ls == 1 && !ONE_WINDOW));
+ int last_has_status = last_stl_height(FALSE) > 0;
sc_col = 0;
ru_col = 0;
let &columns = columns
endfunc
+func Test_cmdwin_restore_heights()
+ set showtabline=0 cmdheight=2 laststatus=0
+ call feedkeys("q::set cmdheight=1\<CR>:q\<CR>", 'ntx')
+ call assert_equal(&lines - 1, winheight(0))
+
+ set showtabline=2 cmdheight=3
+ call feedkeys("q::set showtabline=0\<CR>:q\<CR>", 'ntx')
+ call assert_equal(&lines - 3, winheight(0))
+
+ set cmdheight=1 laststatus=2
+ call feedkeys("q::set laststatus=0\<CR>:q\<CR>", 'ntx')
+ call assert_equal(&lines - 1, winheight(0))
+
+ set laststatus=2
+ call feedkeys("q::set laststatus=1\<CR>:q\<CR>", 'ntx')
+ call assert_equal(&lines - 1, winheight(0))
+
+ set laststatus=2
+ belowright vsplit
+ wincmd _
+ let restcmds = winrestcmd()
+ call feedkeys("q::set laststatus=1\<CR>:q\<CR>", 'ntx')
+ " As we have 2 windows, &ls = 1 should still have a statusline on the last
+ " window. As such, the number of available rows hasn't changed and the window
+ " sizes should be restored.
+ call assert_equal(restcmds, winrestcmd())
+
+ set cmdheight& showtabline& laststatus&
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1726,
/**/
1725,
/**/
*/
void
win_size_save(garray_T *gap)
-
{
win_T *wp;
if (ga_grow(gap, win_count() * 2 + 1) == FAIL)
return;
- // first entry is value of 'lines'
- ((int *)gap->ga_data)[gap->ga_len++] = Rows;
+ // first entry is the total lines available for windows
+ ((int *)gap->ga_data)[gap->ga_len++] = ROWS_AVAIL - last_stl_height(FALSE);
FOR_ALL_WINDOWS(wp)
{
/*
* Restore window sizes, but only if the number of windows is still the same
- * and 'lines' didn't change.
+ * and total lines available for windows didn't change.
* Does not free the growarray.
*/
void
int i, j;
if (win_count() * 2 + 1 == gap->ga_len
- && ((int *)gap->ga_data)[0] == Rows)
+ && ((int *)gap->ga_data)[0] == ROWS_AVAIL - last_stl_height(FALSE))
{
// The order matters, because frames contain other frames, but it's
// difficult to get right. The easy way out is to do it twice.
int morewin) // pretend there are two or more windows
{
// Don't make a difference between horizontal or vertical split.
- last_status_rec(topframe, (p_ls == 2
- || (p_ls == 1 && (morewin || !ONE_WINDOW))));
+ last_status_rec(topframe, last_stl_height(morewin) > 0);
}
static void
return 1;
}
+/*
+ * Return the height of the last window's statusline.
+ */
+ int
+last_stl_height(
+ int morewin) // pretend there are two or more windows
+{
+ return (p_ls == 2 || (p_ls == 1 && (morewin || !ONE_WINDOW)))
+ ? STATUS_HEIGHT : 0;
+}
+
/*
* Return the minimal number of rows that is needed on the screen to display
* the current number of windows.