mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 17:24:18 +00:00 
			
		
		
		
	Fixes for extended keys: 1) allow C-x and C-X to be bound separately
since some terminals report them differently 2) use the "backspace" option to translate backspace 3) map ctrl which are have the ctrl implied (such as C-x) properly when the terminal reports both the key and the modifier. Note that any key bindings for C-X where C-x is meant must now be changed.
This commit is contained in:
		
							
								
								
									
										18
									
								
								key-string.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								key-string.c
									
									
									
									
									
								
							@@ -45,9 +45,9 @@ static const struct {
 | 
			
		||||
	{ "F11",	KEYC_F11|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "F12",	KEYC_F12|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "IC",		KEYC_IC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "Insert",     KEYC_IC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "Insert",	KEYC_IC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "DC",		KEYC_DC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "Delete",     KEYC_DC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "Delete",	KEYC_DC|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "Home",	KEYC_HOME|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "End",	KEYC_END|KEYC_IMPLIED_META },
 | 
			
		||||
	{ "NPage",	KEYC_NPAGE|KEYC_IMPLIED_META },
 | 
			
		||||
@@ -70,7 +70,7 @@ static const struct {
 | 
			
		||||
	{ "Right",	KEYC_RIGHT|KEYC_CURSOR|KEYC_IMPLIED_META },
 | 
			
		||||
 | 
			
		||||
	/* Numeric keypad. */
 | 
			
		||||
	{ "KP/", 	KEYC_KP_SLASH|KEYC_KEYPAD },
 | 
			
		||||
	{ "KP/",	KEYC_KP_SLASH|KEYC_KEYPAD },
 | 
			
		||||
	{ "KP*",	KEYC_KP_STAR|KEYC_KEYPAD },
 | 
			
		||||
	{ "KP-",	KEYC_KP_MINUS|KEYC_KEYPAD },
 | 
			
		||||
	{ "KP7",	KEYC_KP_SEVEN|KEYC_KEYPAD },
 | 
			
		||||
@@ -164,7 +164,7 @@ key_string_get_modifiers(const char **string)
 | 
			
		||||
key_code
 | 
			
		||||
key_string_lookup_string(const char *string)
 | 
			
		||||
{
 | 
			
		||||
	static const char	*other = "!#()+,-.0123456789:;<=>'\r\t";
 | 
			
		||||
	static const char	*other = "!#()+,-.0123456789:;<=>'\r\t\177";
 | 
			
		||||
	key_code		 key, modifiers;
 | 
			
		||||
	u_int			 u, i;
 | 
			
		||||
	struct utf8_data	 ud, *udp;
 | 
			
		||||
@@ -181,8 +181,8 @@ key_string_lookup_string(const char *string)
 | 
			
		||||
 | 
			
		||||
	/* Is this a hexadecimal value? */
 | 
			
		||||
	if (string[0] == '0' && string[1] == 'x') {
 | 
			
		||||
	        if (sscanf(string + 2, "%x", &u) != 1)
 | 
			
		||||
	                return (KEYC_UNKNOWN);
 | 
			
		||||
		if (sscanf(string + 2, "%x", &u) != 1)
 | 
			
		||||
			return (KEYC_UNKNOWN);
 | 
			
		||||
		mlen = wctomb(m, u);
 | 
			
		||||
		if (mlen <= 0 || mlen > MB_LEN_MAX)
 | 
			
		||||
			return (KEYC_UNKNOWN);
 | 
			
		||||
@@ -238,11 +238,11 @@ key_string_lookup_string(const char *string)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Convert the standard control keys. */
 | 
			
		||||
	if (key < KEYC_BASE && (modifiers & KEYC_CTRL) && !strchr(other, key)) {
 | 
			
		||||
	if (key < KEYC_BASE && (modifiers & KEYC_CTRL) &&
 | 
			
		||||
	    strchr(other, key) == NULL &&
 | 
			
		||||
	    (key < 64 || key > 95)) {
 | 
			
		||||
		if (key >= 97 && key <= 122)
 | 
			
		||||
			key -= 96;
 | 
			
		||||
		else if (key >= 64 && key <= 95)
 | 
			
		||||
			key -= 64;
 | 
			
		||||
		else if (key == 32)
 | 
			
		||||
			key = 0;
 | 
			
		||||
		else if (key == 63)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user