patch 8.0.1016: gnome terminal echoes t_RC

Problem:    Gnome terminal echoes t_RC.
Solution:   Detect Gnome terminal by the version string.  Add v: variables for
            all the term responses.
diff --git a/src/eval.c b/src/eval.c
index b8e6064..b4250de 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -187,6 +187,10 @@
     {VV_NAME("t_none",		 VAR_NUMBER), VV_RO},
     {VV_NAME("t_job",		 VAR_NUMBER), VV_RO},
     {VV_NAME("t_channel",	 VAR_NUMBER), VV_RO},
+    {VV_NAME("termrgbresp",	 VAR_STRING), VV_RO},
+    {VV_NAME("termu7resp",	 VAR_STRING), VV_RO},
+    {VV_NAME("termstyleresp",	VAR_STRING), VV_RO},
+    {VV_NAME("termblinkresp",	VAR_STRING), VV_RO},
 };
 
 /* shorthand */
diff --git a/src/term.c b/src/term.c
index fdae4ea..faf3762 100644
--- a/src/term.c
+++ b/src/term.c
@@ -1369,9 +1369,7 @@
 static char_u	termleader[256 + 1];	    /* for check_termcode() */
 #ifdef FEAT_TERMRESPONSE
 static int	check_for_codes = FALSE;    /* check for key code response */
-# ifdef MACOS
-static int	is_terminal_app = FALSE;    /* recognized Terminal.app */
-# endif
+static int	is_not_xterm = FALSE;	    /* recognized not-really-xterm */
 #endif
 
     static struct builtin_term *
