patch 9.1.0993: New 'cmdheight' behavior may be surprising
Problem: Although patch 9.1.0990 fixed a real problem/inconsistency,
it also introduced new behavior that may break BWC and/or be
unexpected. Before 9.1.0990, window commands could make the
topframe smaller (without changing 'cmdheight'; quirk that is
now fixed), but did not allow extending the topframe beyond
the 'cmdheight' set by the user. After 9.1.0990, the user can
reduce the 'cmdheight' below the value they set explicitly,
through window commands, which may lead to confusion.
(aftere v9.1.0990)
Solution: Store the value explicitly set by the user and clamp the
'cmdheight' when resizing the topframe. This also applies to
dragging laststatus, which in contrast to window commands
_did_ allow reducing the 'cmdheight' to values below the one
set by the user. So with this patch there is still new
behavior, but I think in a way that is less surprising.
While at it, also fix a Coverity warning, introduced in
v9.1.0990 (Luuk van Baal)
closes: #16385
Signed-off-by: Luuk van Baal <luukvbaal@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/window.c b/src/window.c
index 93b0a32..b15ad3e 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3832,6 +3832,10 @@
return FALSE;
}
+// 'cmdheight' value explicitly set by the user: window commands are allowed to
+// resize the topframe to values higher than this minimum, but not lower.
+static int min_set_ch = 1;
+
/*
* Set a new height for a frame. Recursively sets the height for contained
* frames and windows. Caller must take care of positions.
@@ -3852,9 +3856,11 @@
if (topfrp->fr_parent == NULL && set_ch)
{
// topframe: update the command line height, with side effects.
- int new_ch = MAX(1, p_ch + topfrp->fr_height - height);
+ int new_ch = MAX(min_set_ch, p_ch + topfrp->fr_height - height);
+ int save_ch = min_set_ch;
if (new_ch != p_ch)
set_option_value((char_u *)"cmdheight", new_ch, NULL, 0);
+ min_set_ch = save_ch;
height = MIN(height, ROWS_AVAIL);
}
if (topfrp->fr_win != NULL)
@@ -7306,7 +7312,7 @@
old_p_ch += h;
frp = frp->fr_prev;
}
- if (p_ch < old_p_ch && command_frame_height)
+ if (p_ch < old_p_ch && command_frame_height && frp != NULL)
frame_add_height(frp, (int)(old_p_ch - p_ch));
// Recompute window positions.
@@ -7325,6 +7331,7 @@
// GUI starts up, we can't be sure in what order things happen. And when
// p_ch was changed in another tab page.
curtab->tp_ch_used = p_ch;
+ min_set_ch = p_ch;
}
/*