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 { | |||
114 | MODE_ECHO = 1024, | 114 | MODE_ECHO = 1024, |
115 | MODE_APPCURSOR = 2048, | 115 | MODE_APPCURSOR = 2048, |
116 | MODE_MOUSESGR = 4096, | 116 | MODE_MOUSESGR = 4096, |
117 | MODE_8BIT = 8192, | ||
117 | }; | 118 | }; |
118 | 119 | ||
119 | enum escape_state { | 120 | enum escape_state { |
@@ -1650,6 +1651,9 @@ tsetmode(bool priv, bool set, int *args, int narg) { | |||
1650 | case 1006: | 1651 | case 1006: |
1651 | MODBIT(term.mode, set, MODE_MOUSESGR); | 1652 | MODBIT(term.mode, set, MODE_MOUSESGR); |
1652 | break; | 1653 | break; |
1654 | case 1034: | ||
1655 | MODBIT(term.mode, set, MODE_8BIT); | ||
1656 | break; | ||
1653 | case 1049: /* = 1047 and 1048 */ | 1657 | case 1049: /* = 1047 and 1048 */ |
1654 | case 47: | 1658 | case 47: |
1655 | case 1047: | 1659 | case 1047: |
@@ -3228,7 +3232,8 @@ kpress(XEvent *ev) { | |||
3228 | XKeyEvent *e = &ev->xkey; | 3232 | XKeyEvent *e = &ev->xkey; |
3229 | KeySym ksym; | 3233 | KeySym ksym; |
3230 | char xstr[31], buf[32], *customkey, *cp = buf; | 3234 | char xstr[31], buf[32], *customkey, *cp = buf; |
3231 | int len; | 3235 | int len, ret; |
3236 | long c; | ||
3232 | Status status; | 3237 | Status status; |
3233 | Shortcut *bp; | 3238 | Shortcut *bp; |
3234 | 3239 | ||
@@ -3249,13 +3254,23 @@ kpress(XEvent *ev) { | |||
3249 | if((customkey = kmap(ksym, e->state))) { | 3254 | if((customkey = kmap(ksym, e->state))) { |
3250 | len = strlen(customkey); | 3255 | len = strlen(customkey); |
3251 | memcpy(buf, customkey, len); | 3256 | memcpy(buf, customkey, len); |
3252 | /* 2. hardcoded (overrides X lookup) */ | 3257 | /* 3. hardcoded (overrides X lookup) */ |
3253 | } else { | 3258 | } else { |
3254 | if(len == 0) | 3259 | if(len == 0) |
3255 | return; | 3260 | return; |
3256 | 3261 | ||
3257 | if(len == 1 && e->state & Mod1Mask) | 3262 | if(len == 1 && e->state & Mod1Mask) { |
3258 | *cp++ = '\033'; | 3263 | if(IS_SET(MODE_8BIT)) { |
3264 | if(*xstr < 0177) { | ||
3265 | c = *xstr | B7; | ||
3266 | ret = utf8encode(&c, cp); | ||
3267 | cp += ret; | ||
3268 | len = 0; | ||
3269 | } | ||
3270 | } else { | ||
3271 | *cp++ = '\033'; | ||
3272 | } | ||
3273 | } | ||
3259 | 3274 | ||
3260 | memcpy(cp, xstr, len); | 3275 | memcpy(cp, xstr, len); |
3261 | len = cp - buf + len; | 3276 | len = cp - buf + len; |