JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Implementing 8 bit mode for meta.
authorChristoph Lohmann <20h@r-36.net>
Tue, 23 Apr 2013 13:22:14 +0000 (15:22 +0200)
committerChristoph Lohmann <20h@r-36.net>
Tue, 23 Apr 2013 13:22:14 +0000 (15:22 +0200)
st.c
st.info

diff --git a/st.c b/st.c
index 71e5b83..f593302 100644 (file)
--- a/st.c
+++ b/st.c
@@ -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;
diff --git a/st.info b/st.info
index 1c83dc1..26db8cc 100644 (file)
--- a/st.info
+++ b/st.info
@@ -147,6 +147,7 @@ st| simpleterm,
        kich1=\E[2~,
        knp=\E[6~,
        kmous=\E[M,
+       km,
        kpp=\E[5~,
        lines#24,
        mir,
@@ -162,6 +163,7 @@ st| simpleterm,
        rmcup=\E[?1049l,
        rmir=\E[4l,
        rmkx=\E[?1l\E>,
+       rmm=\E[?1034l,
        rmso=\E[27m,
        rmul=\E[m,
        rs1=\Ec,
@@ -178,6 +180,7 @@ st| simpleterm,
        smcup=\E[?1049h,
        smir=\E[4h,
        smkx=\E[?1h\E=,
+       smm=\E[?1034h,
        smso=\E[7m,
        smul=\E[4m,
        tbc=\E[3g,