Print control codes only in graphic mode

Non handled codes must be ignored, except in graphic mode. Also STR
sequences have higher priority than control codes, so they must be handled
before of them.
---
 st.c |  160 ++++++++++++++++++++++++++++++++++++------------------------------
 1 file changed, 87 insertions(+), 73 deletions(-)
This commit is contained in:
Roberto E. Vargas Caballero 2012-10-06 19:15:30 +02:00
parent 034dc71fb8
commit 2bd0c23fa7

86
st.c
View File

@ -1784,10 +1784,38 @@ tputtab(bool forward) {
void
tputc(char *c, int len) {
uchar ascii = *c;
bool control = ascii < '\x20' || ascii == 0177;
if(iofd != -1)
write(iofd, c, len);
/*
* STR sequences must be checked before of anything
* because it can use some control codes as part of the sequence
*/
if(term.esc & ESC_STR) {
switch(ascii) {
case '\033':
term.esc = ESC_START | ESC_STR_END;
break;
case '\a': /* backwards compatibility to xterm */
term.esc = 0;
strhandle();
break;
default:
strescseq.buf[strescseq.len++] = ascii;
if(strescseq.len+1 >= STR_BUF_SIZ) {
term.esc = 0;
strhandle();
}
}
return;
}
/*
* Actions of control codes must be performed as soon they arrive
* because they can be embedded inside a control sequence, and
* they must not cause conflicts with sequences.
*/
if(control) {
switch(ascii) {
case '\t': /* HT */
tputtab(1);
@ -1805,8 +1833,6 @@ tputc(char *c, int len) {
tnewline(IS_SET(MODE_CRLF));
return;
case '\a': /* BEL */
if(term.esc & ESC_STR)
break;
if(!(xw.state & WIN_FOCUSED))
xseturgency(1);
return;
@ -1816,7 +1842,7 @@ tputc(char *c, int len) {
return;
case '\016': /* SO */
term.c.attr.mode |= ATTR_GFX;
break;
return;
case '\017': /* SI */
term.c.attr.mode &= ~ATTR_GFX;
return;
@ -1824,16 +1850,14 @@ tputc(char *c, int len) {
case '\030': /* CAN */
csireset();
return;
default:
/* case '\005': ENQ (IGNORED) */
/* case '\000': NUL (IGNORED) */
/* case '\021': XON (IGNORED) */
/* case '\023': XOFF (IGNORED) */
/* case 0177: DEL (IGNORED) */
break;
case '\005': /* ENQ (IGNORED) */
case '\000': /* NUL (IGNORED) */
case '\021': /* XON (IGNORED) */
case '\023': /* XOFF (IGNORED) */
case 0177: /* DEL (IGNORED) */
return;
}
if(term.esc & ESC_START) {
} else if(term.esc & ESC_START) {
if(term.esc & ESC_CSI) {
csiescseq.buf[csiescseq.len++] = ascii;
if(BETWEEN(ascii, 0x40, 0x7E)
@ -1841,22 +1865,6 @@ tputc(char *c, int len) {
term.esc = 0;
csiparse(), csihandle();
}
} else if(term.esc & ESC_STR) {
switch(ascii) {
case '\033':
term.esc = ESC_START | ESC_STR_END;
break;
case '\a': /* backwards compatibility to xterm */
term.esc = 0;
strhandle();
break;
default:
strescseq.buf[strescseq.len++] = ascii;
if(strescseq.len+1 >= STR_BUF_SIZ) {
term.esc = 0;
strhandle();
}
}
} else if(term.esc & ESC_STR_END) {
term.esc = 0;
if(ascii == '\\')
@ -1955,20 +1963,26 @@ tputc(char *c, int len) {
term.esc = 0;
}
}
} else {
/*
* All characters which forms part of a sequence are not
* printed
*/
return;
}
/*
* Display control codes only if we are in graphic mode
*/
if(control && !(term.c.attr.mode & ATTR_GFX))
return;
if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
sel.bx = -1;
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) {
if(term.c.x+1 < term.col)
tmoveto(term.c.x+1, term.c.y);
} else {
else
term.c.state |= CURSOR_WRAPNEXT;
}
}
}
}
int