mirror of
https://github.com/alrayyes/st.git
synced 2024-11-22 19:26:22 +00:00
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:
parent
034dc71fb8
commit
2bd0c23fa7
1 changed files with 87 additions and 73 deletions
160
st.c
160
st.c
|
@ -1784,56 +1784,80 @@ tputtab(bool forward) {
|
||||||
void
|
void
|
||||||
tputc(char *c, int len) {
|
tputc(char *c, int len) {
|
||||||
uchar ascii = *c;
|
uchar ascii = *c;
|
||||||
|
bool control = ascii < '\x20' || ascii == 0177;
|
||||||
|
|
||||||
if(iofd != -1)
|
if(iofd != -1)
|
||||||
write(iofd, c, len);
|
write(iofd, c, len);
|
||||||
|
/*
|
||||||
switch(ascii) {
|
* STR sequences must be checked before of anything
|
||||||
case '\t': /* HT */
|
* because it can use some control codes as part of the sequence
|
||||||
tputtab(1);
|
*/
|
||||||
return;
|
if(term.esc & ESC_STR) {
|
||||||
case '\b': /* BS */
|
switch(ascii) {
|
||||||
tmoveto(term.c.x-1, term.c.y);
|
case '\033':
|
||||||
return;
|
term.esc = ESC_START | ESC_STR_END;
|
||||||
case '\r': /* CR */
|
|
||||||
tmoveto(0, term.c.y);
|
|
||||||
return;
|
|
||||||
case '\f': /* LF */
|
|
||||||
case '\v': /* VT */
|
|
||||||
case '\n': /* LF */
|
|
||||||
/* go to first col if the mode is set */
|
|
||||||
tnewline(IS_SET(MODE_CRLF));
|
|
||||||
return;
|
|
||||||
case '\a': /* BEL */
|
|
||||||
if(term.esc & ESC_STR)
|
|
||||||
break;
|
break;
|
||||||
if(!(xw.state & WIN_FOCUSED))
|
case '\a': /* backwards compatibility to xterm */
|
||||||
xseturgency(1);
|
term.esc = 0;
|
||||||
|
strhandle();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strescseq.buf[strescseq.len++] = ascii;
|
||||||
|
if(strescseq.len+1 >= STR_BUF_SIZ) {
|
||||||
|
term.esc = 0;
|
||||||
|
strhandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
case '\033': /* ESC */
|
|
||||||
csireset();
|
|
||||||
term.esc = ESC_START;
|
|
||||||
return;
|
|
||||||
case '\016': /* SO */
|
|
||||||
term.c.attr.mode |= ATTR_GFX;
|
|
||||||
break;
|
|
||||||
case '\017': /* SI */
|
|
||||||
term.c.attr.mode &= ~ATTR_GFX;
|
|
||||||
return;
|
|
||||||
case '\032': /* SUB */
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if(term.esc & ESC_START) {
|
* 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);
|
||||||
|
return;
|
||||||
|
case '\b': /* BS */
|
||||||
|
tmoveto(term.c.x-1, term.c.y);
|
||||||
|
return;
|
||||||
|
case '\r': /* CR */
|
||||||
|
tmoveto(0, term.c.y);
|
||||||
|
return;
|
||||||
|
case '\f': /* LF */
|
||||||
|
case '\v': /* VT */
|
||||||
|
case '\n': /* LF */
|
||||||
|
/* go to first col if the mode is set */
|
||||||
|
tnewline(IS_SET(MODE_CRLF));
|
||||||
|
return;
|
||||||
|
case '\a': /* BEL */
|
||||||
|
if(!(xw.state & WIN_FOCUSED))
|
||||||
|
xseturgency(1);
|
||||||
|
return;
|
||||||
|
case '\033': /* ESC */
|
||||||
|
csireset();
|
||||||
|
term.esc = ESC_START;
|
||||||
|
return;
|
||||||
|
case '\016': /* SO */
|
||||||
|
term.c.attr.mode |= ATTR_GFX;
|
||||||
|
return;
|
||||||
|
case '\017': /* SI */
|
||||||
|
term.c.attr.mode &= ~ATTR_GFX;
|
||||||
|
return;
|
||||||
|
case '\032': /* SUB */
|
||||||
|
case '\030': /* CAN */
|
||||||
|
csireset();
|
||||||
|
return;
|
||||||
|
case '\005': /* ENQ (IGNORED) */
|
||||||
|
case '\000': /* NUL (IGNORED) */
|
||||||
|
case '\021': /* XON (IGNORED) */
|
||||||
|
case '\023': /* XOFF (IGNORED) */
|
||||||
|
case 0177: /* DEL (IGNORED) */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else 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;
|
||||||
if(BETWEEN(ascii, 0x40, 0x7E)
|
if(BETWEEN(ascii, 0x40, 0x7E)
|
||||||
|
@ -1841,22 +1865,6 @@ tputc(char *c, int len) {
|
||||||
term.esc = 0;
|
term.esc = 0;
|
||||||
csiparse(), csihandle();
|
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) {
|
} else if(term.esc & ESC_STR_END) {
|
||||||
term.esc = 0;
|
term.esc = 0;
|
||||||
if(ascii == '\\')
|
if(ascii == '\\')
|
||||||
|
@ -1955,20 +1963,26 @@ tputc(char *c, int len) {
|
||||||
term.esc = 0;
|
term.esc = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
/*
|
||||||
if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
|
* All characters which forms part of a sequence are not
|
||||||
sel.bx = -1;
|
* printed
|
||||||
if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
|
*/
|
||||||
if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
|
return;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* 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(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in a new issue