|
|
@ -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) |
|
|
|