Allow control characters inside escape sequences - 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 3af49e34f666554fcd52a52a7ca15f3e7eafa197
 (DIR) parent a7d7e29300acade90f2025f0b85fa5eae06edb24
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Wed, 26 Sep 2012 20:55:18 +0200
       
       Allow control characters inside escape sequences
       
       Taken from vt100 manual programmer:
       
               Control characters (codes \0 to \37 inclusive) are specifically
               excluded from the control sequence syntax, but may be embedded
               within a control sequence. Embedded control characters are executed
               as soon as they are encountered by the VT100. The processing of the
               control sequence then continues with the next character received.
       ---
        st.c |   68 +++++++++++++++++++++++++++++++++---------------------------------
        1 file changed, 34 insertions(+), 34 deletions(-)
       Diffstat:
         M st.c                                |      68 ++++++++++++++++----------------
       
       1 file changed, 34 insertions(+), 34 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -1668,6 +1668,32 @@ tputc(char *c, int len) {
                if(iofd != -1)
                        write(iofd, c, len);
        
       +        switch(ascii) {
       +        case '\t':
       +                tputtab(1);
       +                return;
       +        case '\b':
       +                tmoveto(term.c.x-1, term.c.y);
       +                return;
       +        case '\r':
       +                tmoveto(0, term.c.y);
       +                return;
       +        case '\f':
       +        case '\v':
       +        case '\n':
       +                /* go to first col if the mode is set */
       +                tnewline(IS_SET(MODE_CRLF));
       +                return;
       +        case '\a':
       +                if(!(xw.state & WIN_FOCUSED))
       +                        xseturgency(1);
       +                return;
       +        case '\033':
       +                csireset();
       +                term.esc = ESC_START;
       +                return;
       +        }
       +
                if(term.esc & ESC_START) {
                        if(term.esc & ESC_CSI) {
                                csiescseq.buf[csiescseq.len++] = ascii;
       @@ -1791,40 +1817,14 @@ tputc(char *c, int len) {
                } else {
                        if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
                                sel.bx = -1;
       -                switch(ascii) {
       -                case '\t':
       -                        tputtab(1);
       -                        break;
       -                case '\b':
       -                        tmoveto(term.c.x-1, term.c.y);
       -                        break;
       -                case '\r':
       -                        tmoveto(0, term.c.y);
       -                        break;
       -                case '\f':
       -                case '\v':
       -                case '\n':
       -                        /* go to first col if the mode is set */
       -                        tnewline(IS_SET(MODE_CRLF));
       -                        break;
       -                case '\a':
       -                        if(!(xw.state & WIN_FOCUSED))
       -                                xseturgency(1);
       -                        break;
       -                case '\033':
       -                        csireset();
       -                        term.esc = ESC_START;
       -                        break;
       -                default:
       -                        if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
       -                                if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
       -                                        tnewline(1); /* always go to first col */
       -                                tsetchar(c);
       -                                if(term.c.x+1 < term.col)
       -                                        tmoveto(term.c.x+1, term.c.y);
       -                                else
       -                                        term.c.state |= CURSOR_WRAPNEXT;
       -                        }
       +                if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
       +                        if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
       +                                tnewline(1); /* always go to first col */
       +                        tsetchar(c);
       +                        if(term.c.x+1 < term.col)
       +                                tmoveto(term.c.x+1, term.c.y);
       +                        else
       +                                term.c.state |= CURSOR_WRAPNEXT;
                        }
                }
        }