mirror of git://git.suckless.org/st
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(-)
This commit is contained in:
parent
a7d7e29300
commit
3af49e34f6
68
st.c
68
st.c
|
@ -1668,6 +1668,32 @@ tputc(char *c, int len) {
|
||||||
if(iofd != -1)
|
if(iofd != -1)
|
||||||
write(iofd, c, len);
|
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_START) {
|
||||||
if(term.esc & ESC_CSI) {
|
if(term.esc & ESC_CSI) {
|
||||||
csiescseq.buf[csiescseq.len++] = ascii;
|
csiescseq.buf[csiescseq.len++] = ascii;
|
||||||
|
@ -1791,40 +1817,14 @@ tputc(char *c, int len) {
|
||||||
} else {
|
} else {
|
||||||
if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
|
if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
|
||||||
sel.bx = -1;
|
sel.bx = -1;
|
||||||
switch(ascii) {
|
if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
|
||||||
case '\t':
|
if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
|
||||||
tputtab(1);
|
tnewline(1); /* always go to first col */
|
||||||
break;
|
tsetchar(c);
|
||||||
case '\b':
|
if(term.c.x+1 < term.col)
|
||||||
tmoveto(term.c.x-1, term.c.y);
|
tmoveto(term.c.x+1, term.c.y);
|
||||||
break;
|
else
|
||||||
case '\r':
|
term.c.state |= CURSOR_WRAPNEXT;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue