]> granicus.if.org Git - vim/commitdiff
patch 9.0.0923: second SIGWINCH signal may be ignored v9.0.0923
authorBram Moolenaar <Bram@vim.org>
Tue, 22 Nov 2022 20:41:05 +0000 (20:41 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 22 Nov 2022 20:41:05 +0000 (20:41 +0000)
Problem:    Second SIGWINCH signal may be ignored.
Solution:   When set_shellsize() is busy when called then run the inner code
            again when it's done.  (issue #424)

src/term.c
src/version.c

index 3b2c3c063fc08b62373d17547a05130540556a19..0e665d0b34432c31e9eeb1d12397f62e423465fc 100644 (file)
@@ -3439,28 +3439,9 @@ shell_resized_check(void)
  * If 'mustset' is FALSE, we may try to get the real window size and if
  * it fails use 'width' and 'height'.
  */
-    void
-set_shellsize(int width, int height, int mustset)
+    static void
+set_shellsize_inner(int width, int height, int mustset)
 {
-    static int         busy = FALSE;
-
-    /*
-     * Avoid recursiveness, can happen when setting the window size causes
-     * another window-changed signal.
-     */
-    if (busy)
-       return;
-
-    if (width < 0 || height < 0)    // just checking...
-       return;
-
-    if (State == MODE_HITRETURN || State == MODE_SETWSIZE)
-    {
-       // postpone the resizing
-       State = MODE_SETWSIZE;
-       return;
-    }
-
     if (updating_screen)
        // resizing while in update_screen() may cause a crash
        return;
@@ -3472,8 +3453,6 @@ set_shellsize(int width, int height, int mustset)
     if (curwin->w_buffer == NULL || curwin->w_lines == NULL)
        return;
 
-    ++busy;
-
 #ifdef AMIGA
     out_flush();           // must do this before mch_get_shellsize() for
                            // some obscure reason
@@ -3547,7 +3526,39 @@ set_shellsize(int width, int height, int mustset)
        cursor_on();        // redrawing may have switched it off
     }
     out_flush();
-    --busy;
+}
+
+    void
+set_shellsize(int width, int height, int mustset)
+{
+    static int busy = FALSE;
+    static int do_run = FALSE;
+
+    if (width < 0 || height < 0)    // just checking...
+       return;
+
+    if (State == MODE_HITRETURN || State == MODE_SETWSIZE)
+    {
+       // postpone the resizing
+       State = MODE_SETWSIZE;
+       return;
+    }
+
+    // Avoid recursiveness.  This can happen when setting the window size
+    // causes another window-changed signal or when two SIGWINCH signals come
+    // very close together.  There needs to be another run then after the
+    // current one is done to pick up the latest size.
+    do_run = TRUE;
+    if (busy)
+       return;
+
+    while (do_run)
+    {
+       do_run = FALSE;
+       busy = TRUE;
+       set_shellsize_inner(width, height, mustset);
+       busy = FALSE;
+    }
 }
 
 /*
index c73f1c43187c4ed849d89f1e94a992bbd54b2969..cd2023cdd89220af56c065b6befc150dbc959d19 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    923,
 /**/
     922,
 /**/