mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	patch 9.1.1757: The colorresp plugin causes additional redraws
Problem:  The colorresp plugin causes additional redraws
          (Linwei, after v9.1.1703)
Solution: Move the code back into the C core and get rid of the vim
          plugin (Foxe Chen)
fixes: #18251
closes: #18279
Signed-off-by: Foxe Chen <chen.foxe@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							c975d62473
						
					
				
				
					commit
					c077f5e9d8
				
			| @@ -1,4 +1,4 @@ | |||||||
| *autocmd.txt*   For Vim version 9.1.  Last change: 2025 Sep 11 | *autocmd.txt*   For Vim version 9.1.  Last change: 2025 Sep 14 | ||||||
|  |  | ||||||
|  |  | ||||||
| 		  VIM REFERENCE MANUAL    by Bram Moolenaar | 		  VIM REFERENCE MANUAL    by Bram Moolenaar | ||||||
| @@ -1313,8 +1313,10 @@ TermResponseAll			After the response to |t_RV|, |t_RC|, |t_RS|, | |||||||
| 				correspondingly, can be used.  <amatch> will | 				correspondingly, can be used.  <amatch> will | ||||||
| 				be set to any of: | 				be set to any of: | ||||||
| 				    "ambiguouswidth" (|t_u7|), | 				    "ambiguouswidth" (|t_u7|), | ||||||
|  | 				    "background" (|t_RB|), | ||||||
| 				    "cursorblink" (|t_RC|), | 				    "cursorblink" (|t_RC|), | ||||||
| 				    "cursorshape" (|t_RS|), | 				    "cursorshape" (|t_RS|), | ||||||
|  | 				    "foreground" (|t_RF|), | ||||||
| 				    "da1", | 				    "da1", | ||||||
| 				    "osc", | 				    "osc", | ||||||
| 				    "version" (|t_RV|) | 				    "version" (|t_RV|) | ||||||
| @@ -1322,15 +1324,6 @@ TermResponseAll			After the response to |t_RV|, |t_RC|, |t_RS|, | |||||||
| 				executing another event, especially if file I/O, | 				executing another event, especially if file I/O, | ||||||
| 				a shell command or anything else that takes time | 				a shell command or anything else that takes time | ||||||
| 				is involved. | 				is involved. | ||||||
| 				Note: Traditionally, TermResponseAll was also |  | ||||||
| 				used for "foreground" and "background" |  | ||||||
| 				patterns.  These are now handled as part of |  | ||||||
| 				the "osc" value.  For backwards compatibility, |  | ||||||
| 				the $VIMRUNTIME/plugin/colorresp.vim plugin |  | ||||||
| 				will handle "osc" events and emit |  | ||||||
| 				TermResponseAll autocommand events when it |  | ||||||
| 				encounters "foreground" and "background" |  | ||||||
| 				values. |  | ||||||
| 							*TextChanged* | 							*TextChanged* | ||||||
| TextChanged			After a change was made to the text in the | TextChanged			After a change was made to the text in the | ||||||
| 				current buffer in Normal mode.  That is after | 				current buffer in Normal mode.  That is after | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| *eval.txt*	For Vim version 9.1.  Last change: 2025 Aug 29 | *eval.txt*	For Vim version 9.1.  Last change: 2025 Sep 14 | ||||||
|  |  | ||||||
|  |  | ||||||
| 		  VIM REFERENCE MANUAL	  by Bram Moolenaar | 		  VIM REFERENCE MANUAL	  by Bram Moolenaar | ||||||
| @@ -2896,15 +2896,16 @@ v:termstyleresp	The escape sequence returned by the terminal for the |t_RS| | |||||||
| 					*v:termrbgresp* *termrbgresp-variable* | 					*v:termrbgresp* *termrbgresp-variable* | ||||||
| v:termrbgresp	The escape sequence returned by the terminal for the |t_RB| | v:termrbgresp	The escape sequence returned by the terminal for the |t_RB| | ||||||
| 		termcap entry.  This is used to find out what the terminal | 		termcap entry.  This is used to find out what the terminal | ||||||
| 		background color is; see 'background'.  This is set by the | 		background color is; see 'background'.  When this option is | ||||||
| 		$VIMRUNTIME/plugin/colorresp.vim plugin normally included with | 		set, the TermResponseAll autocommand event is fired, with | ||||||
| 		Vim, but can be set manually if you know what you are doing. | 		<amatch> set to "background". | ||||||
| 		Note that changing this will not do anything. |  | ||||||
|  |  | ||||||
| 					*v:termrfgresp* *termrfgresp-variable* | 					*v:termrfgresp* *termrfgresp-variable* | ||||||
| v:termrfgresp	The escape sequence returned by the terminal for the |t_RF| | v:termrfgresp	The escape sequence returned by the terminal for the |t_RF| | ||||||
| 		termcap entry.  This is used to find out what the terminal | 		termcap entry.  This is used to find out what the terminal | ||||||
| 		foreground color is. Behaves the same as |v:termrbgresp| | 		foreground color is.  When this option is set, the | ||||||
|  | 		TermResponseAll autocommand event is fired, with <amatch> set | ||||||
|  | 		to "foreground". | ||||||
|  |  | ||||||
| 					*v:termu7resp* *termu7resp-variable* | 					*v:termu7resp* *termu7resp-variable* | ||||||
| v:termu7resp	The escape sequence returned by the terminal for the |t_u7| | v:termu7resp	The escape sequence returned by the terminal for the |t_u7| | ||||||
| @@ -2923,9 +2924,7 @@ v:termda1	The escape sequence returned by a primary device attributes | |||||||
| v:termosc	The escape sequence of the most recent OSC response received | v:termosc	The escape sequence of the most recent OSC response received | ||||||
| 		from the terminal.  When this variable is set, the | 		from the terminal.  When this variable is set, the | ||||||
| 		|TermResponseAll| autocommand event is fired, with <amatch> | 		|TermResponseAll| autocommand event is fired, with <amatch> | ||||||
| 		set to "osc".  Also used to set the |v:termrbgresp| and | 		set to "osc". | ||||||
| 		|v:termrfgresp| via the $VIMRUNTIME/plugin/colorresp.vim |  | ||||||
| 		plugin |  | ||||||
|  |  | ||||||
| 					*v:testing* *testing-variable* | 					*v:testing* *testing-variable* | ||||||
| v:testing	Must be set before using `test_garbagecollect_now()`. | v:testing	Must be set before using `test_garbagecollect_now()`. | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| *version9.txt*  For Vim version 9.1.  Last change: 2025 Sep 13 | *version9.txt*  For Vim version 9.1.  Last change: 2025 Sep 14 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 		  VIM REFERENCE MANUAL    by Bram Moolenaar | 		  VIM REFERENCE MANUAL    by Bram Moolenaar | ||||||
| @@ -41759,9 +41759,6 @@ Others: ~ | |||||||
|   Command-line. |   Command-line. | ||||||
| - |min()|/|max()| can handle all comparable data types. | - |min()|/|max()| can handle all comparable data types. | ||||||
| - Vim triggers the |TermResponseAll| autocommand for any terminal OSC value. | - Vim triggers the |TermResponseAll| autocommand for any terminal OSC value. | ||||||
| - Vim includes the $VIMRUNTIME/plugins/colorresp.vim which parses the terminal |  | ||||||
|   OSC response and can trigger a |TermResponseAll| with the "background" or |  | ||||||
|   "foreground" value. |  | ||||||
| 
 | 
 | ||||||
