mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-05 04:06:08 -05:00
csi: break out decset/decrst
This commit is contained in:
parent
38ee05b1c7
commit
2eebf9b8cc
1 changed files with 206 additions and 274 deletions
480
csi.c
480
csi.c
|
|
@ -321,6 +321,204 @@ csi_sgr(struct terminal *term)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
decset_decrst(struct terminal *term, unsigned param, bool enable)
|
||||
{
|
||||
#if defined(_DEBUG)
|
||||
/* For UNHANDLED() */
|
||||
int UNUSED final = enable ? 'h' : 'l';
|
||||
#endif
|
||||
|
||||
switch (param) {
|
||||
case 1:
|
||||
term->cursor_keys_mode =
|
||||
enable ? CURSOR_KEYS_APPLICATION : CURSOR_KEYS_NORMAL;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if (enable)
|
||||
LOG_WARN("unimplemented: 132 column mode (DECCOLM)");
|
||||
|
||||
term_erase(
|
||||
term,
|
||||
&(struct coord){0, 0},
|
||||
&(struct coord){term->cols - 1, term->rows - 1});
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
/* DECSCLM - Smooth scroll */
|
||||
if (enable)
|
||||
LOG_WARN("unimplemented: Smooth (Slow) Scroll (DECSCLM)");
|
||||
break;
|
||||
|
||||
case 5:
|
||||
term->reverse = enable;
|
||||
term_damage_all(term);
|
||||
break;
|
||||
|
||||
case 6: { /* DECOM */
|
||||
term->origin = enable ? ORIGIN_RELATIVE : ORIGIN_ABSOLUTE;
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
}
|
||||
|
||||
case 7:
|
||||
/* DECAWM */
|
||||
term->auto_margin = enable;
|
||||
term->grid->cursor.lcf = false;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
if (enable)
|
||||
LOG_WARN("unimplemented: X10 mouse tracking mode");
|
||||
else
|
||||
term->mouse_tracking = MOUSE_NONE;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
if (enable)
|
||||
term_cursor_blink_enable(term);
|
||||
else
|
||||
term_cursor_blink_disable(term);
|
||||
break;
|
||||
|
||||
case 25:
|
||||
term->hide_cursor = !enable;
|
||||
break;
|
||||
|
||||
case 1000:
|
||||
term->mouse_tracking = enable ? MOUSE_CLICK : MOUSE_NONE;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1001:
|
||||
if (enable)
|
||||
LOG_WARN("unimplemented: highlight mouse tracking");
|
||||
break;
|
||||
|
||||
case 1002:
|
||||
term->mouse_tracking = enable ? MOUSE_DRAG : MOUSE_NONE;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1003:
|
||||
term->mouse_tracking = enable ? MOUSE_MOTION : MOUSE_NONE;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1004:
|
||||
term->focus_events = enable;
|
||||
break;
|
||||
|
||||
case 1005:
|
||||
if (enable)
|
||||
LOG_WARN("unimplemented: mouse reporting mode: UTF-8");
|
||||
else
|
||||
term->mouse_reporting = MOUSE_NONE;
|
||||
break;
|
||||
|
||||
case 1006:
|
||||
if (enable)
|
||||
LOG_DBG("mouse reporting mode: SGR");
|
||||
term->mouse_reporting = enable ? MOUSE_SGR : MOUSE_NORMAL;
|
||||
break;
|
||||
|
||||
case 1007:
|
||||
term->alt_scrolling = enable;
|
||||
break;
|
||||
|
||||
case 1015:
|
||||
if (enable)
|
||||
LOG_DBG("mouse reporting mode: urxvt");
|
||||
term->mouse_reporting = enable ? MOUSE_URXVT : MOUSE_NORMAL;
|
||||
break;
|
||||
|
||||
case 1034:
|
||||
/* smm */
|
||||
LOG_DBG("%s 8-bit meta mode", enable ? "enabling" : "disabling");
|
||||
term->meta.eight_bit = enable;
|
||||
break;
|
||||
|
||||
case 1036:
|
||||
/* metaSendsEscape */
|
||||
LOG_DBG("%s meta-sends-escape", enable ? "enabling" : "disabling");
|
||||
term->meta.esc_prefix = enable;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case 1042:
|
||||
LOG_WARN("unimplemented: 'urgency' window manager hint on ctrl-g");
|
||||
break;
|
||||
|
||||
case 1043:
|
||||
LOG_WARN("unimplemented: raise window on ctrl-g");
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 1049:
|
||||
if (enable && term->grid != &term->alt) {
|
||||
selection_cancel(term);
|
||||
|
||||
term->grid = &term->alt;
|
||||
|
||||
term_cursor_to(
|
||||
term,
|
||||
min(term->grid->cursor.point.row, term->rows - 1),
|
||||
min(term->grid->cursor.point.col, term->cols - 1));
|
||||
|
||||
tll_free(term->alt.scroll_damage);
|
||||
|
||||
term_erase(
|
||||
term,
|
||||
&(struct coord){0, 0},
|
||||
&(struct coord){term->cols - 1, term->rows - 1});
|
||||
}
|
||||
|
||||
else if (!enable && term->grid == &term->alt) {
|
||||
selection_cancel(term);
|
||||
|
||||
term->grid = &term->normal;
|
||||
|
||||
term_cursor_to(
|
||||
term,
|
||||
min(term->grid->cursor.point.row, term->rows - 1),
|
||||
min(term->grid->cursor.point.col, term->cols - 1));
|
||||
|
||||
tll_free(term->alt.scroll_damage);
|
||||
|
||||
/* Delete all sixel images on the alt screen */
|
||||
tll_foreach(term->alt.sixel_images, it) {
|
||||
sixel_destroy(&it->item);
|
||||
tll_remove(term->alt.sixel_images, it);
|
||||
}
|
||||
|
||||
term_damage_all(term);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2004:
|
||||
term->bracketed_paste = enable;
|
||||
break;
|
||||
|
||||
default:
|
||||
UNHANDLED();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
decset(struct terminal *term, unsigned param)
|
||||
{
|
||||
decset_decrst(term, param, true);
|
||||
}
|
||||
|
||||
static void
|
||||
decrst(struct terminal *term, unsigned param)
|
||||
{
|
||||
deecset_decrst(term, param, false);
|
||||
}
|
||||
|
||||
void
|
||||
csi_dispatch(struct terminal *term, uint8_t final)
|
||||
{
|
||||
|
|
@ -1008,283 +1206,17 @@ csi_dispatch(struct terminal *term, uint8_t final)
|
|||
|
||||
case '?': {
|
||||
switch (final) {
|
||||
case 'h': {
|
||||
for (size_t i = 0; i < term->vt.params.idx; i++) {
|
||||
switch (term->vt.params.v[i].value) {
|
||||
case 1:
|
||||
term->cursor_keys_mode = CURSOR_KEYS_APPLICATION;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
LOG_WARN("unimplemented: 132 column mode (DECCOLM, %s)",
|
||||
csi_as_string(term, final, i));
|
||||
term_erase(
|
||||
term,
|
||||
&(struct coord){0, 0},
|
||||
&(struct coord){term->cols - 1, term->rows - 1});
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
/* DECSCLM - Smooth scroll */
|
||||
LOG_WARN("unimplemented: Smooth (Slow) Scroll (DECSCLM, %s)",
|
||||
csi_as_string(term, final, i));
|
||||
break;
|
||||
|
||||
case 5:
|
||||
term->reverse = true;
|
||||
term_damage_all(term);
|
||||
break;
|
||||
|
||||
case 6: { /* DECOM */
|
||||
term->origin = ORIGIN_RELATIVE;
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
}
|
||||
|
||||
case 7:
|
||||
/* DECAWM */
|
||||
term->auto_margin = true;
|
||||
term->grid->cursor.lcf = false;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
LOG_WARN("unimplemented: X10 mouse tracking mode");
|
||||
/* term->mouse_tracking = MOUSE_X10; */
|
||||
break;
|
||||
|
||||
case 12:
|
||||
term_cursor_blink_enable(term);
|
||||
break;
|
||||
|
||||
case 25:
|
||||
term->hide_cursor = false;
|
||||
break;
|
||||
|
||||
case 1000:
|
||||
term->mouse_tracking = MOUSE_CLICK;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1001:
|
||||
LOG_WARN("unimplemented: highlight mouse tracking");
|
||||
break;
|
||||
|
||||
case 1002:
|
||||
term->mouse_tracking = MOUSE_DRAG;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1003:
|
||||
term->mouse_tracking = MOUSE_MOTION;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1004:
|
||||
term->focus_events = true;
|
||||
break;
|
||||
|
||||
case 1005:
|
||||
LOG_WARN("unimplemented: mouse reporting mode: UTF-8");
|
||||
/* term->mouse_reporting = MOUSE_UTF8; */
|
||||
break;
|
||||
|
||||
case 1006:
|
||||
LOG_DBG("mouse reporting mode: SGR");
|
||||
term->mouse_reporting = MOUSE_SGR;
|
||||
break;
|
||||
|
||||
case 1007:
|
||||
term->alt_scrolling = true;
|
||||
break;
|
||||
|
||||
case 1015:
|
||||
LOG_DBG("mouse reporting mode: urxvt");
|
||||
term->mouse_reporting = MOUSE_URXVT;
|
||||
break;
|
||||
|
||||
case 1034:
|
||||
/* smm */
|
||||
LOG_DBG("enabling 8-bit meta mode");
|
||||
term->meta.eight_bit = true;
|
||||
break;
|
||||
|
||||
case 1036:
|
||||
/* metaSendsEscape */
|
||||
LOG_DBG("enabling meta-sends-escape");
|
||||
term->meta.esc_prefix = true;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case 1042:
|
||||
LOG_WARN("unimplemented: 'urgency' window manager hint on ctrl-g");
|
||||
break;
|
||||
|
||||
case 1043:
|
||||
LOG_WARN("unimplemented: raise window on ctrl-g");
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 1049:
|
||||
if (term->grid != &term->alt) {
|
||||
selection_cancel(term);
|
||||
|
||||
term->grid = &term->alt;
|
||||
|
||||
term_cursor_to(
|
||||
term,
|
||||
min(term->grid->cursor.point.row, term->rows - 1),
|
||||
min(term->grid->cursor.point.col, term->cols - 1));
|
||||
|
||||
tll_free(term->alt.scroll_damage);
|
||||
|
||||
term_erase(
|
||||
term,
|
||||
&(struct coord){0, 0},
|
||||
&(struct coord){term->cols - 1, term->rows - 1});
|
||||
}
|
||||
break;
|
||||
|
||||
case 2004:
|
||||
term->bracketed_paste = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
UNHANDLED();
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 'h':
|
||||
/* DECSET - DEC private mode set */
|
||||
for (size_t i = 0; i < term->vt.params.idx; i++)
|
||||
decset(term, term->vt.params.v[i].value);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'l': {
|
||||
for (size_t i = 0; i < term->vt.params.idx; i++) {
|
||||
switch (term->vt.params.v[i].value) {
|
||||
case 1:
|
||||
term->cursor_keys_mode = CURSOR_KEYS_NORMAL;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
/* DECCOLM - 80 column mode */
|
||||
term_erase(
|
||||
term,
|
||||
&(struct coord){0, 0},
|
||||
&(struct coord){term->cols - 1, term->rows - 1});
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
/* DECSCLM - Jump scroll */
|
||||
break;
|
||||
|
||||
case 5:
|
||||
term->reverse = false;
|
||||
term_damage_all(term);
|
||||
break;
|
||||
|
||||
case 6: { /* DECOM */
|
||||
term->origin = ORIGIN_ABSOLUTE;
|
||||
term_cursor_home(term);
|
||||
break;
|
||||
}
|
||||
|
||||
case 7:
|
||||
/* DECAWM */
|
||||
term->auto_margin = false;
|
||||
term->grid->cursor.lcf = false;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
term_cursor_blink_disable(term);
|
||||
break;
|
||||
|
||||
case 25:
|
||||
term->hide_cursor = true;
|
||||
break;
|
||||
|
||||
case 1001:
|
||||
/* Highlight mouse tracking */
|
||||
break;
|
||||
|
||||
case 9: /* MOUSE_X10 */
|
||||
case 1000: /* MOUSE_NORMAL */
|
||||
case 1002: /* MOUSE_BUTTON_EVENT */
|
||||
case 1003: /* MOUSE_ANY_EVENT */
|
||||
term->mouse_tracking = MOUSE_NONE;
|
||||
term_xcursor_update(term);
|
||||
break;
|
||||
|
||||
case 1005: /* MOUSE_UTF8 */
|
||||
case 1006: /* MOUSE_SGR */
|
||||
case 1015: /* MOUSE_URXVT */
|
||||
LOG_DBG("mouse reporting mode: legacy");
|
||||
term->mouse_reporting = MOUSE_NORMAL;
|
||||
break;
|
||||
|
||||
case 1004:
|
||||
term->focus_events = false;
|
||||
break;
|
||||
|
||||
case 1007:
|
||||
term->alt_scrolling = false;
|
||||
break;
|
||||
|
||||
case 1034:
|
||||
/* rmm */
|
||||
LOG_DBG("disabling 8-bit meta mode");
|
||||
term->meta.eight_bit = false;
|
||||
break;
|
||||
|
||||
case 1036:
|
||||
/* metaSendsEscape */
|
||||
LOG_DBG("disabling meta-sends-escape");
|
||||
term->meta.esc_prefix = false;
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case 1042:
|
||||
/* 'urgency' window manager hint on ctrl-g */
|
||||
break;
|
||||
|
||||
case 1043:
|
||||
/* raise window on ctrl-g */
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 1049:
|
||||
if (term->grid == &term->alt) {
|
||||
selection_cancel(term);
|
||||
|
||||
term->grid = &term->normal;
|
||||
|
||||
term_cursor_to(
|
||||
term,
|
||||
min(term->grid->cursor.point.row, term->rows - 1),
|
||||
min(term->grid->cursor.point.col, term->cols - 1));
|
||||
|
||||
tll_free(term->alt.scroll_damage);
|
||||
|
||||
/* Delete all sixel images on the alt screen */
|
||||
tll_foreach(term->alt.sixel_images, it) {
|
||||
sixel_destroy(&it->item);
|
||||
tll_remove(term->alt.sixel_images, it);
|
||||
}
|
||||
|
||||
term_damage_all(term);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2004:
|
||||
term->bracketed_paste = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
UNHANDLED();
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 'l':
|
||||
/* DECRST - DEC private mode reset */
|
||||
for (size_t i = 0; i < term->vt.params.idx; i++)
|
||||
decrst(term, term->vt.params.v[i].value);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'p': {
|
||||
if (term->vt.private[1] != '$') {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue