From: Roberto E. Vargas Caballero Date: Wed, 26 Sep 2012 18:55:18 +0000 (+0200) Subject: Allow control characters inside escape sequences X-Git-Url: https://git.danieliu.xyz/?a=commitdiff_plain;h=3af49e34f666554fcd52a52a7ca15f3e7eafa197;p=st.git 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(-) --- diff --git a/st.c b/st.c index 515dfb1..2767d54 100644 --- 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; } } }