Implementing 8 bit mode for meta. - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 2bd6afd1c9eb341d9e2c5d89bc16bb7758691e1f
 (DIR) parent b596d6ba3c50bc379adc298a4e2ba7c122b116ab
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Tue, 23 Apr 2013 15:22:14 +0200
       
       Implementing 8 bit mode for meta.
       
       Diffstat:
         M st.c                                |      23 +++++++++++++++++++----
         M st.info                             |       3 +++
       
       2 files changed, 22 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git 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;
 (DIR) diff --git 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,