From b9b5d5ae2be24d41f3cbd71b9b30338afdb132ee Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Tue, 11 Apr 2023 09:09:03 +0200 Subject: add ctrl-sequences and custom kmap --- config.h | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ swt.c | 60 +++++++++++++++-- wayland.h | 26 ++++++-- 3 files changed, 293 insertions(+), 12 deletions(-) diff --git a/config.h b/config.h index fddb13b..7ab0827 100644 --- a/config.h +++ b/config.h @@ -1,6 +1,7 @@ /* See LICENSE file for copyright and license details. */ #include "drw.h" +#include "wayland.h" /* * appearance @@ -179,3 +180,221 @@ static unsigned int mousebg = 0; * doesn't match the ones requested. */ static unsigned int defaultattr = 11; + + +/* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ +static Key key[] = { + /* keysym mask string appkey appcursor */ + { XKB_KEY_KP_Home, KEY_MOD_SHIFT, "\033[2J", 0, -1}, + { XKB_KEY_KP_Home, KEY_MOD_SHIFT, "\033[1;2H", 0, +1}, + { XKB_KEY_KP_Home, KEY_MOD_ANY, "\033[H", 0, -1}, + { XKB_KEY_KP_Home, KEY_MOD_ANY, "\033[1~", 0, +1}, + { XKB_KEY_KP_Up, KEY_MOD_ANY, "\033Ox", +1, 0}, + { XKB_KEY_KP_Up, KEY_MOD_ANY, "\033[A", 0, -1}, + { XKB_KEY_KP_Up, KEY_MOD_ANY, "\033OA", 0, +1}, + { XKB_KEY_KP_Down, KEY_MOD_ANY, "\033Or", +1, 0}, + { XKB_KEY_KP_Down, KEY_MOD_ANY, "\033[B", 0, -1}, + { XKB_KEY_KP_Down, KEY_MOD_ANY, "\033OB", 0, +1}, + { XKB_KEY_KP_Left, KEY_MOD_ANY, "\033Ot", +1, 0}, + { XKB_KEY_KP_Left, KEY_MOD_ANY, "\033[D", 0, -1}, + { XKB_KEY_KP_Left, KEY_MOD_ANY, "\033OD", 0, +1}, + { XKB_KEY_KP_Right, KEY_MOD_ANY, "\033Ov", +1, 0}, + { XKB_KEY_KP_Right, KEY_MOD_ANY, "\033[C", 0, -1}, + { XKB_KEY_KP_Right, KEY_MOD_ANY, "\033OC", 0, +1}, + { XKB_KEY_KP_Prior, KEY_MOD_SHIFT, "\033[5;2~", 0, 0}, + { XKB_KEY_KP_Prior, KEY_MOD_ANY, "\033[5~", 0, 0}, + { XKB_KEY_KP_Begin, KEY_MOD_ANY, "\033[E", 0, 0}, + { XKB_KEY_KP_End, KEY_MOD_CTRL, "\033[J", -1, 0}, + { XKB_KEY_KP_End, KEY_MOD_CTRL, "\033[1;5F", +1, 0}, + { XKB_KEY_KP_End, KEY_MOD_SHIFT, "\033[K", -1, 0}, + { XKB_KEY_KP_End, KEY_MOD_SHIFT, "\033[1;2F", +1, 0}, + { XKB_KEY_KP_End, KEY_MOD_ANY, "\033[4~", 0, 0}, + { XKB_KEY_KP_Next, KEY_MOD_SHIFT, "\033[6;2~", 0, 0}, + { XKB_KEY_KP_Next, KEY_MOD_ANY, "\033[6~", 0, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_SHIFT, "\033[2;2~", +1, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_SHIFT, "\033[4l", -1, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_CTRL, "\033[L", -1, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_CTRL, "\033[2;5~", +1, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_ANY, "\033[4h", -1, 0}, + { XKB_KEY_KP_Insert, KEY_MOD_ANY, "\033[2~", +1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_CTRL, "\033[M", -1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_CTRL, "\033[3;5~", +1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_SHIFT, "\033[2K", -1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_SHIFT, "\033[3;2~", +1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_ANY, "\033[P", -1, 0}, + { XKB_KEY_KP_Delete, KEY_MOD_ANY, "\033[3~", +1, 0}, + { XKB_KEY_KP_Multiply, KEY_MOD_ANY, "\033Oj", +2, 0}, + { XKB_KEY_KP_Add, KEY_MOD_ANY, "\033Ok", +2, 0}, + { XKB_KEY_KP_Enter, KEY_MOD_ANY, "\033OM", +2, 0}, + { XKB_KEY_KP_Enter, KEY_MOD_ANY, "\r", -1, 0}, + { XKB_KEY_KP_Subtract, KEY_MOD_ANY, "\033Om", +2, 0}, + { XKB_KEY_KP_Decimal, KEY_MOD_ANY, "\033On", +2, 0}, + { XKB_KEY_KP_Divide, KEY_MOD_ANY, "\033Oo", +2, 0}, + { XKB_KEY_KP_0, KEY_MOD_ANY, "\033Op", +2, 0}, + { XKB_KEY_KP_1, KEY_MOD_ANY, "\033Oq", +2, 0}, + { XKB_KEY_KP_2, KEY_MOD_ANY, "\033Or", +2, 0}, + { XKB_KEY_KP_3, KEY_MOD_ANY, "\033Os", +2, 0}, + { XKB_KEY_KP_4, KEY_MOD_ANY, "\033Ot", +2, 0}, + { XKB_KEY_KP_5, KEY_MOD_ANY, "\033Ou", +2, 0}, + { XKB_KEY_KP_6, KEY_MOD_ANY, "\033Ov", +2, 0}, + { XKB_KEY_KP_7, KEY_MOD_ANY, "\033Ow", +2, 0}, + { XKB_KEY_KP_8, KEY_MOD_ANY, "\033Ox", +2, 0}, + { XKB_KEY_KP_9, KEY_MOD_ANY, "\033Oy", +2, 0}, + { XKB_KEY_Up, KEY_MOD_SHIFT, "\033[1;2A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_ALT, "\033[1;3A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_SHIFT|KEY_MOD_ALT,"\033[1;4A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_CTRL, "\033[1;5A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_SHIFT|KEY_MOD_CTRL,"\033[1;6A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;7A", 0, 0}, + { XKB_KEY_Up,KEY_MOD_SHIFT|KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;8A", 0, 0}, + { XKB_KEY_Up, KEY_MOD_ANY, "\033[A", 0, -1}, + { XKB_KEY_Up, KEY_MOD_ANY, "\033OA", 0, +1}, + { XKB_KEY_Down, KEY_MOD_SHIFT, "\033[1;2B", 0, 0}, + { XKB_KEY_Down, KEY_MOD_ALT, "\033[1;3B", 0, 0}, + { XKB_KEY_Down, KEY_MOD_SHIFT|KEY_MOD_ALT,"\033[1;4B", 0, 0}, + { XKB_KEY_Down, KEY_MOD_CTRL, "\033[1;5B", 0, 0}, + { XKB_KEY_Down, KEY_MOD_SHIFT|KEY_MOD_CTRL,"\033[1;6B", 0, 0}, + { XKB_KEY_Down, KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;7B", 0, 0}, + { XKB_KEY_Down,KEY_MOD_SHIFT|KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;8B",0, 0}, + { XKB_KEY_Down, KEY_MOD_ANY, "\033[B", 0, -1}, + { XKB_KEY_Down, KEY_MOD_ANY, "\033OB", 0, +1}, + { XKB_KEY_Left, KEY_MOD_SHIFT, "\033[1;2D", 0, 0}, + { XKB_KEY_Left, KEY_MOD_ALT, "\033[1;3D", 0, 0}, + { XKB_KEY_Left, KEY_MOD_SHIFT|KEY_MOD_ALT,"\033[1;4D", 0, 0}, + { XKB_KEY_Left, KEY_MOD_CTRL, "\033[1;5D", 0, 0}, + { XKB_KEY_Left, KEY_MOD_SHIFT|KEY_MOD_CTRL,"\033[1;6D", 0, 0}, + { XKB_KEY_Left, KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;7D", 0, 0}, + { XKB_KEY_Left,KEY_MOD_SHIFT|KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;8D",0, 0}, + { XKB_KEY_Left, KEY_MOD_ANY, "\033[D", 0, -1}, + { XKB_KEY_Left, KEY_MOD_ANY, "\033OD", 0, +1}, + { XKB_KEY_Right, KEY_MOD_SHIFT, "\033[1;2C", 0, 0}, + { XKB_KEY_Right, KEY_MOD_ALT, "\033[1;3C", 0, 0}, + { XKB_KEY_Right, KEY_MOD_SHIFT|KEY_MOD_ALT,"\033[1;4C", 0, 0}, + { XKB_KEY_Right, KEY_MOD_CTRL, "\033[1;5C", 0, 0}, + { XKB_KEY_Right, KEY_MOD_SHIFT|KEY_MOD_CTRL,"\033[1;6C", 0, 0}, + { XKB_KEY_Right, KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;7C", 0, 0}, + { XKB_KEY_Right,KEY_MOD_SHIFT|KEY_MOD_CTRL|KEY_MOD_ALT,"\033[1;8C",0, 0}, + { XKB_KEY_Right, KEY_MOD_ANY, "\033[C", 0, -1}, + { XKB_KEY_Right, KEY_MOD_ANY, "\033OC", 0, +1}, + { XKB_KEY_ISO_Left_Tab, KEY_MOD_SHIFT, "\033[Z", 0, 0}, + { XKB_KEY_Return, KEY_MOD_ALT, "\033\r", 0, 0}, + { XKB_KEY_Return, KEY_MOD_ANY, "\r", 0, 0}, + { XKB_KEY_Insert, KEY_MOD_SHIFT, "\033[4l", -1, 0}, + { XKB_KEY_Insert, KEY_MOD_SHIFT, "\033[2;2~", +1, 0}, + { XKB_KEY_Insert, KEY_MOD_CTRL, "\033[L", -1, 0}, + { XKB_KEY_Insert, KEY_MOD_CTRL, "\033[2;5~", +1, 0}, + { XKB_KEY_Insert, KEY_MOD_ANY, "\033[4h", -1, 0}, + { XKB_KEY_Insert, KEY_MOD_ANY, "\033[2~", +1, 0}, + { XKB_KEY_Delete, KEY_MOD_CTRL, "\033[M", -1, 0}, + { XKB_KEY_Delete, KEY_MOD_CTRL, "\033[3;5~", +1, 0}, + { XKB_KEY_Delete, KEY_MOD_SHIFT, "\033[2K", -1, 0}, + { XKB_KEY_Delete, KEY_MOD_SHIFT, "\033[3;2~", +1, 0}, + { XKB_KEY_Delete, KEY_MOD_ANY, "\033[P", -1, 0}, + { XKB_KEY_Delete, KEY_MOD_ANY, "\033[3~", +1, 0}, + { XKB_KEY_BackSpace, KEY_MOD_NONE, "\177", 0, 0}, + { XKB_KEY_BackSpace, KEY_MOD_ALT, "\033\177", 0, 0}, + { XKB_KEY_Home, KEY_MOD_SHIFT, "\033[2J", 0, -1}, + { XKB_KEY_Home, KEY_MOD_SHIFT, "\033[1;2H", 0, +1}, + { XKB_KEY_Home, KEY_MOD_ANY, "\033[H", 0, -1}, + { XKB_KEY_Home, KEY_MOD_ANY, "\033[1~", 0, +1}, + { XKB_KEY_End, KEY_MOD_CTRL, "\033[J", -1, 0}, + { XKB_KEY_End, KEY_MOD_CTRL, "\033[1;5F", +1, 0}, + { XKB_KEY_End, KEY_MOD_SHIFT, "\033[K", -1, 0}, + { XKB_KEY_End, KEY_MOD_SHIFT, "\033[1;2F", +1, 0}, + { XKB_KEY_End, KEY_MOD_ANY, "\033[4~", 0, 0}, + { XKB_KEY_Prior, KEY_MOD_CTRL, "\033[5;5~", 0, 0}, + { XKB_KEY_Prior, KEY_MOD_SHIFT, "\033[5;2~", 0, 0}, + { XKB_KEY_Prior, KEY_MOD_ANY, "\033[5~", 0, 0}, + { XKB_KEY_Next, KEY_MOD_CTRL, "\033[6;5~", 0, 0}, + { XKB_KEY_Next, KEY_MOD_SHIFT, "\033[6;2~", 0, 0}, + { XKB_KEY_Next, KEY_MOD_ANY, "\033[6~", 0, 0}, + { XKB_KEY_F1, KEY_MOD_NONE, "\033OP" , 0, 0}, + { XKB_KEY_F1, /* F13 */ KEY_MOD_SHIFT, "\033[1;2P", 0, 0}, + { XKB_KEY_F1, /* F25 */ KEY_MOD_CTRL, "\033[1;5P", 0, 0}, + { XKB_KEY_F1, /* F37 */ KEY_MOD_LOGO, "\033[1;6P", 0, 0}, + { XKB_KEY_F1, /* F49 */ KEY_MOD_ALT, "\033[1;3P", 0, 0}, + { XKB_KEY_F1, /* F61 */ KEY_MOD_SHIFT, "\033[1;4P", 0, 0}, + { XKB_KEY_F2, KEY_MOD_NONE, "\033OQ" , 0, 0}, + { XKB_KEY_F2, /* F14 */ KEY_MOD_SHIFT, "\033[1;2Q", 0, 0}, + { XKB_KEY_F2, /* F26 */ KEY_MOD_CTRL, "\033[1;5Q", 0, 0}, + { XKB_KEY_F2, /* F38 */ KEY_MOD_LOGO, "\033[1;6Q", 0, 0}, + { XKB_KEY_F2, /* F50 */ KEY_MOD_ALT, "\033[1;3Q", 0, 0}, + { XKB_KEY_F2, /* F62 */ KEY_MOD_SHIFT, "\033[1;4Q", 0, 0}, + { XKB_KEY_F3, KEY_MOD_NONE, "\033OR" , 0, 0}, + { XKB_KEY_F3, /* F15 */ KEY_MOD_SHIFT, "\033[1;2R", 0, 0}, + { XKB_KEY_F3, /* F27 */ KEY_MOD_CTRL, "\033[1;5R", 0, 0}, + { XKB_KEY_F3, /* F39 */ KEY_MOD_LOGO, "\033[1;6R", 0, 0}, + { XKB_KEY_F3, /* F51 */ KEY_MOD_ALT, "\033[1;3R", 0, 0}, + { XKB_KEY_F3, /* F63 */ KEY_MOD_SHIFT, "\033[1;4R", 0, 0}, + { XKB_KEY_F4, KEY_MOD_NONE, "\033OS" , 0, 0}, + { XKB_KEY_F4, /* F16 */ KEY_MOD_SHIFT, "\033[1;2S", 0, 0}, + { XKB_KEY_F4, /* F28 */ KEY_MOD_CTRL, "\033[1;5S", 0, 0}, + { XKB_KEY_F4, /* F40 */ KEY_MOD_LOGO, "\033[1;6S", 0, 0}, + { XKB_KEY_F4, /* F52 */ KEY_MOD_ALT, "\033[1;3S", 0, 0}, + { XKB_KEY_F5, KEY_MOD_NONE, "\033[15~", 0, 0}, + { XKB_KEY_F5, /* F17 */ KEY_MOD_SHIFT, "\033[15;2~", 0, 0}, + { XKB_KEY_F5, /* F29 */ KEY_MOD_CTRL, "\033[15;5~", 0, 0}, + { XKB_KEY_F5, /* F41 */ KEY_MOD_LOGO, "\033[15;6~", 0, 0}, + { XKB_KEY_F5, /* F53 */ KEY_MOD_ALT, "\033[15;3~", 0, 0}, + { XKB_KEY_F6, KEY_MOD_NONE, "\033[17~", 0, 0}, + { XKB_KEY_F6, /* F18 */ KEY_MOD_SHIFT, "\033[17;2~", 0, 0}, + { XKB_KEY_F6, /* F30 */ KEY_MOD_CTRL, "\033[17;5~", 0, 0}, + { XKB_KEY_F6, /* F42 */ KEY_MOD_LOGO, "\033[17;6~", 0, 0}, + { XKB_KEY_F6, /* F54 */ KEY_MOD_ALT, "\033[17;3~", 0, 0}, + { XKB_KEY_F7, KEY_MOD_NONE, "\033[18~", 0, 0}, + { XKB_KEY_F7, /* F19 */ KEY_MOD_SHIFT, "\033[18;2~", 0, 0}, + { XKB_KEY_F7, /* F31 */ KEY_MOD_CTRL, "\033[18;5~", 0, 0}, + { XKB_KEY_F7, /* F43 */ KEY_MOD_LOGO, "\033[18;6~", 0, 0}, + { XKB_KEY_F7, /* F55 */ KEY_MOD_ALT, "\033[18;3~", 0, 0}, + { XKB_KEY_F8, KEY_MOD_NONE, "\033[19~", 0, 0}, + { XKB_KEY_F8, /* F20 */ KEY_MOD_SHIFT, "\033[19;2~", 0, 0}, + { XKB_KEY_F8, /* F32 */ KEY_MOD_CTRL, "\033[19;5~", 0, 0}, + { XKB_KEY_F8, /* F44 */ KEY_MOD_LOGO, "\033[19;6~", 0, 0}, + { XKB_KEY_F8, /* F56 */ KEY_MOD_ALT, "\033[19;3~", 0, 0}, + { XKB_KEY_F9, KEY_MOD_NONE, "\033[20~", 0, 0}, + { XKB_KEY_F9, /* F21 */ KEY_MOD_SHIFT, "\033[20;2~", 0, 0}, + { XKB_KEY_F9, /* F33 */ KEY_MOD_CTRL, "\033[20;5~", 0, 0}, + { XKB_KEY_F9, /* F45 */ KEY_MOD_LOGO, "\033[20;6~", 0, 0}, + { XKB_KEY_F9, /* F57 */ KEY_MOD_ALT, "\033[20;3~", 0, 0}, + { XKB_KEY_F10, KEY_MOD_NONE, "\033[21~", 0, 0}, + { XKB_KEY_F10, /* F22 */ KEY_MOD_SHIFT, "\033[21;2~", 0, 0}, + { XKB_KEY_F10, /* F34 */ KEY_MOD_CTRL, "\033[21;5~", 0, 0}, + { XKB_KEY_F10, /* F46 */ KEY_MOD_LOGO, "\033[21;6~", 0, 0}, + { XKB_KEY_F10, /* F58 */ KEY_MOD_ALT, "\033[21;3~", 0, 0}, + { XKB_KEY_F11, KEY_MOD_NONE, "\033[23~", 0, 0}, + { XKB_KEY_F11, /* F23 */ KEY_MOD_SHIFT, "\033[23;2~", 0, 0}, + { XKB_KEY_F11, /* F35 */ KEY_MOD_CTRL, "\033[23;5~", 0, 0}, + { XKB_KEY_F11, /* F47 */ KEY_MOD_LOGO, "\033[23;6~", 0, 0}, + { XKB_KEY_F11, /* F59 */ KEY_MOD_ALT, "\033[23;3~", 0, 0}, + { XKB_KEY_F12, KEY_MOD_NONE, "\033[24~", 0, 0}, + { XKB_KEY_F12, /* F24 */ KEY_MOD_SHIFT, "\033[24;2~", 0, 0}, + { XKB_KEY_F12, /* F36 */ KEY_MOD_CTRL, "\033[24;5~", 0, 0}, + { XKB_KEY_F12, /* F48 */ KEY_MOD_LOGO, "\033[24;6~", 0, 0}, + { XKB_KEY_F12, /* F60 */ KEY_MOD_ALT, "\033[24;3~", 0, 0}, + { XKB_KEY_F13, KEY_MOD_NONE, "\033[1;2P", 0, 0}, + { XKB_KEY_F14, KEY_MOD_NONE, "\033[1;2Q", 0, 0}, + { XKB_KEY_F15, KEY_MOD_NONE, "\033[1;2R", 0, 0}, + { XKB_KEY_F16, KEY_MOD_NONE, "\033[1;2S", 0, 0}, + { XKB_KEY_F17, KEY_MOD_NONE, "\033[15;2~", 0, 0}, + { XKB_KEY_F18, KEY_MOD_NONE, "\033[17;2~", 0, 0}, + { XKB_KEY_F19, KEY_MOD_NONE, "\033[18;2~", 0, 0}, + { XKB_KEY_F20, KEY_MOD_NONE, "\033[19;2~", 0, 0}, + { XKB_KEY_F21, KEY_MOD_NONE, "\033[20;2~", 0, 0}, + { XKB_KEY_F22, KEY_MOD_NONE, "\033[21;2~", 0, 0}, + { XKB_KEY_F23, KEY_MOD_NONE, "\033[23;2~", 0, 0}, + { XKB_KEY_F24, KEY_MOD_NONE, "\033[24;2~", 0, 0}, + { XKB_KEY_F25, KEY_MOD_NONE, "\033[1;5P", 0, 0}, + { XKB_KEY_F26, KEY_MOD_NONE, "\033[1;5Q", 0, 0}, + { XKB_KEY_F27, KEY_MOD_NONE, "\033[1;5R", 0, 0}, + { XKB_KEY_F28, KEY_MOD_NONE, "\033[1;5S", 0, 0}, + { XKB_KEY_F29, KEY_MOD_NONE, "\033[15;5~", 0, 0}, + { XKB_KEY_F30, KEY_MOD_NONE, "\033[17;5~", 0, 0}, + { XKB_KEY_F31, KEY_MOD_NONE, "\033[18;5~", 0, 0}, + { XKB_KEY_F32, KEY_MOD_NONE, "\033[19;5~", 0, 0}, + { XKB_KEY_F33, KEY_MOD_NONE, "\033[20;5~", 0, 0}, + { XKB_KEY_F34, KEY_MOD_NONE, "\033[21;5~", 0, 0}, + { XKB_KEY_F35, KEY_MOD_NONE, "\033[23;5~", 0, 0}, +}; diff --git a/swt.c b/swt.c index b43b43d..60d9e9a 100644 --- a/swt.c +++ b/swt.c @@ -55,6 +55,8 @@ static void setup(); static void cleanup(); static void run(); static void usage(); +static int matchmod(uint32_t mask, uint32_t mod); +static char *kmap(); static void buffer_release(void *data, struct wl_buffer *buffer); static void draw_frame(); static void commit_surface(); @@ -370,13 +372,13 @@ toplevel_configure(void *data, struct xdg_toplevel *toplevel, int32_t width, int } win.canvas = create_drw(client.shm, win.width, win.height); + draw_frame(); ttywidth = (win.width - 2 * borderpx) / win.fontcache->box.width; ttyheight = (win.height - 2 * borderpx) / win.fontcache->box.height; ttywidth = MAX(ttywidth, 1); ttyheight = MAX(ttyheight, 1); tresize(ttywidth, ttyheight); ttyresize(ttywidth, ttyheight); - draw_frame(); } } @@ -488,21 +490,27 @@ keyboard_modifiers(void *data, struct wl_keyboard *keybaord, uint32_t serial, ui { xkb_state_update_mask(client.kb.state, depressed, latched, locked, 0, 0, group); - client.kb.event.mods.alt = xkb_state_mod_name_is_active( + client.kb.event.mod = 0; + client.kb.event.mod |= xkb_state_mod_name_is_active( client.kb.state, XKB_MOD_NAME_ALT, XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED - ); - client.kb.event.mods.ctrl = xkb_state_mod_name_is_active( + ) * KEY_MOD_ALT; + client.kb.event.mod = xkb_state_mod_name_is_active( client.kb.state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED - ); - client.kb.event.mods.shift = xkb_state_mod_name_is_active( + ) * KEY_MOD_CTRL; + client.kb.event.mod |= xkb_state_mod_name_is_active( client.kb.state, XKB_MOD_NAME_SHIFT, XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED - ); + ) * KEY_MOD_SHIFT; + client.kb.event.mod |= xkb_state_mod_name_is_active( + client.kb.state, + XKB_MOD_NAME_LOGO, + XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED + ) * KEY_MOD_LOGO; } @@ -518,14 +526,52 @@ keyboard_repeat_info(void *data, struct wl_keyboard *keyboard, int32_t rate, int } +int +matchmod(uint32_t mask, uint32_t mod) +{ + return mask == KEY_MOD_ANY || mask == mod; +} + + +char * +kmap() +{ + Key *kp; + + for (kp = key; kp < key + LEN(key); kp++) { + if (kp->k != client.kb.event.sym) + continue; + + if (!matchmod(kp->mask, client.kb.event.mod)) + continue; + + return kp->s; + } + + return 0; +} + + void handle_keyboard_event() { char buf[9] = { 0 }; + char *customkey; int len; + char c; if (client.kb.event.state == WL_KEYBOARD_KEY_STATE_PRESSED) { + if ((customkey = kmap())) { + ttywrite(customkey, strlen(customkey), 1); + return; + } + if ((len = xkb_keysym_to_utf8(client.kb.event.sym, buf, 8))) { + if (client.kb.event.mod & KEY_MOD_CTRL) { + xkb_keysym_to_utf8(xkb_keysym_to_lower(client.kb.event.sym), buf, 8); + buf[0] -= 'a' - 1; + } + ttywrite(buf, strlen(buf), 1); } } diff --git a/wayland.h b/wayland.h index 5d12ac5..7cbbc90 100644 --- a/wayland.h +++ b/wayland.h @@ -2,9 +2,29 @@ #define WAYLAND_H #include +#include #include #include "xdg-shell-client-protocol.h" +typedef enum { + KEY_MOD_NONE = 0, + KEY_MOD_CTRL = 1, + KEY_MOD_ALT = 2, + KEY_MOD_SHIFT = 4, + KEY_MOD_LOGO = 8, + KEY_MOD_ANY = 16 +} ModMask; + + +typedef struct { + uint32_t k; + uint32_t mask; + char *s; + /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ + signed char appkey; /* application keypad */ + signed char appcursor; /* application cursor */ +} Key; + typedef struct { struct wl_display *display; @@ -21,11 +41,7 @@ typedef struct { struct { uint32_t state; uint32_t sym; - struct { - uint32_t ctrl; - uint32_t alt; - uint32_t shift; - } mods; + uint32_t mod; } event; struct { int timer; -- cgit v1.2.3-70-g09d2