diff --git a/CHANGES b/CHANGES index fabcca77..e24b31f6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ 24 July 2008 +* If keypad mode and cursor mode are on, switch the arrow keys from \033[A to + \033OA. Not sure what else keypad mode is meant to do. Something with the + keypad keys I think, but screen doesn't seem to do anything... * Support the numeric keypad. This is really confusing: parts of it have termcap entries and parts do not. I'm not sure I've got it right but this seems to work. @@ -620,4 +623,4 @@ (including mutt, emacs). No status bar yet and no key remapping or other customisation. -$Id: CHANGES,v 1.152 2008-07-23 23:46:51 nicm Exp $ +$Id: CHANGES,v 1.153 2008-07-24 00:03:15 nicm Exp $ diff --git a/input-keys.c b/input-keys.c index 24ed8e7b..020225b5 100644 --- a/input-keys.c +++ b/input-keys.c @@ -1,4 +1,4 @@ -/* $Id: input-keys.c,v 1.12 2008-07-23 23:46:51 nicm Exp $ */ +/* $Id: input-keys.c,v 1.13 2008-07-24 00:03:15 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -24,50 +24,59 @@ #include "tmux.h" +#define INPUTKEY_KEYPAD 0x1 +#define INPUTKEY_CURSOR 0x2 struct { int key; const char *data; + int flags; } input_keys[] = { - { KEYC_F1, "\033OP" }, - { KEYC_F2, "\033OQ" }, - { KEYC_F3, "\033OR" }, - { KEYC_F4, "\033OS" }, - { KEYC_F5, "\033[15~" }, - { KEYC_F6, "\033[17~" }, - { KEYC_F7, "\033[18~" }, - { KEYC_F8, "\033[19~" }, - { KEYC_F9, "\033[20~" }, - { KEYC_F10, "\033[21~" }, - { KEYC_F11, "\033[23~" }, - { KEYC_F12, "\033[24~" }, - { KEYC_FIND, "\033[1~" }, - { KEYC_DC, "\033[3~" }, - { KEYC_IC, "\033[2~" }, - { KEYC_NPAGE, "\033[6~" }, - { KEYC_PPAGE, "\033[5~" }, - { KEYC_SELECT, "\033[4~" }, + { KEYC_F1, "\033OP", 0 }, + { KEYC_F2, "\033OQ", 0 }, + { KEYC_F3, "\033OR", 0 }, + { KEYC_F4, "\033OS", 0 }, + { KEYC_F5, "\033[15~", 0 }, + { KEYC_F6, "\033[17~", 0 }, + { KEYC_F7, "\033[18~", 0 }, + { KEYC_F8, "\033[19~", 0 }, + { KEYC_F9, "\033[20~", 0 }, + { KEYC_F10, "\033[21~", 0 }, + { KEYC_F11, "\033[23~", 0 }, + { KEYC_F12, "\033[24~", 0 }, + { KEYC_FIND, "\033[1~", 0 }, + { KEYC_DC, "\033[3~", 0 }, + { KEYC_IC, "\033[2~", 0 }, + { KEYC_NPAGE, "\033[6~", 0 }, + { KEYC_PPAGE, "\033[5~", 0 }, + { KEYC_SELECT, "\033[4~", 0 }, - { KEYC_UP, "\033OA" }, - { KEYC_DOWN, "\033OB" }, - { KEYC_LEFT, "\033OD" }, - { KEYC_RIGHT, "\033OC" }, + /* Keypad + cursor versions must come first. */ + { KEYC_UP, "\033OA", INPUTKEY_KEYPAD|INPUTKEY_CURSOR }, + { KEYC_DOWN, "\033OB", INPUTKEY_KEYPAD|INPUTKEY_CURSOR }, + { KEYC_LEFT, "\033OD", INPUTKEY_KEYPAD|INPUTKEY_CURSOR }, + { KEYC_RIGHT, "\033OC", INPUTKEY_KEYPAD|INPUTKEY_CURSOR }, - { KEYC_KP0_1, "\033Oo" }, - { KEYC_KP0_2, "\033Oj" }, - { KEYC_KP0_3, "\033Om" }, - { KEYC_KP1_0, "\033Ow" }, - { KEYC_KP1_1, "\033Ox" }, - { KEYC_KP1_2, "\033Oy" }, - { KEYC_KP1_3, "\033Ok" }, - { KEYC_KP2_0, "\033Ot" }, - { KEYC_KP2_1, "\033Ou" }, - { KEYC_KP2_2, "\033Ov" }, - { KEYC_KP3_0, "\033Oq" }, - { KEYC_KP3_1, "\033Or" }, - { KEYC_KP3_2, "\033Os" }, - { KEYC_KP3_3, "\033OM" }, - { KEYC_KP4_0, "\033Op" }, - { KEYC_KP4_2, "\033On" }, + { KEYC_UP, "\033[A", 0 }, + { KEYC_DOWN, "\033[B", 0 }, + { KEYC_LEFT, "\033[D", 0 }, + { KEYC_RIGHT, "\033[C", 0 }, + + { KEYC_KP0_1, "\033Oo", 0 }, + { KEYC_KP0_2, "\033Oj", 0 }, + { KEYC_KP0_3, "\033Om", 0 }, + { KEYC_KP1_0, "\033Ow", 0 }, + { KEYC_KP1_1, "\033Ox", 0 }, + { KEYC_KP1_2, "\033Oy", 0 }, + { KEYC_KP1_3, "\033Ok", 0 }, + { KEYC_KP2_0, "\033Ot", 0 }, + { KEYC_KP2_1, "\033Ou", 0 }, + { KEYC_KP2_2, "\033Ov", 0 }, + { KEYC_KP3_0, "\033Oq", 0 }, + { KEYC_KP3_1, "\033Or", 0 }, + { KEYC_KP3_2, "\033Os", 0 }, + { KEYC_KP3_3, "\033OM", 0 }, + { KEYC_KP4_0, "\033Op", 0 }, + { KEYC_KP4_2, "\033On", 0 }, }; #define NINPUTKEYS (sizeof input_keys / sizeof input_keys[0]) @@ -90,6 +99,12 @@ input_key(struct window *w, int key) } for (i = 0; i < NINPUTKEYS; i++) { + if ((input_keys[i].flags & INPUTKEY_KEYPAD) && + !(w->screen->mode & MODE_KKEYPAD)) + continue; + if ((input_keys[i].flags & INPUTKEY_CURSOR) && + !(w->screen->mode & MODE_KCURSOR)) + continue; if (input_keys[i].key == key) break; } diff --git a/screen.c b/screen.c index ca253906..b6a7fcd7 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $Id: screen.c,v 1.63 2008-06-29 07:04:30 nicm Exp $ */ +/* $Id: screen.c,v 1.64 2008-07-24 00:03:15 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -144,7 +144,7 @@ screen_create(struct screen *s, u_int dx, u_int dy, u_int hlimit) s->attr = SCREEN_DEFATTR; s->colr = SCREEN_DEFCOLR; - s->mode = MODE_CURSOR|MODE_KCURSOR|MODE_KKEYPAD; + s->mode = MODE_CURSOR|MODE_KCURSOR; s->title = xstrdup(""); s->grid_data = xmalloc(dy * (sizeof *s->grid_data)); @@ -169,7 +169,7 @@ screen_reset(struct screen *s) s->attr = SCREEN_DEFATTR; s->colr = SCREEN_DEFCOLR; - s->mode = MODE_CURSOR|MODE_KCURSOR|MODE_KKEYPAD; + s->mode = MODE_CURSOR|MODE_KCURSOR; screen_display_fill_area(s, 0, 0, screen_size_x(s), screen_size_y(s), ' ', 0, 0x88); diff --git a/tty-keys.c b/tty-keys.c index 15291fb1..f1551ec5 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -1,4 +1,4 @@ -/* $Id: tty-keys.c,v 1.7 2008-07-23 23:44:50 nicm Exp $ */ +/* $Id: tty-keys.c,v 1.8 2008-07-24 00:03:15 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -179,7 +179,7 @@ struct { { "pmous", KEYC_MOUSE }, /* - * Number keypad. + * Numeric keypad. * * This is totally confusing and I still don't quite understand how it * all fits together in relation to termcap...