Permalink
Browse files

patch 8.0.0678: closing a window does not trigger resizing

Problem:    When 'equalalways' is set and closing a window in a separate
            frame, not all window sizes are adjusted. (Glacambre)
Solution:   Resize all windows if the new current window is not in the same
            frame as the closed window. (closes #1707)
  • Loading branch information...
brammool committed Jun 25, 2017
1 parent 1814183 commit 8eeeba8c025ff844e6514c4a60cec11bf1fc1b35
Showing with 51 additions and 1 deletion.
  1. +44 −0 src/testdir/test_window_cmd.vim
  2. +2 −0 src/version.c
  3. +5 −1 src/window.c
@@ -318,6 +318,50 @@ func Test_window_width()
bw Xa Xb Xc
endfunc
func Test_equalalways_on_close()
set equalalways
vsplit
windo split
split
wincmd J
" now we have a frame top-left with two windows, a frame top-right with two
" windows and a frame at the bottom, full-width.
let height_1 = winheight(1)
let height_2 = winheight(2)
let height_3 = winheight(3)
let height_4 = winheight(4)
" closing the bottom window causes all windows to be resized.
close
call assert_notequal(height_1, winheight(1))
call assert_notequal(height_2, winheight(2))
call assert_notequal(height_3, winheight(3))
call assert_notequal(height_4, winheight(4))
call assert_equal(winheight(1), winheight(3))
call assert_equal(winheight(2), winheight(4))
1wincmd w
split
4wincmd w
resize + 5
" left column has three windows, equalized heights.
" right column has two windows, top one a bit higher
let height_1 = winheight(1)
let height_2 = winheight(2)
let height_4 = winheight(4)
let height_5 = winheight(5)
3wincmd w
" closing window in left column equalizes heights in left column but not in
" the right column
close
call assert_notequal(height_1, winheight(1))
call assert_notequal(height_2, winheight(2))
call assert_equal(height_4, winheight(3))
call assert_equal(height_5, winheight(4))
only
set equalalways&
endfunc
func Test_window_jump_tag()
help
/iccf
View
@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
678,
/**/
677,
/**/
View
@@ -2282,6 +2282,7 @@ win_close(win_T *win, int free_buf)
int dir;
int help_window = FALSE;
tabpage_T *prev_curtab = curtab;
frame_T *win_frame = win->w_frame;
if (last_window())
{
@@ -2459,7 +2460,10 @@ win_close(win_T *win, int free_buf)
check_cursor();
}
if (p_ea && (*p_ead == 'b' || *p_ead == dir))
win_equal(curwin, TRUE, dir);
/* If the frame of the closed window contains the new current window,
* only resize that frame. Otherwise resize all windows. */
win_equal(curwin,
curwin->w_frame->fr_parent == win_frame->fr_parent, dir);

This comment has been minimized.

Show comment
Hide comment
@kafeltz

kafeltz Jun 26, 2017

What is the ideia of using two lines here in win_equal? Some linter rule?

@kafeltz

kafeltz Jun 26, 2017

What is the ideia of using two lines here in win_equal? Some linter rule?

This comment has been minimized.

Show comment
Hide comment
@brammool

brammool Jun 27, 2017

Contributor

80 character rule

@brammool

brammool Jun 27, 2017

Contributor

80 character rule

else
win_comp_pos();
if (close_curwin)

1 comment on commit 8eeeba8

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Jun 26, 2017

win_frame has been already freed at the time of calling win_equal().

ichizok commented on 8eeeba8 Jun 26, 2017

win_frame has been already freed at the time of calling win_equal().

Please sign in to comment.