| Platform specific ~ | Platform specific ~ | ||||||
| - MS-Winodws: Paths like "\Windows" and "/Windows" are now considered to be | - MS-Winodws: Paths like "\Windows" and "/Windows" are now considered to be | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ The plugin directory is for standard Vim plugin scripts. | |||||||
| All files here ending in .vim will be sourced by Vim when it starts up. | All files here ending in .vim will be sourced by Vim when it starts up. | ||||||
| Look in the file for hints on how it can be disabled without deleting it. | Look in the file for hints on how it can be disabled without deleting it. | ||||||
|  |  | ||||||
| colorresp.vim	     used to detect terminal background and foreground colours |  | ||||||
| getscriptPlugin.vim  get latest version of Vim scripts | getscriptPlugin.vim  get latest version of Vim scripts | ||||||
| gzip.vim	     edit compressed files | gzip.vim	     edit compressed files | ||||||
| logiPat.vim	     logical operators on patterns | logiPat.vim	     logical operators on patterns | ||||||
|   | |||||||
| @@ -1,51 +0,0 @@ | |||||||
| vim9script |  | ||||||
|  |  | ||||||
| # Vim plugin for setting the background and foreground colours depending on |  | ||||||
| # the terminal response. |  | ||||||
| # |  | ||||||
| # Maintainer:	The Vim Project <https://github.com/vim/vim> |  | ||||||
| # Last Change:	2025 Sep 05 |  | ||||||
|  |  | ||||||
| if exists("g:loaded_colorresp") |  | ||||||
|   finish |  | ||||||
| endif |  | ||||||
| g:loaded_colorresp = 1 |  | ||||||
|  |  | ||||||
| augroup ColorResp |  | ||||||
|   au! |  | ||||||
|   au TermResponseAll osc { |  | ||||||
|     var parts: list<string> = matchlist(v:termosc, '\(\d\+\);rgb:\(\w\+\)/\(\w\+\)/\(\w\+\)') |  | ||||||
|     if len(parts) >= 5 |  | ||||||
|       var type: string = parts[1] |  | ||||||
|       var rval: number = str2nr(parts[2][: 1], 16) |  | ||||||
|       var gval: number = str2nr(parts[3][: 1], 16) |  | ||||||
|       var bval: number = str2nr(parts[4][: 1], 16) |  | ||||||
|  |  | ||||||
|       if type == '11' |  | ||||||
|         # Detect light or dark background by parsing OSC 11 RGB background reply |  | ||||||
|         # from terminal. Sum the RGB values roughly; if bright enough, set |  | ||||||
|         # 'background' to 'light', otherwise set it to 'dark'. |  | ||||||
|         var new_bg_val: string = (3 * char2nr('6') < char2nr(parts[2]) + char2nr(parts[3]) + char2nr(parts[4])) ? "light" : "dark" |  | ||||||
|  |  | ||||||
|         v:termrbgresp = v:termosc |  | ||||||
|         &background = new_bg_val |  | ||||||
|         # For backwards compatibility |  | ||||||
|         if exists('#TermResponseAll#background') |  | ||||||
|           doautocmd <nomodeline> TermResponseAll background |  | ||||||
|         endif |  | ||||||
|       else |  | ||||||
|         v:termrfgresp = v:termosc |  | ||||||
|         # For backwards compatibility |  | ||||||
|         if exists('#TermResponseAll#foreground') |  | ||||||
|           doautocmd <nomodeline> TermResponseAll foreground |  | ||||||
|         endif |  | ||||||
|       endif |  | ||||||
|     endif |  | ||||||
|   } |  | ||||||
|   au VimEnter * ++once { |  | ||||||
|     call echoraw(&t_RB) |  | ||||||
|     call echoraw(&t_RF) |  | ||||||
|   } |  | ||||||
| augroup END |  | ||||||
|  |  | ||||||
| # vim: set sw=2 sts=2 : |  | ||||||
| @@ -141,8 +141,8 @@ static struct vimvar | |||||||
|     {VV_NAME("t_blob",		 VAR_NUMBER), NULL, VV_RO}, |     {VV_NAME("t_blob",		 VAR_NUMBER), NULL, VV_RO}, | ||||||
|     {VV_NAME("t_class",		 VAR_NUMBER), NULL, VV_RO}, |     {VV_NAME("t_class",		 VAR_NUMBER), NULL, VV_RO}, | ||||||
|     {VV_NAME("t_object",	 VAR_NUMBER), NULL, VV_RO}, |     {VV_NAME("t_object",	 VAR_NUMBER), NULL, VV_RO}, | ||||||
|     {VV_NAME("termrfgresp",	 VAR_STRING), NULL, 0}, |     {VV_NAME("termrfgresp",	 VAR_STRING), NULL, VV_RO}, | ||||||
|     {VV_NAME("termrbgresp",	 VAR_STRING), NULL, 0}, |     {VV_NAME("termrbgresp",	 VAR_STRING), NULL, VV_RO}, | ||||||
|     {VV_NAME("termu7resp",	 VAR_STRING), NULL, VV_RO}, |     {VV_NAME("termu7resp",	 VAR_STRING), NULL, VV_RO}, | ||||||
|     {VV_NAME("termstyleresp",	 VAR_STRING), NULL, VV_RO}, |     {VV_NAME("termstyleresp",	 VAR_STRING), NULL, VV_RO}, | ||||||
|     {VV_NAME("termblinkresp",	 VAR_STRING), NULL, VV_RO}, |     {VV_NAME("termblinkresp",	 VAR_STRING), NULL, VV_RO}, | ||||||
|   | |||||||
| @@ -883,6 +883,8 @@ vim_main2(void) | |||||||
|     // Requesting the termresponse is postponed until here, so that a "-c q" |     // Requesting the termresponse is postponed until here, so that a "-c q" | ||||||
|     // argument doesn't make it appear in the shell Vim was started from. |     // argument doesn't make it appear in the shell Vim was started from. | ||||||
|     may_req_termresponse(); |     may_req_termresponse(); | ||||||
|  |  | ||||||
|  |     may_req_bg_color(); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     // start in insert mode |     // start in insert mode | ||||||
|   | |||||||
| @@ -59,6 +59,7 @@ void starttermcap(void); | |||||||
| void stoptermcap(void); | void stoptermcap(void); | ||||||
| void may_req_termresponse(void); | void may_req_termresponse(void); | ||||||
| void check_terminal_behavior(void); | void check_terminal_behavior(void); | ||||||
|  | void may_req_bg_color(void); | ||||||
| int swapping_screen(void); | int swapping_screen(void); | ||||||
| void scroll_start(void); | void scroll_start(void); | ||||||
| void cursor_on_force(void); | void cursor_on_force(void); | ||||||
|   | |||||||
							
								
								
									
										181
									
								
								src/term.c
									
									
									
									
									
								
							
							
						
						
									
										181
									
								
								src/term.c
									
									
									
									
									
								
							| @@ -131,6 +131,19 @@ static termrequest_T u7_status = TERMREQUEST_INIT; | |||||||
