From dbbc314cc9fea7de50725d64b187666fe97e87e9 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 12 Jan 2009 21:47:03 +0000 Subject: [PATCH] Handle ctrl/shift modifiers better. --- CHANGES | 3 ++- TODO | 1 + input-keys.c | 51 +++++++++++++++++++++++++++++++-------------------- tty-keys.c | 37 ++++++++++++++++++++++++++----------- 4 files changed, 60 insertions(+), 32 deletions(-) diff --git a/CHANGES b/CHANGES index 4232a69f..764342d2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 12 January 2009 +* More hacks for key handling. * Two commands, resize-pane-up and resize-pane-down to resize a pane. * Make the window pane code handle panes of different sizes, and add a -l and -p arguments to split-window to specify the new window size in lines @@ -883,7 +884,7 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.196 2009-01-12 19:23:14 nicm Exp $ +$Id: CHANGES,v 1.197 2009-01-12 21:47:03 nicm Exp $ LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB diff --git a/TODO b/TODO index 1551c162..4f489dae 100644 --- a/TODO +++ b/TODO @@ -104,3 +104,4 @@ - should have a repeat-command delay - if you execute a key binding then press another key within the delay time it is treated as if it was anoth key binding (ie the ^A prefix is implied) +- key handling sucks a bit and needs to be reworked diff --git a/input-keys.c b/input-keys.c index efddf217..26ab8b92 100644 --- a/input-keys.c +++ b/input-keys.c @@ -1,4 +1,4 @@ -/* $Id: input-keys.c,v 1.21 2009-01-11 23:31:46 nicm Exp $ */ +/* $Id: input-keys.c,v 1.22 2009-01-12 21:47:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -37,10 +37,10 @@ struct input_key_ent { struct input_key_ent input_keys[] = { /* Function keys. */ - { KEYC_F1, "\033OP", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_F2, "\033OQ", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_F3, "\033OR", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_F4, "\033OS", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_F1, "\033OP", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_F2, "\033OQ", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_F3, "\033OR", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_F4, "\033OS", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, { KEYC_F5, "\033[15~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, { KEYC_F6, "\033[17~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, { KEYC_F7, "\033[18~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, @@ -49,24 +49,35 @@ struct input_key_ent input_keys[] = { { KEYC_F10, "\033[21~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, { KEYC_F11, "\033[23~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, { KEYC_F12, "\033[24~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_IC, "\033[2~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_DC, "\033[3~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_HOME, "\033[1~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_END, "\033[4~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_NPAGE, "\033[6~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_PPAGE, "\033[5~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, - { KEYC_BTAB, "\033[Z", INPUTKEY_MODIFIER }, + { KEYC_IC, "\033[2~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_DC, "\033[3~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_HOME, "\033[1~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_END, "\033[4~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_NPAGE, "\033[6~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_PPAGE, "\033[5~", INPUTKEY_MODIFIER|INPUTKEY_XTERM }, + { KEYC_BTAB, "\033[Z", INPUTKEY_MODIFIER }, /* Arrow keys. Cursor versions must come first. */ - { KEYC_UP, "\033OA", INPUTKEY_MODIFIER|INPUTKEY_CURSOR }, - { KEYC_DOWN, "\033OB", INPUTKEY_MODIFIER|INPUTKEY_CURSOR }, - { KEYC_LEFT, "\033OD", INPUTKEY_MODIFIER|INPUTKEY_CURSOR }, - { KEYC_RIGHT, "\033OC", INPUTKEY_MODIFIER|INPUTKEY_CURSOR }, - { KEYC_UP, "\033[A", INPUTKEY_MODIFIER }, - { KEYC_DOWN, "\033[B", INPUTKEY_MODIFIER }, - { KEYC_LEFT, "\033[D", INPUTKEY_MODIFIER }, - { KEYC_RIGHT, "\033[C", INPUTKEY_MODIFIER }, + { KEYC_UP, "\033OA", INPUTKEY_CURSOR }, + { KEYC_DOWN, "\033OB", INPUTKEY_CURSOR }, + { KEYC_RIGHT, "\033OC", INPUTKEY_CURSOR }, + { KEYC_LEFT, "\033OD", INPUTKEY_CURSOR }, + { KEYC_UP, "\033[A", 0 }, + { KEYC_DOWN, "\033[B", 0 }, + { KEYC_RIGHT, "\033[C", 0 }, + { KEYC_LEFT, "\033[D", 0 }, + + { KEYC_ADDCTL(KEYC_UP), "\033Oa", 0 }, + { KEYC_ADDCTL(KEYC_DOWN), "\033Ob", 0 }, + { KEYC_ADDCTL(KEYC_RIGHT), "\033Oc", 0 }, + { KEYC_ADDCTL(KEYC_LEFT), "\033Od", 0 }, + + { KEYC_ADDSFT(KEYC_UP), "\033[a", 0 }, + { KEYC_ADDSFT(KEYC_DOWN), "\033[b", 0 }, + { KEYC_ADDSFT(KEYC_RIGHT), "\033[c", 0 }, + { KEYC_ADDSFT(KEYC_LEFT), "\033[d", 0 }, + /* Keypad keys. Keypad versions must come first. */ { KEYC_KP0_1, "/", INPUTKEY_KEYPAD }, { KEYC_KP0_2, "*", INPUTKEY_KEYPAD }, diff --git a/tty-keys.c b/tty-keys.c index 0fbcbc5f..187c949d 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1,4 +1,4 @@ -/* $Id: tty-keys.c,v 1.18 2009-01-10 18:28:09 nicm Exp $ */ +/* $Id: tty-keys.c,v 1.19 2009-01-12 21:47:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -56,18 +56,30 @@ struct tty_key_ent tty_keys[] = { { TTYC_KCBT, NULL, KEYC_BTAB, TTYKEY_MODIFIER }, /* Arrow keys. */ + { 0, "\033OA", KEYC_UP, TTYKEY_RAW }, + { 0, "\033OB", KEYC_DOWN, TTYKEY_RAW }, + { 0, "\033OC", KEYC_RIGHT, TTYKEY_RAW }, + { 0, "\033OD", KEYC_LEFT, TTYKEY_RAW }, + + { 0, "\033[A", KEYC_UP, TTYKEY_RAW }, + { 0, "\033[B", KEYC_DOWN, TTYKEY_RAW }, + { 0, "\033[C", KEYC_RIGHT, TTYKEY_RAW }, + { 0, "\033[D", KEYC_LEFT, TTYKEY_RAW }, + + { 0, "\033Oa", KEYC_ADDCTL(KEYC_UP), TTYKEY_RAW }, + { 0, "\033Ob", KEYC_ADDCTL(KEYC_DOWN), TTYKEY_RAW }, + { 0, "\033Oc", KEYC_ADDCTL(KEYC_RIGHT), TTYKEY_RAW }, + { 0, "\033Od", KEYC_ADDCTL(KEYC_LEFT), TTYKEY_RAW }, + + { 0, "\033[a", KEYC_ADDSFT(KEYC_UP), TTYKEY_RAW }, + { 0, "\033[b", KEYC_ADDSFT(KEYC_DOWN), TTYKEY_RAW }, + { 0, "\033[c", KEYC_ADDSFT(KEYC_RIGHT), TTYKEY_RAW }, + { 0, "\033[d", KEYC_ADDSFT(KEYC_LEFT), TTYKEY_RAW }, + { TTYC_KCUU1, NULL, KEYC_UP, TTYKEY_MODIFIER }, { TTYC_KCUD1, NULL, KEYC_DOWN, TTYKEY_MODIFIER }, { TTYC_KCUB1, NULL, KEYC_LEFT, TTYKEY_MODIFIER }, { TTYC_KCUF1, NULL, KEYC_RIGHT, TTYKEY_MODIFIER }, - { 0, "\033OA", KEYC_UP, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033OB", KEYC_DOWN, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033OD", KEYC_LEFT, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033OC", KEYC_RIGHT, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033[A", KEYC_UP, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033[B", KEYC_DOWN, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033[D", KEYC_LEFT, TTYKEY_RAW|TTYKEY_MODIFIER }, - { 0, "\033[C", KEYC_RIGHT, TTYKEY_RAW|TTYKEY_MODIFIER }, /* * Numeric keypad. termcap and terminfo are totally confusing for this. @@ -231,11 +243,14 @@ tty_keys_next(struct tty *tty, int *key) return (0); } - /* Not found. Look for an xterm argument and try again. */ + /* Not found. Look xterm-style function keys with an argument. */ if (len < sizeof tmp && len > 4 && buf[len - 3] == ';') { memcpy(tmp, buf, len); + log_debug("xterm key in: %s", tmp); arg = tmp[len - 2]; - tmp[len - 3] = tmp[len - 1]; /* restore last */ + tmp[3] = tmp[len - 1]; /* move last */ + tmp[4] = '\0'; + log_debug("xterm key out: %s", tmp); log_debug("argument is: %c", arg); tk = tty_keys_find(tty, tmp + 1, len - 3, &size);