From 09f23d06b5262c53b65fa04d4f83cfd170d919c5 Mon Sep 17 00:00:00 2001 From: Ailin Nemui Date: Mon, 28 Jul 2014 13:58:13 +0200 Subject: [PATCH] Modify escape of ^ key so it can be used as well as Ctrl+^ Fixes FS#721 This makes Ctrl+^ and ^ bindable again as different keys. We do this by escaping single `^` as `^-`, which is not a valid control character (unlike `^^`) The original approach suggested in FS#721 is insufficient, it will break bindings such as `meta-^` because Irssi is convinced that `^` introduces a Control-key ("key combo") so it is waiting for what may follow. --- src/fe-common/core/keyboard.c | 16 +++++++++++----- src/fe-text/gui-readline.c | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/fe-common/core/keyboard.c b/src/fe-common/core/keyboard.c index 00454401..bec1502e 100644 --- a/src/fe-common/core/keyboard.c +++ b/src/fe-common/core/keyboard.c @@ -292,12 +292,18 @@ static int expand_key(const char *key, GSList **out) } last_hyphen = !last_hyphen; } else if (*key == '^') { - /* ctrl-code */ - if (key[1] != '\0') - key++; - expand_out_char(*out, '^'); - expand_out_char(*out, *key); + + /* ctrl-code */ + if (key[1] != '\0' && key[1] != '-') { + key++; + expand_out_char(*out, *key); + } + else { + /* escaped syntax for ^, see gui-readline.c */ + expand_out_char(*out, '-'); + } + expand_out_char(*out, '-'); last_hyphen = FALSE; /* optional */ } else if (last_hyphen && i_isalpha(*key)) { diff --git a/src/fe-text/gui-readline.c b/src/fe-text/gui-readline.c index 476a798b..e93f2293 100644 --- a/src/fe-text/gui-readline.c +++ b/src/fe-text/gui-readline.c @@ -393,8 +393,8 @@ static void sig_gui_key_pressed(gpointer keyp) } if (strcmp(str, "^") == 0) { - /* change it as ^^ */ - str[1] = '^'; + /* change it as ^-, that is an invalid control char */ + str[1] = '-'; str[2] = '\0'; }