updated for version 7.3.306 v7.3.306
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Sep 2011 12:43:25 +0000 (14:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Sep 2011 12:43:25 +0000 (14:43 +0200)
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.

src/buffer.c
src/ex_cmds.c
src/term.c
src/version.c
src/window.c

index 24cbc06eb48b6c0c9f82702a5775ab85d6886a1f..81f6fdee8470051ed8b00f399468c3dcef1266fb 100644 (file)
@@ -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;
index 9542113853bf7e997556e08ab6e146aaf63e6e85..36b0e522812731cece3852737e1f47eae59fc904 100644 (file)
@@ -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
index 77387e099b10b0a7ec0dd5c7d8eb1a8c159c7cf0..7798480eaa1419b0b1b6dcf3c5b670f4ebf2a2ed 100644 (file)
@@ -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
index f21e332774a013b49f9e2c77f64bfe358f46de08..74ed44da476652cf2664c956874e7fba513d1915 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    306,
 /**/
     305,
 /**/
index b3a7f9e742cfe6e2ec038db6a567aefe62a1bea4..6b803f59605c096cfd92d1aee273a487d3bccad6 100644 (file)
@@ -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