]> granicus.if.org Git - vim/commitdiff
patch 8.1.0046: loading a session file fails if 'winheight' is big v8.1.0046
authorBram Moolenaar <Bram@vim.org>
Tue, 12 Jun 2018 14:49:30 +0000 (16:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 12 Jun 2018 14:49:30 +0000 (16:49 +0200)
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)

src/option.c
src/proto/window.pro
src/testdir/test_mksession.vim
src/version.c
src/window.c

index 7d79b3ca1c36ea9f0cf835f3d55b0f76f6554abb..0200b207c722c0199585f2c6f799005b8c7070cb 100644 (file)
@@ -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 */
index b21b4633f27da34edeb0ee1499fbfc2809cc1443..7ed8042f7b7b73ea47330ac4e301c6149ab1350a 100644 (file)
@@ -54,6 +54,7 @@ void win_setheight_win(int height, win_T *win);
 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);
index 81883b5d76f4df93d86114ec51f63fc10f7c5953..e81d9b3e321faca0be5ace6228c1bb65d5d6ffa0 100644 (file)
@@ -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
index e18a8c05fd5d242d4a38ff5c35be4bb19285bc34..2ce060c50071bfe172e18424b7cfa6b76bc56e63 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    46,
 /**/
     45,
 /**/
index 74e3c046985b62b2c245ff66fe86a3f03152100e..4f4f08b6756e2950419a4b3447eec04eee44cad5 100644 (file)
@@ -5430,23 +5430,21 @@ frame_setwidth(frame_T *curfrp, int width)
 }
 
 /*
- * 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)
 
 /*