|
|
|
@ -51,7 +51,6 @@ enum term_mode {
|
|
|
|
|
MODE_ECHO = 1 << 4,
|
|
|
|
|
MODE_PRINT = 1 << 5,
|
|
|
|
|
MODE_UTF8 = 1 << 6,
|
|
|
|
|
MODE_SIXEL = 1 << 7,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum cursor_movement {
|
|
|
|
@ -78,12 +77,11 @@ enum charset {
|
|
|
|
|
enum escape_state {
|
|
|
|
|
ESC_START = 1,
|
|
|
|
|
ESC_CSI = 2,
|
|
|
|
|
ESC_STR = 4, /* OSC, PM, APC */
|
|
|
|
|
ESC_STR = 4, /* DCS, OSC, PM, APC */
|
|
|
|
|
ESC_ALTCHARSET = 8,
|
|
|
|
|
ESC_STR_END = 16, /* a final string was encountered */
|
|
|
|
|
ESC_TEST = 32, /* Enter in test mode */
|
|
|
|
|
ESC_UTF8 = 64,
|
|
|
|
|
ESC_DCS =128,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
@ -2090,12 +2088,9 @@ tdectest(char c)
|
|
|
|
|
void
|
|
|
|
|
tstrsequence(uchar c)
|
|
|
|
|
{
|
|
|
|
|
strreset();
|
|
|
|
|
|
|
|
|
|
switch (c) {
|
|
|
|
|
case 0x90: /* DCS -- Device Control String */
|
|
|
|
|
c = 'P';
|
|
|
|
|
term.esc |= ESC_DCS;
|
|
|
|
|
break;
|
|
|
|
|
case 0x9f: /* APC -- Application Program Command */
|
|
|
|
|
c = '_';
|
|
|
|
@ -2107,6 +2102,7 @@ tstrsequence(uchar c)
|
|
|
|
|
c = ']';
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
strreset();
|
|
|
|
|
strescseq.type = c;
|
|
|
|
|
term.esc |= ESC_STR;
|
|
|
|
|
}
|
|
|
|
@ -2304,7 +2300,7 @@ tputc(Rune u)
|
|
|
|
|
Glyph *gp;
|
|
|
|
|
|
|
|
|
|
control = ISCONTROL(u);
|
|
|
|
|
if (u < 127 || !IS_SET(MODE_UTF8 | MODE_SIXEL)) {
|
|
|
|
|
if (u < 127 || !IS_SET(MODE_UTF8)) {
|
|
|
|
|
c[0] = u;
|
|
|
|
|
width = len = 1;
|
|
|
|
|
} else {
|
|
|
|
@ -2325,23 +2321,11 @@ tputc(Rune u)
|
|
|
|
|
if (term.esc & ESC_STR) {
|
|
|
|
|
if (u == '\a' || u == 030 || u == 032 || u == 033 ||
|
|
|
|
|
ISCONTROLC1(u)) {
|
|
|
|
|
term.esc &= ~(ESC_START|ESC_STR|ESC_DCS);
|
|
|
|
|
if (IS_SET(MODE_SIXEL)) {
|
|
|
|
|
/* TODO: render sixel */;
|
|
|
|
|
term.mode &= ~MODE_SIXEL;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
term.esc &= ~(ESC_START|ESC_STR);
|
|
|
|
|
term.esc |= ESC_STR_END;
|
|
|
|
|
goto check_control_code;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (IS_SET(MODE_SIXEL)) {
|
|
|
|
|
/* TODO: implement sixel mode */
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (term.esc&ESC_DCS && strescseq.len == 0 && u == 'q')
|
|
|
|
|
term.mode |= MODE_SIXEL;
|
|
|
|
|
|
|
|
|
|
if (strescseq.len+len >= strescseq.siz) {
|
|
|
|
|
/*
|
|
|
|
|
* Here is a bug in terminals. If the user never sends
|
|
|
|
@ -2453,7 +2437,7 @@ twrite(const char *buf, int buflen, int show_ctrl)
|
|
|
|
|
int n;
|
|
|
|
|
|
|
|
|
|
for (n = 0; n < buflen; n += charsize) {
|
|
|
|
|
if (IS_SET(MODE_UTF8) && !IS_SET(MODE_SIXEL)) {
|
|
|
|
|
if (IS_SET(MODE_UTF8)) {
|
|
|
|
|
/* process a complete utf8 char */
|
|
|
|
|
charsize = utf8decode(buf + n, &u, buflen - n);
|
|
|
|
|
if (charsize == 0)
|
|
|
|
|