patch 9.1.0993: New 'cmdheight' behavior may be surprising

Commit: 
https://github.com/vim/vim/commit/c97e8695353565d6b20adffa48aad47f6e09967f
Author: Luuk van Baal <luukvb...@gmail.com>
Date:   Mon Jan 6 18:58:21 2025 +0100

    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 <luukvb...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/testdir/dumps/Test_changing_cmdheight_3.dump 
b/src/testdir/dumps/Test_changing_cmdheight_3.dump
index d652cc631..0adb5c666 100644
--- a/src/testdir/dumps/Test_changing_cmdheight_3.dump
+++ b/src/testdir/dumps/Test_changing_cmdheight_3.dump
@@ -1,8 +1,8 @@
 > +0&#ffffff0@74
-|~+0#4040ff13&| @73
-|[+3#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
+|[+3&&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
 | +0&&@74
 @75
 @75
 @75
 @75
+@75
diff --git a/src/testdir/dumps/Test_changing_cmdheight_8.dump 
b/src/testdir/dumps/Test_changing_cmdheight_8.dump
new file mode 100644
index 000000000..1b24f3341
--- /dev/null
+++ b/src/testdir/dumps/Test_changing_cmdheight_8.dump
@@ -0,0 +1,8 @@
+> +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|[+3#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1
+|:+0&&|w|i|n|c|m|d| |_| @65
+@75
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 2b81dc05a..dfebb400b 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -293,14 +293,13 @@ func Test_changing_cmdheight()
   " :resize now also changes 'cmdheight' accordingly
   call term_sendkeys(buf, ":set cmdheight+=1\<CR>")
   call VerifyScreenDump(buf, 'Test_changing_cmdheight_2', {})
-  call term_sendkeys(buf, ":set cmdheight-=1\<CR>")
 
   " using more space moves the status line up
   call term_sendkeys(buf, ":set cmdheight+=1\<CR>")
   call VerifyScreenDump(buf, 'Test_changing_cmdheight_3', {})
 
   " reducing cmdheight moves status line down
-  call term_sendkeys(buf, ":set cmdheight-=2\<CR>")
+  call term_sendkeys(buf, ":set cmdheight-=3\<CR>")
   call VerifyScreenDump(buf, 'Test_changing_cmdheight_4', {})
 
   " reducing window size and then setting cmdheight
@@ -312,10 +311,14 @@ func Test_changing_cmdheight()
   call term_sendkeys(buf, ":call EchoTwo()\<CR>")
   call VerifyScreenDump(buf, 'Test_changing_cmdheight_6', {})
 
-  " decreasing 'cmdheight' doesn't clear the messages that need hit-enter
+  " increasing 'cmdheight' doesn't clear the messages that need hit-enter
   call term_sendkeys(buf, ":call EchoOne()\<CR>")
   call VerifyScreenDump(buf, 'Test_changing_cmdheight_7', {})
 
+  " window commands do not reduce 'cmdheight' to value lower than :set by user
+  call term_sendkeys(buf, "\<CR>:wincmd _\<CR>")
+  call VerifyScreenDump(buf, 'Test_changing_cmdheight_8', {})
+
   " clean up
   call StopVimInTerminal(buf)
 endfunc
diff --git a/src/version.c b/src/version.c
index e8feb96f4..60de70238 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    993,
 /**/
     992,
 /**/
diff --git a/src/window.c b/src/window.c
index 93b0a327d..b15ad3eca 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3832,6 +3832,10 @@ frame_has_win(frame_T *frp, win_T *wp)
     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 @@ frame_new_height(
     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 @@ command_height(void)
        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 @@ command_height(void)
     // 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;
 }
 
 /*

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1tUrd1-00BsJg-VO%40256bit.org.

Raspunde prin e-mail lui