Use libxkbcommon for mapping keycodes to keysyms
diff --git a/clients/terminal.c b/clients/terminal.c
index 162dfe8..e7e054b 100644
--- a/clients/terminal.c
+++ b/clients/terminal.c
@@ -32,9 +32,10 @@
#include <ctype.h>
#include <cairo.h>
#include <glib.h>
-#include <linux/input.h>
#include <cairo-drm.h>
+#include <X11/keysym.h>
+
#include "wayland-util.h"
#include "wayland-client.h"
#include "wayland-glib.h"
@@ -387,25 +388,56 @@
}
static void
-key_handler(struct window *window, uint32_t key, uint32_t unicode,
+key_handler(struct window *window, uint32_t key, uint32_t sym,
uint32_t state, uint32_t modifiers, void *data)
{
struct terminal *terminal = data;
- char ch = unicode;
+ char ch[2];
+ int len = 0;
- switch (key) {
- case KEY_F11:
+ switch (sym) {
+ case XK_F11:
if (!state)
break;
terminal->fullscreen ^= 1;
window_set_fullscreen(window, terminal->fullscreen);
window_schedule_redraw(terminal->window);
break;
+
+ case XK_Delete:
+ sym = 0x04;
+ case XK_BackSpace:
+ case XK_Tab:
+ case XK_Linefeed:
+ case XK_Clear:
+ case XK_Return:
+ case XK_Pause:
+ case XK_Scroll_Lock:
+ case XK_Sys_Req:
+ case XK_Escape:
+ ch[len++] = sym & 0x7f;
+ break;
+
+ case XK_Shift_L:
+ case XK_Shift_R:
+ case XK_Control_L:
+ case XK_Control_R:
+ case XK_Alt_L:
+ case XK_Alt_R:
+ break;
+
default:
- if (state && unicode)
- write(terminal->master, &ch, 1);
+ if (modifiers & WINDOW_MODIFIER_CONTROL)
+ sym = sym & 0x1f;
+ else if (modifiers & WINDOW_MODIFIER_ALT)
+ ch[len++] = 0x1b;
+ if (sym < 256)
+ ch[len++] = sym;
break;
}
+
+ if (state && len > 0)
+ write(terminal->master, ch, len);
}
static void