Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
brammool committed Jun 12, 2018
1 parent ae0f30b commit 1c3c104
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 14 deletions.
10 changes: 5 additions & 5 deletions src/option.c
Expand Up @@ -8796,6 +8796,7 @@ set_num_option(
*/
if (pp == &p_wh || pp == &p_hh)
{
// 'winheight' and 'helpheight'
if (p_wh < 1)
{
errmsg = e_positive;
Expand All @@ -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;
Expand All @@ -8839,6 +8839,7 @@ set_num_option(
}
else if (pp == &p_wiw)
{
// 'winwidth'
if (p_wiw < 1)
{
errmsg = e_positive;
Expand All @@ -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;
Expand All @@ -8868,7 +8868,7 @@ set_num_option(
errmsg = e_winwidth;
p_wmw = p_wiw;
}
win_setminheight();
win_setminwidth();
}

/* (re)set last window status line */
Expand Down
1 change: 1 addition & 0 deletions src/proto/window.pro
Expand Up @@ -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);
Expand Down
11 changes: 10 additions & 1 deletion src/testdir/test_mksession.vim
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Expand Up @@ -761,6 +761,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
46,
/**/
45,
/**/
Expand Down
40 changes: 32 additions & 8 deletions src/window.c
Expand Up @@ -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)
Expand All @@ -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)

/*
Expand Down

0 comments on commit 1c3c104

Please sign in to comment.