diff options
Diffstat (limited to 'st.c')
| -rw-r--r-- | st.c | 23 | 
1 files changed, 19 insertions, 4 deletions
@@ -114,6 +114,7 @@ enum term_mode {  	MODE_ECHO	 = 1024,  	MODE_APPCURSOR	 = 2048,  	MODE_MOUSESGR    = 4096, +	MODE_8BIT	 = 8192,  };  enum escape_state { @@ -1650,6 +1651,9 @@ tsetmode(bool priv, bool set, int *args, int narg) {  			case 1006:  				MODBIT(term.mode, set, MODE_MOUSESGR);  				break; +			case 1034: +				MODBIT(term.mode, set, MODE_8BIT); +				break;  			case 1049: /* = 1047 and 1048 */  			case 47:  			case 1047: @@ -3228,7 +3232,8 @@ kpress(XEvent *ev) {  	XKeyEvent *e = &ev->xkey;  	KeySym ksym;  	char xstr[31], buf[32], *customkey, *cp = buf; -	int len; +	int len, ret; +	long c;  	Status status;  	Shortcut *bp; @@ -3249,13 +3254,23 @@ kpress(XEvent *ev) {  	if((customkey = kmap(ksym, e->state))) {  		len = strlen(customkey);  		memcpy(buf, customkey, len); -	/* 2. hardcoded (overrides X lookup) */ +	/* 3. hardcoded (overrides X lookup) */  	} else {  		if(len == 0)  			return; -		if(len == 1 && e->state & Mod1Mask) -			*cp++ = '\033'; +		if(len == 1 && e->state & Mod1Mask) { +			if(IS_SET(MODE_8BIT)) { +				if(*xstr < 0177) { +					c = *xstr | B7; +					ret = utf8encode(&c, cp); +					cp += ret; +					len = 0; +				} +			} else { +				*cp++ = '\033'; +			} +		}  		memcpy(cp, xstr, len);  		len = cp - buf + len;  | 
