changeset 14057:be8fb2fd51fc v8.1.0046

patch 8.1.0046: loading a session file fails if 'winheight' is big commit https://github.com/vim/vim/commit/1c3c10492a291270fa89b3c8df11828792f927d3 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 12 16:49:30 2018 +0200 patch 8.1.0046: loading a session file fails if 'winheight' is big Problem: Loading a session file fails if 'winheight' is a big number. Solution: Set 'minwinheight' to zero at first. Don't give an error when setting 'minwinheight' while 'winheight' is a big number. Fix using vertical splits. Fix setting 'minwinwidth'. (closes #2970)
author Christian Brabandt <cb@256bit.org>
date Tue, 12 Jun 2018 17:00:07 +0200
parents e16c59ce44e2
children 4aa9d444480a
files src/option.c src/proto/window.pro src/testdir/test_mksession.vim src/version.c src/window.c
diffstat 5 files changed, 51 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/option.c
+++ b/src/option.c
@@ -8796,6 +8796,7 @@ set_num_option(
      */
     if (pp == &p_wh || pp == &p_hh)
     {
+	// 'winheight' and 'helpheight'
 	if (p_wh < 1)
 	{
 	    errmsg = e_positive;
@@ -8821,10 +8822,9 @@ set_num_option(
 		win_setheight((int)p_hh);
 	}
     }
-
-    /* 'winminheight' */
     else if (pp == &p_wmh)
     {
+	// 'winminheight'
 	if (p_wmh < 0)
 	{
 	    errmsg = e_positive;
@@ -8839,6 +8839,7 @@ set_num_option(
     }
     else if (pp == &p_wiw)
     {
+	// 'winwidth'
 	if (p_wiw < 1)
 	{
 	    errmsg = e_positive;
@@ -8854,10 +8855,9 @@ set_num_option(
 	if (!ONE_WINDOW && curwin->w_width < p_wiw)
 	    win_setwidth((int)p_wiw);
     }
-
-    /* 'winminwidth' */
     else if (pp == &p_wmw)
     {
+	// 'winminwidth'
 	if (p_wmw < 0)
 	{
 	    errmsg = e_positive;
@@ -8868,7 +8868,7 @@ set_num_option(
 	    errmsg = e_winwidth;
 	    p_wmw = p_wiw;
 	}
-	win_setminheight();
+	win_setminwidth();
     }
 
     /* (re)set last window status line */
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -54,6 +54,7 @@ void win_setheight_win(int height, win_T
 void win_setwidth(int width);
 void win_setwidth_win(int width, win_T *wp);
 void win_setminheight(void);
+void win_setminwidth(void);
 void win_drag_status_line(win_T *dragwin, int offset);
 void win_drag_vsep_line(win_T *dragwin, int offset);
 void set_fraction(win_T *wp);
--- a/src/testdir/test_mksession.vim
+++ b/src/testdir/test_mksession.vim
@@ -106,13 +106,22 @@ endfunc
 
 func Test_mksession_winheight()
   new
-  set winheight=10 winminheight=2
+  set winheight=10
+  set winminheight=2
   mksession! Xtest_mks.out
   source Xtest_mks.out
 
   call delete('Xtest_mks.out')
 endfunc
 
+func Test_mksession_large_winheight()
+  set winheight=999
+  mksession! Xtest_mks_winheight.out
+  set winheight&
+  source Xtest_mks_winheight.out
+  call delete('Xtest_mks_winheight.out')
+endfunc
+
 func Test_mksession_arglist()
   argdel *
   next file1 file2 file3 file4
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    46,
+/**/
     45,
 /**/
     44,
--- a/src/window.c
+++ b/src/window.c
@@ -5430,23 +5430,21 @@ frame_setwidth(frame_T *curfrp, int widt
 }
 
 /*
- * Check 'winminheight' for a valid value.
+ * Check 'winminheight' for a valid value and reduce it if needed.
  */
     void
 win_setminheight(void)
 {
     int		room;
+    int		needed;
     int		first = TRUE;
-    win_T	*wp;
-
-    /* loop until there is a 'winminheight' that is possible */
+
+    // loop until there is a 'winminheight' that is possible
     while (p_wmh > 0)
     {
-	/* TODO: handle vertical splits */
-	room = -p_wh;
-	FOR_ALL_WINDOWS(wp)
-	    room += VISIBLE_HEIGHT(wp) - p_wmh;
-	if (room >= 0)
+	room = Rows - p_ch;
+	needed = frame_minheight(topframe, NULL);
+	if (room >= needed)
 	    break;
 	--p_wmh;
 	if (first)
@@ -5457,6 +5455,32 @@ win_setminheight(void)
     }
 }
 
+/*
+ * Check 'winminwidth' for a valid value and reduce it if needed.
+ */
+    void
+win_setminwidth(void)
+{
+    int		room;
+    int		needed;
+    int		first = TRUE;
+
+    // loop until there is a 'winminheight' that is possible
+    while (p_wmw > 0)
+    {
+	room = Columns;
+	needed = frame_minwidth(topframe, NULL);
+	if (room >= needed)
+	    break;
+	--p_wmw;
+	if (first)
+	{
+	    EMSG(_(e_noroom));
+	    first = FALSE;
+	}
+    }
+}
+
 #if defined(FEAT_MOUSE) || defined(PROTO)
 
 /*