From 31c73f0cf01e1d0bdcd1435136b010c1c1ab442c Mon Sep 17 00:00:00 2001 From: Craig Barnes Date: Sun, 29 Nov 2020 04:04:57 +0000 Subject: [PATCH] csi: add new private mode that makes the Escape key emit "\E[27;1;27~" This mode can be set by client programs with the DECSET, DECRST, XTSAVE and XTRESTORE sequences by using 27127 as the parameter. The sequence "\E[27;1;27~" is encoded in the same way as is done by xterm's "modifyOtherKeys" mode. Even though xterm itself never emits such a sequence for the Escape key, many programs already have support for parsing this style of key sequence. --- csi.c | 6 ++++++ input.c | 8 +++++++- terminal.c | 1 + terminal.h | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/csi.c b/csi.c index e4975583..f70c58b2 100644 --- a/csi.c +++ b/csi.c @@ -536,6 +536,10 @@ decset_decrst(struct terminal *term, unsigned param, bool enable) term->bracketed_paste = enable; break; + case 27127: + term->modify_escape_key = enable; + break; + default: UNHANDLED(); break; @@ -583,6 +587,7 @@ xtsave(struct terminal *term, unsigned param) case 1042: term->xtsave.bell_is_urgent = term->bell_is_urgent; break; case 1049: term->xtsave.alt_screen = term->grid == &term->alt; break; case 2004: term->xtsave.bracketed_paste = term->bracketed_paste; break; + case 27127: term->xtsave.modify_escape_key = term->modify_escape_key; break; } } @@ -616,6 +621,7 @@ xtrestore(struct terminal *term, unsigned param) case 1042: enable = term->xtsave.bell_is_urgent; break; case 1049: enable = term->xtsave.alt_screen; break; case 2004: enable = term->xtsave.bracketed_paste; break; + case 27127: enable = term->xtsave.modify_escape_key; break; default: return; } diff --git a/input.c b/input.c index 61f1d004..191a3de9 100644 --- a/input.c +++ b/input.c @@ -891,7 +891,13 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, keymap_mods |= seat->kbd.ctrl ? MOD_CTRL : MOD_NONE; keymap_mods |= seat->kbd.meta ? MOD_META : MOD_NONE; - const struct key_data *keymap = keymap_lookup(seat, term, sym, keymap_mods); + const struct key_data *keymap; + if (sym == XKB_KEY_Escape && keymap_mods == MOD_NONE && term->modify_escape_key) { + static const struct key_data esc = {.seq = "\033[27;1;27~"}; + keymap = &esc; + } else + keymap = keymap_lookup(seat, term, sym, keymap_mods); + if (keymap != NULL) { term_to_slave(term, keymap->seq, strlen(keymap->seq)); diff --git a/terminal.c b/terminal.c index 6a20056c..3bb41d12 100644 --- a/terminal.c +++ b/terminal.c @@ -1523,6 +1523,7 @@ term_reset(struct terminal *term, bool hard) term->insert_mode = false; term->bracketed_paste = false; term->focus_events = false; + term->modify_escape_key = false; term->mouse_tracking = MOUSE_NONE; term->mouse_reporting = MOUSE_NORMAL; term->charsets.selected = 0; diff --git a/terminal.h b/terminal.h index ea49edf2..4eca0aa9 100644 --- a/terminal.h +++ b/terminal.h @@ -236,6 +236,7 @@ struct terminal { bool bracketed_paste; bool focus_events; bool alt_scrolling; + bool modify_escape_key; enum cursor_origin origin; enum cursor_keys cursor_keys_mode; enum keypad_keys keypad_keys_mode; @@ -296,6 +297,7 @@ struct terminal { uint32_t num_lock_modifier:1; uint32_t bell_is_urgent:1; uint32_t alt_screen:1; + uint32_t modify_escape_key:1; } xtsave; char *window_title;