]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.004 v7.4.004
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Aug 2013 15:11:20 +0000 (17:11 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Aug 2013 15:11:20 +0000 (17:11 +0200)
Problem:    When closing a window fails ":bwipe" may hang.
Solution:   Let win_close() return FAIL and break out of the loop.

src/buffer.c
src/proto/window.pro
src/version.c
src/window.c

index 238af1430993d3f0a87c5f32f29df05ec81eb1d2..34273d83b5dfe5341e26d1da3030d264b88eaaeb 100644 (file)
@@ -1186,7 +1186,10 @@ do_buffer(action, start, dir, count, forceit)
                   && !(curwin->w_closing || curwin->w_buffer->b_closing)
 # endif
                   && (firstwin != lastwin || first_tabpage->tp_next != NULL))
-           win_close(curwin, FALSE);
+       {
+           if (win_close(curwin, FALSE) == FAIL)
+               break;
+       }
 #endif
 
        /*
index fdba722bd17d45e43945cbf8472321745748f2ae..cecc668528718770b1a672b6e058fa2a14de8095 100644 (file)
@@ -9,7 +9,7 @@ void win_move_after __ARGS((win_T *win1, win_T *win2));
 void win_equal __ARGS((win_T *next_curwin, int current, int dir));
 void close_windows __ARGS((buf_T *buf, int keep_curwin));
 int one_window __ARGS((void));
-void win_close __ARGS((win_T *win, int free_buf));
+int win_close __ARGS((win_T *win, int free_buf));
 void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
 void win_free_all __ARGS((void));
 win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
index 069c172ddc105d14d9376da6f9a0b3f76bfc6ac1..7ccb9315399731210ee3cd2e9dd004d929e64ebe 100644 (file)
@@ -727,6 +727,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4,
 /**/
     3,
 /**/
index 16e0ee78b7a4db5f089c2f2850ba1d1dd0f644aa..48745f060157eca3137c23a756e2b463d38685fc 100644 (file)
@@ -2172,8 +2172,9 @@ close_last_window_tabpage(win, free_buf, prev_curtab)
  * If "free_buf" is TRUE related buffer may be unloaded.
  *
  * Called by :quit, :close, :xit, :wq and findtag().
+ * Returns FAIL when the window was not closed.
  */
-    void
+    int
 win_close(win, free_buf)
     win_T      *win;
     int                free_buf;
@@ -2190,21 +2191,21 @@ win_close(win, free_buf)
     if (last_window())
     {
        EMSG(_("E444: Cannot close last window"));
-       return;
+       return FAIL;
     }
 
 #ifdef FEAT_AUTOCMD
     if (win->w_closing || (win->w_buffer != NULL && win->w_buffer->b_closing))
-       return; /* window is already being closed */
+       return FAIL; /* window is already being closed */
     if (win == aucmd_win)
     {
        EMSG(_("E813: Cannot close autocmd window"));
-       return;
+       return FAIL;
     }
     if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())
     {
        EMSG(_("E814: Cannot close window, only autocmd window would remain"));
-       return;
+       return FAIL;
     }
 #endif
 
@@ -2212,7 +2213,7 @@ win_close(win, free_buf)
      * and then close the window and the tab page to avoid that curwin and
      * curtab are invalid while we are freeing memory. */
     if (close_last_window_tabpage(win, free_buf, prev_curtab))
-      return;
+      return FAIL;
 
     /* When closing the help window, try restoring a snapshot after closing
      * the window.  Otherwise clear the snapshot, it's now invalid. */
@@ -2240,22 +2241,22 @@ win_close(win, free_buf)
            win->w_closing = TRUE;
            apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, FALSE, curbuf);
            if (!win_valid(win))
-               return;
+               return FAIL;
            win->w_closing = FALSE;
            if (last_window())
-               return;
+               return FAIL;
        }
        win->w_closing = TRUE;
        apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
        if (!win_valid(win))
-           return;
+           return FAIL;
        win->w_closing = FALSE;
        if (last_window())
-           return;
+           return FAIL;
 # ifdef FEAT_EVAL
        /* autocmds may abort script processing */
        if (aborting())
-           return;
+           return FAIL;
 # endif
     }
 #endif
@@ -2303,7 +2304,7 @@ win_close(win, free_buf)
      * other window or moved to another tab page. */
     else if (!win_valid(win) || last_window() || curtab != prev_curtab
            || close_last_window_tabpage(win, free_buf, prev_curtab))
-       return;
+       return FAIL;
 
     /* Free the memory used for the window and get the window that received
      * the screen space. */
@@ -2383,6 +2384,7 @@ win_close(win, free_buf)
 #endif
 
     redraw_all_later(NOT_VALID);
+    return OK;
 }
 
 /*