summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2011-09-14 14:43:25 +0200
committerBram Moolenaar <Bram@vim.org>2011-09-14 14:43:25 +0200
commita971b82b160aca28cff7e318d4553df5349b5103 (patch)
tree3fb27e26538bc4ea9cb3671fd763dce2e6183f00
parent52af96527c914599334e3c2543ebb5ba1e37bbbe (diff)
downloadvim-a971b82b160aca28cff7e318d4553df5349b5103.zip
updated for version 7.3.306
Problem: When closing a window there is a chance that deleting a scrollbar triggers a GUI resize, which uses the window while it is not in a valid state. Solution: Set the buffer pointer to NULL to be able to detect the invalid situation. Fix a few places that used the buffer pointer incorrectly.
-rw-r--r--src/buffer.c18
-rw-r--r--src/ex_cmds.c4
-rw-r--r--src/term.c10
-rw-r--r--src/version.c2
-rw-r--r--src/window.c20
5 files changed, 39 insertions, 15 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 24cbc06eb..81f6fdee8 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -416,6 +416,8 @@ close_buffer(win, buf, action)
#endif
buf_freeall(buf, (del_buf ? BFA_DEL : 0) + (wipe_buf ? BFA_WIPE : 0));
+ if (win_valid(win) && win->w_buffer == buf)
+ win->w_buffer = NULL; /* make sure we don't use the buffer now */
#ifdef FEAT_AUTOCMD
/* Autocommands may have deleted the buffer. */
@@ -560,6 +562,10 @@ buf_freeall(buf, flags)
#ifdef FEAT_DIFF
diff_buf_delete(buf); /* Can't use 'diff' for unloaded buffer. */
#endif
+#ifdef FEAT_SYN_HL
+ if (curwin->w_buffer == buf)
+ reset_synblock(curwin); /* remove any ownsyntax */
+#endif
#ifdef FEAT_FOLDING
/* No folds in an empty buffer. */
@@ -1346,6 +1352,10 @@ set_curbuf(buf, action)
# endif
#endif
{
+#ifdef FEAT_SYN_HL
+ if (prevbuf == curwin->w_buffer)
+ reset_synblock(curwin);
+#endif
#ifdef FEAT_WINDOWS
if (unload)
close_windows(prevbuf, FALSE);
@@ -1395,10 +1405,6 @@ enter_buffer(buf)
foldUpdateAll(curwin); /* update folds (later). */
#endif
-#ifdef FEAT_SYN_HL
- reset_synblock(curwin);
- curwin->w_s = &(buf->b_s);
-#endif
/* Get the buffer in the current window. */
curwin->w_buffer = buf;
curbuf = buf;
@@ -1409,6 +1415,10 @@ enter_buffer(buf)
diff_buf_add(curbuf);
#endif
+#ifdef FEAT_SYN_HL
+ curwin->w_s = &(buf->b_s);
+#endif
+
/* Cursor on first line by default. */
curwin->w_cursor.lnum = 1;
curwin->w_cursor.col = 0;
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 954211385..36b0e5228 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3619,10 +3619,6 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin)
*/
check_arg_idx(curwin);
-#ifdef FEAT_SYN_HL
- reset_synblock(curwin); /* remove any ownsyntax */
-#endif
-
#ifdef FEAT_AUTOCMD
if (!auto_buf)
#endif
diff --git a/src/term.c b/src/term.c
index 77387e099..7798480ea 100644
--- a/src/term.c
+++ b/src/term.c
@@ -3017,12 +3017,20 @@ set_shellsize(width, height, mustset)
if (width < 0 || height < 0) /* just checking... */
return;
- if (State == HITRETURN || State == SETWSIZE) /* postpone the resizing */
+ if (State == HITRETURN || State == SETWSIZE)
{
+ /* postpone the resizing */
State = SETWSIZE;
return;
}
+ /* curwin->w_buffer can be NULL when we are closing a window and the
+ * buffer has already been closed and removing a scrollbar causes a resize
+ * event. Don't resize then, it will happen after entering another buffer.
+ */
+ if (curwin->w_buffer == NULL)
+ return;
+
++busy;
#ifdef AMIGA
diff --git a/src/version.c b/src/version.c
index f21e33277..74ed44da4 100644
--- a/src/version.c
+++ b/src/version.c
@@ -710,6 +710,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 306,
+/**/
305,
/**/
304,
diff --git a/src/window.c b/src/window.c
index b3a7f9e74..6b803f596 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1226,15 +1226,15 @@ win_init(newp, oldp, flags)
}
newp->w_tagstackidx = oldp->w_tagstackidx;
newp->w_tagstacklen = oldp->w_tagstacklen;
-# ifdef FEAT_FOLDING
+#ifdef FEAT_FOLDING
copyFoldingState(oldp, newp);
-# endif
+#endif
win_init_some(newp, oldp);
-# ifdef FEAT_SYN_HL
+#ifdef FEAT_SYN_HL
check_colorcolumn(newp);
-# endif
+#endif
}
/*
@@ -2212,6 +2212,11 @@ win_close(win, free_buf)
out_flush();
#endif
+#ifdef FEAT_SYN_HL
+ /* Free independent synblock before the buffer is freed. */
+ reset_synblock(win);
+#endif
+
/*
* Close the link to the buffer.
*/
@@ -2222,7 +2227,8 @@ win_close(win, free_buf)
if (!win_valid(win) || last_window() || curtab != prev_curtab)
return;
- /* Free the memory used for the window. */
+ /* Free the memory used for the window and get the window that received
+ * the screen space. */
wp = win_free_mem(win, &dir, NULL);
/* Make sure curwin isn't invalid. It can cause severe trouble when
@@ -3247,6 +3253,9 @@ win_init_empty(wp)
else
wp->w_farsi = W_CONV;
#endif
+#ifdef FEAT_SYN_HL
+ wp->w_s = &wp->w_buffer->b_s;
+#endif
}
/*
@@ -4437,7 +4446,6 @@ win_free(wp, tp)
#endif /* FEAT_GUI */
#ifdef FEAT_SYN_HL
- reset_synblock(wp); /* free independent synblock */
vim_free(wp->w_p_cc_cols);
#endif