]> granicus.if.org Git - vim/commitdiff
patch 8.0.0678: closing a window does not trigger resizing v8.0.0678
authorBram Moolenaar <Bram@vim.org>
Sun, 25 Jun 2017 20:45:39 +0000 (22:45 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 25 Jun 2017 20:45:39 +0000 (22:45 +0200)
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)

src/testdir/test_window_cmd.vim
src/version.c
src/window.c

index f7d5317f23e3712a3d4f186eb12a3cac406cd41c..2402ecfe007d4bae893daa04eee1c47e0f2ad330 100644 (file)
@@ -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
index 3dd0527aad0dc3f604b5cdb83b8c15638b666f43..192165fc6ad8bef23e95bb82e74000181ceff6c6 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    678,
 /**/
     677,
 /**/
index 2ef319805e4d589b1424f7fff09d7238800d5c6e..8078e011d3557b8b4100277235baf493f8b0af60 100644 (file)
@@ -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);
     else
        win_comp_pos();
     if (close_curwin)