# HG changeset patch # User Bram Moolenaar # Date 1376493080 -7200 # Node ID f6247eaf4e1d556f782321890d725663f74babe6 # Parent 8c8cdda36022beac4b9cf74bea50ee9b89d92ea7 updated for version 7.4.004 Problem: When closing a window fails ":bwipe" may hang. Solution: Let win_close() return FAIL and break out of the loop. diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -1186,7 +1186,10 @@ do_buffer(action, start, dir, count, for && !(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 /* diff --git a/src/proto/window.pro b/src/proto/window.pro --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -9,7 +9,7 @@ void win_move_after __ARGS((win_T *win1, 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)); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4, +/**/ 3, /**/ 2, diff --git a/src/window.c b/src/window.c --- a/src/window.c +++ b/src/window.c @@ -2172,8 +2172,9 @@ close_last_window_tabpage(win, free_buf, * 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; } /*