# HG changeset patch # User Christian Brabandt # Date 1526922007 -7200 # Node ID 411dd50f1daa0a43ed0c40b4f28c505ab90f15c1 # Parent 4019a7f0d970484d370ddaa70bf70411570c56b2 patch 8.1.0015: cursor color wrong when closing a terminal window commit https://github.com/vim/vim/commit/05af9a419198245f0810301ac9a3d59a9432ef21 Author: Bram Moolenaar Date: Mon May 21 18:48:12 2018 +0200 patch 8.1.0015: cursor color wrong when closing a terminal window 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) diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -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, ch 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; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 15, +/**/ 14, /**/ 13,