diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-13 14:16:34 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-13 14:16:34 -0400 |
commit | f1f1d4fe193d7c0e2499376c1257c3becc0fb759 (patch) | |
tree | 3b7f8fd8fad5ec80d38273f89838597bea8b7deb /window-xlib.c | |
parent | bab9bfdb3767c4efbc0ca719eb54961947d85918 (diff) | |
download | runes-f1f1d4fe193d7c0e2499376c1257c3becc0fb759.tar.gz runes-f1f1d4fe193d7c0e2499376c1257c3becc0fb759.zip |
handle more function keys
Diffstat (limited to 'window-xlib.c')
-rw-r--r-- | window-xlib.c | 74 |
1 files changed, 58 insertions, 16 deletions
diff --git a/window-xlib.c b/window-xlib.c index 0924e2a..76cbada 100644 --- a/window-xlib.c +++ b/window-xlib.c @@ -19,6 +19,46 @@ static char *atom_names[RUNES_NUM_ATOMS] = { "RUNES_FLUSH" }; +struct function_key { + KeySym sym; + char *str; + size_t len; +}; + +#define RUNES_KEY(sym, str) { sym, str, sizeof(str) - 1 } +static struct function_key keys[] = { + RUNES_KEY(XK_Up, "\e[A"), + RUNES_KEY(XK_Down, "\e[B"), + RUNES_KEY(XK_Right, "\e[C"), + RUNES_KEY(XK_Left, "\e[D"), + RUNES_KEY(XK_Page_Up, "\e[5~"), + RUNES_KEY(XK_Page_Down, "\e[6~"), + RUNES_KEY(XK_Home, "\e[H"), + RUNES_KEY(XK_End, "\e[F"), + RUNES_KEY(XK_F1, "\eOP"), + RUNES_KEY(XK_F2, "\eOQ"), + RUNES_KEY(XK_F3, "\eOR"), + RUNES_KEY(XK_F4, "\eOS"), + RUNES_KEY(XK_F5, "\e[15~"), + RUNES_KEY(XK_F6, "\e[17~"), + RUNES_KEY(XK_F7, "\e[18~"), + RUNES_KEY(XK_F8, "\e[19~"), + RUNES_KEY(XK_F9, "\e[20~"), + RUNES_KEY(XK_F10, "\e[21~"), + RUNES_KEY(XK_F11, "\e[23~"), + RUNES_KEY(XK_F12, "\e[24~"), + RUNES_KEY(XK_F13, "\e[25~"), + RUNES_KEY(XK_F14, "\e[26~"), + RUNES_KEY(XK_F15, "\e[28~"), + RUNES_KEY(XK_F16, "\e[29~"), + RUNES_KEY(XK_F17, "\e[31~"), + RUNES_KEY(XK_F18, "\e[32~"), + RUNES_KEY(XK_F19, "\e[33~"), + RUNES_KEY(XK_F20, "\e[34~"), + RUNES_KEY(XK_VoidSymbol, "") +}; +#undef RUNES_KEY + static void runes_window_backend_get_next_event(uv_work_t *req); static void runes_window_backend_process_event(uv_work_t *req, int status); static void runes_window_backend_map_window(RunesTerm *t); @@ -214,24 +254,26 @@ static void runes_window_backend_process_event(uv_work_t *req, int status) break; } - if (chars) { + switch (s) { + case XLookupChars: + case XLookupBoth: runes_pty_backend_write(t, buf, chars); - } - else if (sym) { - switch (sym) { - case XK_Up: - runes_pty_backend_write(t, "\e[A", 3); - break; - case XK_Down: - runes_pty_backend_write(t, "\e[B", 3); - break; - case XK_Right: - runes_pty_backend_write(t, "\e[C", 3); - break; - case XK_Left: - runes_pty_backend_write(t, "\e[D", 3); - break; + break; + case XLookupKeySym: { + struct function_key *key; + + key = &keys[0]; + while (key->sym != XK_VoidSymbol) { + if (key->sym == sym) { + runes_pty_backend_write(t, key->str, key->len); + break; + } + key++; } + break; + } + default: + break; } free(buf); break; |