diff --git a/csi.c b/csi.c index 21a94625..873d45a7 100644 --- a/csi.c +++ b/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] != '$') {