vt: esc dispatch: implement DECALN

In esc dispatch:

* Switch on private first, then final
* Recognize ESC #8 (DECALN), and implement it
This commit is contained in:
Daniel Eklöf 2019-11-05 11:32:56 +01:00
parent 342d6036f9
commit 33ea88aba6
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

91
vt.c
View file

@ -591,6 +591,8 @@ esc_dispatch(struct terminal *term, uint8_t final)
{ {
LOG_DBG("ESC: %s", esc_as_string(term, final)); LOG_DBG("ESC: %s", esc_as_string(term, final));
switch (term->vt.private[0]) {
case 0:
switch (final) { switch (final) {
case '7': case '7':
term->saved_cursor = term->cursor; term->saved_cursor = term->cursor;
@ -606,6 +608,25 @@ esc_dispatch(struct terminal *term, uint8_t final)
term_reset(term, true); term_reset(term, true);
break; break;
#if 0
case '0': {
/* Configure G0-G3 to use special chars + line drawing */
char param = term->vt.private[0] != 0 ? term->vt.private[0] : 0;
switch (param) {
case '(': term->charset[0] = CHARSET_GRAPHIC; break;
case ')': term->charset[1] = CHARSET_GRAPHIC; break;
case '*': term->charset[2] = CHARSET_GRAPHIC; break;
case '+': term->charset[3] = CHARSET_GRAPHIC; break;
case 0: break;
default:
UNHANDLED();
break;
}
break;
}
case 'B': { case 'B': {
/* Configure G0-G3 to use ASCII */ /* Configure G0-G3 to use ASCII */
char param = term->vt.private[0] != 0 ? term->vt.private[0] : 0; char param = term->vt.private[0] != 0 ? term->vt.private[0] : 0;
@ -623,7 +644,7 @@ esc_dispatch(struct terminal *term, uint8_t final)
} }
break; break;
} }
#endif
case 'D': case 'D':
term_linefeed(term); term_linefeed(term);
break; break;
@ -651,24 +672,6 @@ esc_dispatch(struct terminal *term, uint8_t final)
/* ST - String Terminator */ /* ST - String Terminator */
break; break;
case '0': {
/* Configure G0-G3 to use special chars + line drawing */
char param = term->vt.private[0] != 0 ? term->vt.private[0] : 0;
switch (param) {
case '(': term->charset[0] = CHARSET_GRAPHIC; break;
case ')': term->charset[1] = CHARSET_GRAPHIC; break;
case '*': term->charset[2] = CHARSET_GRAPHIC; break;
case '+': term->charset[3] = CHARSET_GRAPHIC; break;
case 0: break;
default:
UNHANDLED();
break;
}
break;
}
case '=': case '=':
term->keypad_keys_mode = KEYPAD_APPLICATION; term->keypad_keys_mode = KEYPAD_APPLICATION;
break; break;
@ -681,6 +684,56 @@ esc_dispatch(struct terminal *term, uint8_t final)
UNHANDLED(); UNHANDLED();
break; break;
} }
break; /* private[0] == 0 */
case '(':
case ')':
case '*':
case '+':
switch (final) {
case '0': {
char priv = term->vt.private[0];
ssize_t idx = priv ==
'(' ? 0 :
')' ? 1 :
'*' ? 2 :
'+' ? 3 : -1;
assert(idx != -1);
term->charset[idx] = CHARSET_GRAPHIC;
break;
}
case 'B': {
char priv = term->vt.private[0];
ssize_t idx = priv ==
'(' ? 0 :
')' ? 1 :
'*' ? 2 :
'+' ? 3 : -1;
assert(idx != -1);
term->charset[idx] = CHARSET_ASCII;
break;
}
}
break;
case '#':
switch (final) {
case '8':
for (int r = 0; r < term->rows; r++) {
struct row *row = grid_row_in_view(term->grid, r);
for (int c = 0; c < term->cols; c++) {
row->cells[c].wc = L'E';
row->cells[c].attrs.clean = 0;
}
row->dirty = true;
}
break;
}
break; /* private[0] == '#' */
}
} }
static inline void static inline void