summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-06-12 16:49:30 +0200
committerBram Moolenaar <Bram@vim.org>2018-06-12 16:49:30 +0200
commit1c3c10492a291270fa89b3c8df11828792f927d3 (patch)
treee644f87ac8716b7d9232f4ebe2d8610350397d4c
parentae0f30b761eb62e1b6bfc83fb4a6d1a47bf48320 (diff)
downloadvim-1c3c10492a291270fa89b3c8df11828792f927d3.zip
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)
-rw-r--r--src/option.c10
-rw-r--r--src/proto/window.pro1
-rw-r--r--src/testdir/test_mksession.vim11
-rw-r--r--src/version.c2
-rw-r--r--src/window.c40
5 files changed, 50 insertions, 14 deletions
diff --git a/src/option.c b/src/option.c
index 7d79b3ca1..0200b207c 100644
--- 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 */
diff --git a/src/proto/window.pro b/src/proto/window.pro
index b21b4633f..7ed8042f7 100644
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -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);
diff --git a/src/testdir/test_mksession.vim b/src/testdir/test_mksession.vim
index 81883b5d7..e81d9b3e3 100644
--- 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
diff --git a/src/version.c b/src/version.c
index e18a8c05f..2ce060c50 100644
--- 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,
diff --git a/src/window.c b/src/window.c
index 74e3c0469..4f4f08b67 100644
--- a/src/window.c
+++ b/src/window.c
@@ -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)
/*