| static termrequest_T xcc_status = TERMREQUEST_INIT; | static termrequest_T xcc_status = TERMREQUEST_INIT; | ||||||
|  |  | ||||||
| #ifdef FEAT_TERMRESPONSE | #ifdef FEAT_TERMRESPONSE | ||||||
|  | # ifdef FEAT_TERMINAL | ||||||
|  | // Request foreground color report: | ||||||
|  | static termrequest_T rfg_status = TERMREQUEST_INIT; | ||||||
|  | static int fg_r = 0; | ||||||
|  | static int fg_g = 0; | ||||||
|  | static int fg_b = 0; | ||||||
|  | static int bg_r = 255; | ||||||
|  | static int bg_g = 255; | ||||||
|  | static int bg_b = 255; | ||||||
|  | # endif | ||||||
|  |  | ||||||
|  | // Request background color report: | ||||||
|  | static termrequest_T rbg_status = TERMREQUEST_INIT; | ||||||
|  |  | ||||||
| // Request cursor blinking mode report: | // Request cursor blinking mode report: | ||||||
| static termrequest_T rbm_status = TERMREQUEST_INIT; | static termrequest_T rbm_status = TERMREQUEST_INIT; | ||||||
| @@ -145,6 +158,10 @@ static termrequest_T *all_termrequests[] = { | |||||||
|     &crv_status, |     &crv_status, | ||||||
|     &u7_status, |     &u7_status, | ||||||
|     &xcc_status, |     &xcc_status, | ||||||
|  | # ifdef FEAT_TERMINAL | ||||||
|  |     &rfg_status, | ||||||
|  | # endif | ||||||
|  |     &rbg_status, | ||||||
|     &rbm_status, |     &rbm_status, | ||||||
|     &rcs_status, |     &rcs_status, | ||||||
|     &winpos_status, |     &winpos_status, | ||||||
| @@ -4190,6 +4207,49 @@ check_terminal_behavior(void) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Similar to requesting the version string: Request the terminal background | ||||||
|  |  * color when it is the right moment. | ||||||
|  |  */ | ||||||
|  |     void | ||||||
|  | may_req_bg_color(void) | ||||||
|  | { | ||||||
|  |     if (can_get_termresponse() && starting == 0) | ||||||
|  |     { | ||||||
|  | 	int didit = FALSE; | ||||||
|  |  | ||||||
|  | # ifdef FEAT_TERMINAL | ||||||
|  | 	// Only request foreground if t_RF is set. | ||||||
|  | 	if (rfg_status.tr_progress == STATUS_GET && *T_RFG != NUL) | ||||||
|  | 	{ | ||||||
|  | 	    MAY_WANT_TO_LOG_THIS; | ||||||
|  | 	    LOG_TR1("Sending FG request"); | ||||||
|  | 	    out_str(T_RFG); | ||||||
|  | 	    termrequest_sent(&rfg_status); | ||||||
|  | 	    didit = TRUE; | ||||||
|  | 	} | ||||||
|  | # endif | ||||||
|  |  | ||||||
|  | 	// Only request background if t_RB is set. | ||||||
|  | 	if (rbg_status.tr_progress == STATUS_GET && *T_RBG != NUL) | ||||||
|  | 	{ | ||||||
|  | 	    MAY_WANT_TO_LOG_THIS; | ||||||
|  | 	    LOG_TR1("Sending BG request"); | ||||||
|  | 	    out_str(T_RBG); | ||||||
|  | 	    termrequest_sent(&rbg_status); | ||||||
|  | 	    didit = TRUE; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (didit) | ||||||
|  | 	{ | ||||||
|  | 	    // check for the characters now, otherwise they might be eaten by | ||||||
|  | 	    // get_keystroke() | ||||||
|  | 	    out_flush(); | ||||||
|  | 	    (void)vpeekc_nomap(); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -4983,6 +5043,8 @@ handle_u7_response(int *arg, char_u *tp UNUSED, int csi_len UNUSED) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Handle a response to T_CRV: {lead}{first}{x};{vers};{y}c |  * Handle a response to T_CRV: {lead}{first}{x};{vers};{y}c | ||||||
|  * Xterm and alike use '>' for {first}. |  * Xterm and alike use '>' for {first}. | ||||||
| @@ -5743,6 +5805,93 @@ handle_csi( | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void | ||||||
|  | check_for_color_response(char_u *resp, int len) | ||||||
|  | { | ||||||
|  |     int		i, j; | ||||||
|  |     char_u	*argp; | ||||||
|  |  | ||||||
|  |     j = 1 + (resp[0] == ESC); | ||||||
|  |     argp = resp + j; | ||||||
|  |  | ||||||
|  |     if (len >= j + 3 && (argp[0] != '1' | ||||||
|  | 			     || (argp[1] != '1' && argp[1] != '0') | ||||||
|  | 			     || argp[2] != ';')) | ||||||
|  | 	i = 0; // no match | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  | 	for (i = j; i < len; ++i) | ||||||
|  | 	    if (resp[i] == '\007' || (resp[0] == OSC ? resp[i] == STERM | ||||||
|  | 			: (resp[i] == ESC && i + 1 < len && resp[i + 1] == '\\'))) | ||||||
|  | 	    { | ||||||
|  | 		int is_bg = argp[1] == '1'; | ||||||
|  | 		int is_4digit = i - j >= 21 && resp[j + 11] == '/' | ||||||
|  | 						  && resp[j + 16] == '/'; | ||||||
|  |  | ||||||
|  | 		if (i - j >= 15 && STRNCMP(resp + j + 3, "rgb:", 4) == 0 | ||||||
|  | 			    && (is_4digit | ||||||
|  | 				   || (resp[j + 9] == '/' && resp[j + 12] == '/'))) | ||||||
|  | 		{ | ||||||
|  | 		    char_u *tp_r = resp + j + 7; | ||||||
|  | 		    char_u *tp_g = resp + j + (is_4digit ? 12 : 10); | ||||||
|  | 		    char_u *tp_b = resp + j + (is_4digit ? 17 : 13); | ||||||
|  | #if defined(FEAT_TERMRESPONSE) && defined(FEAT_TERMINAL) | ||||||
|  | 		    int rval, gval, bval; | ||||||
|  |  | ||||||
|  | 		    rval = hexhex2nr(tp_r); | ||||||
|  | 		    gval = hexhex2nr(tp_g); | ||||||
|  | 		    bval = hexhex2nr(tp_b); | ||||||
|  | #endif | ||||||
|  | 		    if (is_bg) | ||||||
|  | 		    { | ||||||
|  | 			char *new_bg_val = (3 * '6' < *tp_r + *tp_g + | ||||||
|  | 					     *tp_b) ? "light" : "dark"; | ||||||
|  |  | ||||||
|  | 			LOG_TRN("Received RBG response: %s", tp); | ||||||
|  | #ifdef FEAT_TERMRESPONSE | ||||||
|  | 			rbg_status.tr_progress = STATUS_GOT; | ||||||
|  | # ifdef FEAT_TERMINAL | ||||||
|  | 			bg_r = rval; | ||||||
|  | 			bg_g = gval; | ||||||
|  | 			bg_b = bval; | ||||||
|  | # endif | ||||||
|  | #endif | ||||||
|  | 			if (!option_was_set((char_u *)"bg") | ||||||
|  | 				      && STRCMP(p_bg, new_bg_val) != 0) | ||||||
|  | 			{ | ||||||
|  | 			    // value differs, apply it | ||||||
|  | 			    set_option_value_give_err((char_u *)"bg", | ||||||
|  | 						  0L, (char_u *)new_bg_val, 0); | ||||||
|  | 			    reset_option_was_set((char_u *)"bg"); | ||||||
|  | 			    redraw_asap(UPD_CLEAR); | ||||||
|  | 			} | ||||||
|  | 		    } | ||||||
|  | #if defined(FEAT_TERMRESPONSE) && defined(FEAT_TERMINAL) | ||||||
|  | 		    else | ||||||
|  | 		    { | ||||||
|  | 			LOG_TRN("Received RFG response: %s", tp); | ||||||
|  | 			rfg_status.tr_progress = STATUS_GOT; | ||||||
|  | 			fg_r = rval; | ||||||
|  | 			fg_g = gval; | ||||||
|  | 			fg_b = bval; | ||||||
|  | 		    } | ||||||
|  | #endif | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | #ifdef FEAT_EVAL | ||||||
|  | 		set_vim_var_string(is_bg ? VV_TERMRBGRESP | ||||||
|  | 						  : VV_TERMRFGRESP, resp, len); | ||||||
|  | #endif | ||||||
|  | 		apply_autocmds(EVENT_TERMRESPONSEALL, | ||||||
|  | 			is_bg ? (char_u *)"background" : (char_u *)"foreground", | ||||||
|  | 			NULL, FALSE, curbuf); | ||||||
|  | 		break; | ||||||
|  | 	    } | ||||||
|  |     } | ||||||
|  |     if (i == len) | ||||||
|  | 	LOG_TR1("not enough characters for RB"); | ||||||
|  | } | ||||||
|  |  | ||||||
| static oscstate_T osc_state; | static oscstate_T osc_state; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -5803,6 +5952,9 @@ handle_osc(char_u *tp, int len, char_u *key_name, int *slen) | |||||||
| #ifdef FEAT_EVAL | #ifdef FEAT_EVAL | ||||||
| 	    set_vim_var_string_direct(VV_TERMOSC, osc_state.buf.ga_data); | 	    set_vim_var_string_direct(VV_TERMOSC, osc_state.buf.ga_data); | ||||||
| #endif | #endif | ||||||
|  | 	    // Check for background/foreground colour response | ||||||
|  | 	    check_for_color_response(osc_state.buf.ga_data, osc_state.buf.ga_len - 1); | ||||||
|  |  | ||||||
| 	    char_u savebg = *p_bg; | 	    char_u savebg = *p_bg; | ||||||
| 	    apply_autocmds(EVENT_TERMRESPONSEALL, (char_u *)"osc", | 	    apply_autocmds(EVENT_TERMRESPONSEALL, (char_u *)"osc", | ||||||
| 		    NULL, FALSE, curbuf); | 		    NULL, FALSE, curbuf); | ||||||
| @@ -6584,28 +6736,18 @@ handle_osc: | |||||||
| } | } | ||||||
|  |  | ||||||
| #if (defined(FEAT_TERMINAL) && defined(FEAT_TERMRESPONSE)) || defined(PROTO) | #if (defined(FEAT_TERMINAL) && defined(FEAT_TERMRESPONSE)) || defined(PROTO) | ||||||
|  |  | ||||||
|     static void |  | ||||||
| term_get_color(char_u *str, char_u *r, char_u *g, char_u *b) |  | ||||||
| { |  | ||||||
|     char_u rn[3], gn[3], bn[3]; |  | ||||||
|  |  | ||||||
|     if (sscanf((char *)str, "%*[^:]:%2s%*[^/]/%2s%*[^/]/%2s", |  | ||||||
| 		(char *)&rn, (char *)&gn, (char *)&bn) != 3) |  | ||||||
| 	return; |  | ||||||
|  |  | ||||||
|     *r = hexhex2nr(rn); |  | ||||||
|     *g = hexhex2nr(gn); |  | ||||||
|     *b = hexhex2nr(bn); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Get the text foreground color, if known. |  * Get the text foreground color, if known. | ||||||
|  */ |  */ | ||||||
|     void |     void | ||||||
| term_get_fg_color(char_u *r, char_u *g, char_u *b) | term_get_fg_color(char_u *r, char_u *g, char_u *b) | ||||||
| { | { | ||||||
|     term_get_color(get_vim_var_str(VV_TERMRFGRESP), r, g, b); |     if (rfg_status.tr_progress != STATUS_GOT) | ||||||
|  | 	return; | ||||||
|  |  | ||||||
|  |     *r = fg_r; | ||||||
|  |     *g = fg_g; | ||||||
|  |     *b = fg_b; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -6614,7 +6756,12 @@ term_get_fg_color(char_u *r, char_u *g, char_u *b) | |||||||
|     void |     void | ||||||
| term_get_bg_color(char_u *r, char_u *g, char_u *b) | term_get_bg_color(char_u *r, char_u *g, char_u *b) | ||||||
| { | { | ||||||
|     term_get_color(get_vim_var_str(VV_TERMRBGRESP), r, g, b); |     if (rbg_status.tr_progress != STATUS_GOT) | ||||||
|  | 	return; | ||||||
|  |  | ||||||
|  |     *r = bg_r; | ||||||
|  |     *g = bg_g; | ||||||
|  |     *b = bg_b; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -252,7 +252,6 @@ NEW_TESTS = \ | |||||||
| 	test_plugin_tohtml \ | 	test_plugin_tohtml \ | ||||||
| 	test_plugin_tutor \ | 	test_plugin_tutor \ | ||||||
| 	test_plugin_zip \ | 	test_plugin_zip \ | ||||||
| 	test_plugin_colorresp \ |  | ||||||
| 	test_plus_arg_edit \ | 	test_plus_arg_edit \ | ||||||
| 	test_popup \ | 	test_popup \ | ||||||
| 	test_popupwin \ | 	test_popupwin \ | ||||||
| @@ -526,7 +525,6 @@ NEW_TESTS_RES = \ | |||||||
| 	test_plugin_tohtml.res \ | 	test_plugin_tohtml.res \ | ||||||
| 	test_plugin_tutor.res \ | 	test_plugin_tutor.res \ | ||||||
| 	test_plugin_zip.res \ | 	test_plugin_zip.res \ | ||||||
| 	test_plugin_colorresp.res \ |  | ||||||
| 	test_plus_arg_edit.res \ | 	test_plus_arg_edit.res \ | ||||||
| 	test_popup.res \ | 	test_popup.res \ | ||||||
| 	test_popupwin.res \ | 	test_popupwin.res \ | ||||||
|   | |||||||
| @@ -1,74 +0,0 @@ | |||||||
| " Test for the colorresp plugin |  | ||||||
|  |  | ||||||
| CheckNotGui |  | ||||||
| CheckUnix |  | ||||||
|  |  | ||||||
| runtime plugin/colorresp.vim |  | ||||||
|  |  | ||||||
| func Test_colorresp() |  | ||||||
|     set t_RF=x |  | ||||||
|     set t_RB=y |  | ||||||
|  |  | ||||||
|     " response to t_RF, 4 digits |  | ||||||
|     let red = 0x12 |  | ||||||
|     let green = 0x34 |  | ||||||
|     let blue = 0x56 |  | ||||||
|     let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrfgresp) |  | ||||||
|     " call WaitForAssert({-> assert_equal(seq, v:termrfgresp)}) |  | ||||||
|  |  | ||||||
|     " response to t_RF, 2 digits |  | ||||||
|     let red = 0x78 |  | ||||||
|     let green = 0x9a |  | ||||||
|     let blue = 0xbc |  | ||||||
|     let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrfgresp) |  | ||||||
|  |  | ||||||
|     " response to t_RB, 4 digits, dark |  | ||||||
|     set background=light |  | ||||||
|     call test_option_not_set('background') |  | ||||||
|     let red = 0x29 |  | ||||||
|     let green = 0x4a |  | ||||||
|     let blue = 0x6b |  | ||||||
|     let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrbgresp) |  | ||||||
|     call assert_equal('dark', &background) |  | ||||||
|  |  | ||||||
|     " response to t_RB, 4 digits, light |  | ||||||
|     set background=dark |  | ||||||
|     call test_option_not_set('background') |  | ||||||
|     let red = 0x81 |  | ||||||
|     let green = 0x63 |  | ||||||
|     let blue = 0x65 |  | ||||||
|     let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrbgresp) |  | ||||||
|     call assert_equal('light', &background) |  | ||||||
|  |  | ||||||
|     " response to t_RB, 2 digits, dark |  | ||||||
|     set background=light |  | ||||||
|     call test_option_not_set('background') |  | ||||||
|     let red = 0x47 |  | ||||||
|     let green = 0x59 |  | ||||||
|     let blue = 0x5b |  | ||||||
|     let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrbgresp) |  | ||||||
|     call assert_equal('dark', &background) |  | ||||||
|  |  | ||||||
|     " response to t_RB, 2 digits, light |  | ||||||
|     set background=dark |  | ||||||
|     call test_option_not_set('background') |  | ||||||
|     let red = 0x83 |  | ||||||
|     let green = 0xa4 |  | ||||||
|     let blue = 0xc2 |  | ||||||
|     let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue) |  | ||||||
|     call feedkeys(seq, 'Lx!') |  | ||||||
|     call assert_equal(seq, v:termrbgresp) |  | ||||||
|     call assert_equal('light', &background) |  | ||||||
|  |  | ||||||
|     set t_RF= t_RB= |  | ||||||
|   endfunc |  | ||||||
| @@ -2790,4 +2790,72 @@ func Test_term_response_osc() | |||||||
|   call assert_equal("\<Esc>]15;hello world!\x07", v:termosc) |   call assert_equal("\<Esc>]15;hello world!\x07", v:termosc) | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
|  | " This only checks if the sequence is recognized. | ||||||
|  | func Test_term_rgb_response() | ||||||
|  |   set t_RF=x | ||||||
|  |   set t_RB=y | ||||||
|  |  | ||||||
|  |   " response to t_RF, 4 digits | ||||||
|  |   let red = 0x12 | ||||||
|  |   let green = 0x34 | ||||||
|  |   let blue = 0x56 | ||||||
|  |   let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrfgresp) | ||||||
|  |  | ||||||
|  |   " response to t_RF, 2 digits | ||||||
|  |   let red = 0x78 | ||||||
|  |   let green = 0x9a | ||||||
|  |   let blue = 0xbc | ||||||
|  |   let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrfgresp) | ||||||
|  |  | ||||||
|  |   " response to t_RB, 4 digits, dark | ||||||
|  |   set background=light | ||||||
|  |   eval 'background'->test_option_not_set() | ||||||
|  |   let red = 0x29 | ||||||
|  |   let green = 0x4a | ||||||
|  |   let blue = 0x6b | ||||||
|  |   let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrbgresp) | ||||||
|  |   call assert_equal('dark', &background) | ||||||
|  |  | ||||||
|  |   " response to t_RB, 4 digits, light | ||||||
|  |   set background=dark | ||||||
|  |   call test_option_not_set('background') | ||||||
|  |   let red = 0x81 | ||||||
|  |   let green = 0x63 | ||||||
|  |   let blue = 0x65 | ||||||
|  |   let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrbgresp) | ||||||
|  |   call assert_equal('light', &background) | ||||||
|  |  | ||||||
|  |   " response to t_RB, 2 digits, dark | ||||||
|  |   set background=light | ||||||
|  |   call test_option_not_set('background') | ||||||
|  |   let red = 0x47 | ||||||
|  |   let green = 0x59 | ||||||
|  |   let blue = 0x5b | ||||||
|  |   let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrbgresp) | ||||||
|  |   call assert_equal('dark', &background) | ||||||
|  |  | ||||||
|  |   " response to t_RB, 2 digits, light | ||||||
|  |   set background=dark | ||||||
|  |   call test_option_not_set('background') | ||||||
|  |   let red = 0x83 | ||||||
|  |   let green = 0xa4 | ||||||
|  |   let blue = 0xc2 | ||||||
|  |   let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue) | ||||||
|  |   call feedkeys(seq, 'Lx!') | ||||||
|  |   call assert_equal(seq, v:termrbgresp) | ||||||
|  |   call assert_equal('light', &background) | ||||||
|  |  | ||||||
|  |   set t_RF= t_RB= | ||||||
|  | endfunc | ||||||
|  |  | ||||||
| " vim: shiftwidth=2 sts=2 expandtab | " vim: shiftwidth=2 sts=2 expandtab | ||||||
|   | |||||||
| @@ -724,6 +724,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     1757, | ||||||
| /**/ | /**/ | ||||||
|     1756, |     1756, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user