@@ -3506,13 +3504,10 @@
 /*
  * Similar to requesting the version string: Request the terminal background
  * color when it is the right moment.
- * Also request the cursor shape, if possible.
  */
     void
 may_req_bg_color(void)
 {
-    int	    did_one = FALSE;
-
     if (can_get_termresponse() && starting == 0)
     {
 	/* Only request background if t_RB is set and 'background' wasn't
@@ -3524,20 +3519,7 @@
 	    LOG_TR("Sending BG request");
 	    out_str(T_RBG);
 	    rbg_status = STATUS_SENT;
-	    did_one = TRUE;
-	}
 
-	/* Only request cursor blinking mode if t_RC is set. */
-	if (rbm_status == STATUS_GET && *T_CRC != NUL)
-	{
-	    LOG_TR("Sending BC request");
-	    out_str(T_CRC);
-	    rbm_status = STATUS_SENT;
-	    did_one = TRUE;
-	}
-
-	if (did_one)
-	{
 	    /* check for the characters now, otherwise they might be eaten by
 	     * get_keystroke() */
 	    out_flush();
@@ -4505,6 +4487,9 @@
 		    key_name[0] = (int)KS_EXTRA;
 		    key_name[1] = (int)KE_IGNORE;
 		    slen = i + 1;
+# ifdef FEAT_EVAL
+		    set_vim_var_string(VV_TERMU7RESP, tp, slen);
+# endif
 		}
 		else
 #endif
@@ -4530,6 +4515,8 @@
 
 		    if (tp[1 + (tp[0] != CSI)] == '>' && semicols == 2)
 		    {
+			int need_flush = FALSE;
+
 			/* Only set 'ttymouse' automatically if it was not set
 			 * by the user already. */
 			if (!option_was_set((char_u *)"ttym"))
@@ -4566,35 +4553,53 @@
 				may_adjust_color_count(256);
 			}
 
+			/* Detect terminals that set $TERM to something like
+			 * "xterm-256colors"  but are not fully xterm
+			 * compatible. */
 #  ifdef MACOS
 			/* Mac Terminal.app sends 1;95;0 */
 			if (col == 95
 				&& STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0)
-			{
-			    /* Terminal.app sets $TERM to "xterm-256colors",
-			     * but it's not fully xterm compatible. */
-			    is_terminal_app = TRUE;
-			}
+			    is_not_xterm = TRUE;
 #  endif
+			/* Gnome Terminal.app sends 1;4402;0, assuming any
+			 * version number over 4000 is not an xterm. */
+			if (col >= 4000)
+			    is_not_xterm = TRUE;
 
 			/* Only request the cursor style if t_SH and t_RS are
 			 * set. Not for Terminal.app, it can't handle t_RS, it
 			 * echoes the characters to the screen. */
 			if (rcs_status == STATUS_GET
-#  ifdef MACOS
-				&& !is_terminal_app
-#  endif
+				&& !is_not_xterm
 				&& *T_CSH != NUL
 				&& *T_CRS != NUL)
 			{
 			    LOG_TR("Sending cursor style request");
 			    out_str(T_CRS);
 			    rcs_status = STATUS_SENT;
-			    out_flush();
+			    need_flush = TRUE;
 			}
+
+			/* Only request the cursor blink mode if t_RC set. Not
+			 * for Gnome terminal, it can't handle t_RC, it
+			 * echoes the characters to the screen. */
+			if (rbm_status == STATUS_GET
+				&& !is_not_xterm
+				&& *T_CRC != NUL)
+			{
+			    LOG_TR("Sending cursor blink mode request");
+			    out_str(T_CRC);
+			    rbm_status = STATUS_SENT;
+			    need_flush = TRUE;
+			}
+
+			if (need_flush)
+			    out_flush();
 		    }
+		    slen = i + 1;
 # ifdef FEAT_EVAL
-		    set_vim_var_string(VV_TERMRESPONSE, tp, i + 1);
+		    set_vim_var_string(VV_TERMRESPONSE, tp, slen);
 # endif
 # ifdef FEAT_AUTOCMD
 		    apply_autocmds(EVENT_TERMRESPONSE,
@@ -4602,7 +4607,6 @@
 # endif
 		    key_name[0] = (int)KS_EXTRA;
 		    key_name[1] = (int)KE_IGNORE;
-		    slen = i + 1;
 		}
 
 		/* Check blinking cursor from xterm:
@@ -4626,6 +4630,9 @@
 		    key_name[0] = (int)KS_EXTRA;
 		    key_name[1] = (int)KE_IGNORE;
 		    slen = i + 1;
+# ifdef FEAT_EVAL
+		    set_vim_var_string(VV_TERMBLINKRESP, tp, slen);
+# endif
 		}
 
 		/*
@@ -4714,6 +4721,9 @@
 			    /* Sometimes the 0x07 is followed by 0x18, unclear
 			     * when this happens. */
 			    ++slen;
+# ifdef FEAT_EVAL
+			set_vim_var_string(VV_TERMRGBRESP, tp, slen);
+# endif
 			break;
 		    }
 		if (i == len)
@@ -4788,6 +4798,9 @@
 			key_name[0] = (int)KS_EXTRA;
 			key_name[1] = (int)KE_IGNORE;
 			slen = i + 1 + (tp[i] == ESC);
+# ifdef FEAT_EVAL
+			set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
+# endif
 		    }
 		}
 
diff --git a/src/version.c b/src/version.c
index 8af0c0d..8ffd164 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1016,
+/**/
     1015,
 /**/
     1014,
diff --git a/src/vim.h b/src/vim.h
index 991c1b7..7fea70b 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2012,7 +2012,11 @@
 #define VV_TYPE_NONE	78
 #define VV_TYPE_JOB	79
 #define VV_TYPE_CHANNEL	80
-#define VV_LEN		81	/* number of v: vars */
+#define VV_TERMRGBRESP	81
+#define VV_TERMU7RESP	82
+#define VV_TERMSTYLERESP 83
+#define VV_TERMBLINKRESP 84
+#define VV_LEN		85	/* number of v: vars */
 
 /* used for v_number in VAR_SPECIAL */
 #define VVAL_FALSE	0L