mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Move "special" keys into the Unicode PUA rather than making them high a top bit
set, some compilers cannot handle enums that are larger than int. GitHub issue 2673.
This commit is contained in:
		@@ -476,7 +476,7 @@ input_key(struct screen *s, struct bufferevent *bev, key_code key)
 | 
			
		||||
		input_key_write(__func__, bev, &ud.data[0], 1);
 | 
			
		||||
		return (0);
 | 
			
		||||
	}
 | 
			
		||||
	if (justkey > 0x7f && justkey < KEYC_BASE) {
 | 
			
		||||
	if (KEYC_IS_UNICODE(justkey)) {
 | 
			
		||||
		if (key & KEYC_META)
 | 
			
		||||
			input_key_write(__func__, bev, "\033", 1);
 | 
			
		||||
		utf8_to_data(justkey, &ud);
 | 
			
		||||
 
 | 
			
		||||
@@ -238,7 +238,7 @@ key_string_lookup_string(const char *string)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Convert the standard control keys. */
 | 
			
		||||
	if (key < KEYC_BASE &&
 | 
			
		||||
	if (KEYC_IS_UNICODE(key) &&
 | 
			
		||||
	    (modifiers & KEYC_CTRL) &&
 | 
			
		||||
	    strchr(other, key) == NULL &&
 | 
			
		||||
	    key != 9 &&
 | 
			
		||||
@@ -368,8 +368,8 @@ key_string_lookup_key(key_code key, int with_flags)
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Is this a UTF-8 key? */
 | 
			
		||||
	if (key > 127 && key < KEYC_BASE) {
 | 
			
		||||
	/* Is this a Unicode key? */
 | 
			
		||||
	if (KEYC_IS_UNICODE(key)) {
 | 
			
		||||
		utf8_to_data(key, &ud);
 | 
			
		||||
		off = strlen(out);
 | 
			
		||||
		memcpy(out + off, ud.data, ud.size);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								status.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								status.c
									
									
									
									
									
								
							@@ -1300,7 +1300,7 @@ process_key:
 | 
			
		||||
	return (0);
 | 
			
		||||
 | 
			
		||||
append_key:
 | 
			
		||||
	if (key <= 0x1f || key >= KEYC_BASE)
 | 
			
		||||
	if (key <= 0x1f || (key >= KEYC_BASE && key < KEYC_BASE_END))
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (key <= 0x7f)
 | 
			
		||||
		utf8_set(&tmp, key);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								tmux.h
									
									
									
									
									
								
							@@ -109,11 +109,16 @@ struct winlink;
 | 
			
		||||
#define VISUAL_ON 1
 | 
			
		||||
#define VISUAL_BOTH 2
 | 
			
		||||
 | 
			
		||||
/* Special key codes. */
 | 
			
		||||
#define KEYC_NONE            0x00ff000000000ULL
 | 
			
		||||
#define KEYC_UNKNOWN         0x00fe000000000ULL
 | 
			
		||||
#define KEYC_BASE            0x0001000000000ULL
 | 
			
		||||
#define KEYC_USER            0x0002000000000ULL
 | 
			
		||||
/* No key or unknown key. */
 | 
			
		||||
#define KEYC_NONE            0x000ff000000000ULL
 | 
			
		||||
#define KEYC_UNKNOWN         0x000fe000000000ULL
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Base for special (that is, not Unicode) keys. An enum must be at most a
 | 
			
		||||
 * signed int, so these are based in the highest Unicode PUA.
 | 
			
		||||
 */
 | 
			
		||||
#define KEYC_BASE            0x0000000010e000ULL
 | 
			
		||||
#define KEYC_USER            0x0000000010f000ULL
 | 
			
		||||
 | 
			
		||||
/* Key modifier bits. */
 | 
			
		||||
#define KEYC_META            0x00100000000000ULL
 | 
			
		||||
@@ -136,8 +141,15 @@ struct winlink;
 | 
			
		||||
#define KEYC_NUSER 1000
 | 
			
		||||
 | 
			
		||||
/* Is this a mouse key? */
 | 
			
		||||
#define KEYC_IS_MOUSE(key) (((key) & KEYC_MASK_KEY) >= KEYC_MOUSE &&	\
 | 
			
		||||
    ((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
 | 
			
		||||
#define KEYC_IS_MOUSE(key) \
 | 
			
		||||
	(((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
 | 
			
		||||
	 ((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
 | 
			
		||||
 | 
			
		||||
/* Is this a Unicode key? */
 | 
			
		||||
#define KEYC_IS_UNICODE(key) \
 | 
			
		||||
	(((key) & KEYC_MASK_KEY) > 0x7f && \
 | 
			
		||||
	 (((key) & KEYC_MASK_KEY) < KEYC_BASE || \
 | 
			
		||||
	  ((key) & KEYC_MASK_KEY) >= KEYC_BASE_END))
 | 
			
		||||
 | 
			
		||||
/* Multiple click timeout. */
 | 
			
		||||
#define KEYC_CLICK_TIMEOUT 300
 | 
			
		||||
@@ -159,8 +171,8 @@ struct winlink;
 | 
			
		||||
	{ #s "Border", KEYC_ ## name ## _BORDER }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * A single key. This can be ASCII or Unicode or one of the keys starting at
 | 
			
		||||
 * KEYC_BASE.
 | 
			
		||||
 * A single key. This can be ASCII or Unicode or one of the keys between
 | 
			
		||||
 * KEYC_BASE and KEYC_BASE_END.
 | 
			
		||||
 */
 | 
			
		||||
typedef unsigned long long key_code;
 | 
			
		||||
 | 
			
		||||
@@ -253,6 +265,9 @@ enum {
 | 
			
		||||
	KEYC_KP_ENTER,
 | 
			
		||||
	KEYC_KP_ZERO,
 | 
			
		||||
	KEYC_KP_PERIOD,
 | 
			
		||||
 | 
			
		||||
	/* End of special keys. */
 | 
			
		||||
	KEYC_BASE_END
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Termcap codes. */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user