diff options
-rw-r--r-- | crawl-ref/source/cio.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/libunix.cc | 85 |
2 files changed, 89 insertions, 0 deletions
diff --git a/crawl-ref/source/cio.cc b/crawl-ref/source/cio.cc index 1696b5dc30..4b64426a0e 100644 --- a/crawl-ref/source/cio.cc +++ b/crawl-ref/source/cio.cc @@ -17,6 +17,8 @@ REVISION("$Rev$"); #include <queue> #ifdef UNIX +extern int unixcurses_get_vi_key(int keyin); + static keycode_type _numpad2vi(keycode_type key) { if (key >= '1' && key <= '9') @@ -91,6 +93,8 @@ int unmangle_direction_keys(int keyin, KeymapContext keymap, case '7': return 'y'; case '8': return 'k'; case '9': return 'u'; + + default: return unixcurses_get_vi_key(keyin); #else case '1': return 'B'; case '2': return 'J'; diff --git a/crawl-ref/source/libunix.cc b/crawl-ref/source/libunix.cc index b73f5af6bb..f2cc7a76f2 100644 --- a/crawl-ref/source/libunix.cc +++ b/crawl-ref/source/libunix.cc @@ -411,10 +411,91 @@ void message_out(int which_line, int color, const char *s, int firstcol, wrefresh(Message_Window); } +static void unixcurses_defkeys( void ) +{ + // keypad 0-9 (only if the "application mode" was successfully initialized) + define_key("\033Op", 1000); + define_key("\033Oq", 1001); + define_key("\033Or", 1002); + define_key("\033Os", 1003); + define_key("\033Ot", 1004); + define_key("\033Ou", 1005); + define_key("\033Ov", 1006); + define_key("\033Ow", 1007); + define_key("\033Ox", 1008); + define_key("\033Oy", 1009); + + // non-arrow keypad keys (for macros) + define_key("\033OM", 1010); // Enter + define_key("\033OP", 1011); // NumLock + define_key("\033OQ", 1012); // / + define_key("\033OR", 1013); // * + define_key("\033OS", 1014); // - + define_key("\033Oj", 1015); // * + define_key("\033Ok", 1016); // + + define_key("\033Ol", 1017); // + + define_key("\033Om", 1018); // . + define_key("\033On", 1019); // . + define_key("\033Oo", 1020); // - + + // variants. Ugly curses won't allow us to return the same code... + define_key("\033[1~", 1031); // Home + define_key("\033[4~", 1034); // End + define_key("\033[E", 1040); // center arrow +} + +int unixcurses_get_vi_key(int keyin) +{ + switch(keyin) + { + case 1001: return 'b'; + case 1002: return 'j'; + case 1003: return 'n'; + case 1004: return 'h'; + case 1005: return '5'; + case 1006: return 'l'; + case 1007: return 'y'; + case 1008: return 'k'; + case 1009: return 'u'; + + case 1031: return 'y'; + case 1034: return 'b'; + case 1040: return '5'; + + case KEY_HOME: return 'y'; + case KEY_END: return 'b'; + case KEY_DOWN: return 'j'; + case KEY_UP: return 'k'; + case KEY_LEFT: return 'h'; + case KEY_RIGHT: return 'l'; + case KEY_NPAGE: return 'n'; + case KEY_PPAGE: return 'u'; + case KEY_A1: return 'y'; + case KEY_A3: return 'u'; + case KEY_B2: return '5'; + case KEY_C1: return 'b'; + case KEY_C3: return 'n'; + case KEY_SHOME: return 'Y'; + case KEY_SEND: return 'B'; + case KEY_SLEFT: return 'H'; + case KEY_SRIGHT: return 'L'; + } + return keyin; +} + +// Certain terminals support vt100 keypad application mode only after some +// extra goading. +#define KPADAPP "\033[?1051l\033[?1052l\033[?1060l\033[?1061h" +#define KPADCUR "\033[?1051l\033[?1052l\033[?1060l\033[?1061l" + void unixcurses_startup( void ) { termio_init(); +#ifdef CURSES_USE_KEYPAD + write(1, KPADAPP, strlen(KPADAPP)); +#endif + #ifdef DGAMELAUNCH // Force timezone to UTC. setenv("TZ", "", 1); @@ -461,6 +542,7 @@ void unixcurses_startup( void ) #endif meta(stdscr, TRUE); + unixcurses_defkeys(); start_color(); setup_colour_pairs(); @@ -484,6 +566,9 @@ void unixcurses_shutdown() endwin(); tcsetattr(0, TCSAFLUSH, &def_term); +#ifdef CURSES_USE_KEYPAD + write(1, KPADCUR, strlen(KPADCUR)); +#endif #ifdef USE_UNIX_SIGNALS #ifdef SIGQUIT |