]> granicus.if.org Git - vim/commitdiff
patch 8.1.0015: cursor color wrong when closing a terminal window v8.1.0015
authorBram Moolenaar <Bram@vim.org>
Mon, 21 May 2018 16:48:12 +0000 (18:48 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 21 May 2018 16:48:12 +0000 (18:48 +0200)
Problem:    Cursor color wrong when closing a terminal window, ending up in
            another terminal window. (Dominique Pelle)
Solution:   Bail out of terminal_loop() when the buffer changes.
            (closes #2942)

src/terminal.c
src/version.c

index dea902f3a4bada53d5aa73e0e64b092ae6d70a98..817e6b9375f09c55d239fcf8e6205da07abc1a23 100644 (file)
@@ -183,14 +183,7 @@ static int desired_cursor_blink = -1;
  * 1. Generic code for all systems.
  */
 
-    static void
-cursor_color_copy(char_u** to_color, char_u* from_color)
-{
-    vim_free(*to_color);
-    *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
-}
-
-       static int
+    static int
 cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
 {
     if (lhs_color != NULL && rhs_color != NULL)
@@ -198,7 +191,17 @@ cursor_color_equal(char_u *lhs_color, char_u *rhs_color)
     return lhs_color == NULL && rhs_color == NULL;
 }
 
-       static char_u *
+    static void
+cursor_color_copy(char_u **to_color, char_u *from_color)
+{
+    // Avoid a free & alloc if the value is already right.
+    if (cursor_color_equal(*to_color, from_color))
+       return;
+    vim_free(*to_color);
+    *to_color = (from_color == NULL) ? NULL : vim_strsave(from_color);
+}
+
+    static char_u *
 cursor_color_get(char_u *color)
 {
     return (color == NULL) ? (char_u *)"" : color;
@@ -2119,7 +2122,7 @@ terminal_loop(int blocking)
            while (must_redraw != 0)
                if (update_screen(0) == FAIL)
                    break;
-       if (!term_use_loop_check(TRUE))
+       if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
            /* job finished while redrawing */
            break;
 
@@ -2127,7 +2130,7 @@ terminal_loop(int blocking)
        restore_cursor = TRUE;
 
        c = term_vgetc();
-       if (!term_use_loop_check(TRUE))
+       if (!term_use_loop_check(TRUE) || in_terminal_loop != curbuf->b_term)
        {
            /* Job finished while waiting for a character.  Push back the
             * received character. */
@@ -2178,7 +2181,8 @@ terminal_loop(int blocking)
 #ifdef FEAT_CMDL_INFO
            clear_showcmd();
 #endif
-           if (!term_use_loop_check(TRUE))
+           if (!term_use_loop_check(TRUE)
+                                        || in_terminal_loop != curbuf->b_term)
                /* job finished while waiting for a character */
                break;
 
index 41973d703501be8301fd27b21f98f1f44620f311..d1a75a1148ef5896267185a89772bb42360df4c1 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    15,
 /**/
     14,
 /**/