diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-12-12 12:53:55 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-12-12 12:54:10 -0500 |
commit | 029e0c7a2c212c90577816b8c9012dc2001194fe (patch) | |
tree | a3e070e8abc5a85891c2df47c8e1f7827652a352 /wayland | |
parent | Merge pull request #300 from mikkeloscar/configure-mouse-btn (diff) | |
download | sway-029e0c7a2c212c90577816b8c9012dc2001194fe.tar.gz sway-029e0c7a2c212c90577816b8c9012dc2001194fe.tar.zst sway-029e0c7a2c212c90577816b8c9012dc2001194fe.zip |
Add some more keyboard handling for wayland clients
Diffstat (limited to 'wayland')
-rw-r--r-- | wayland/registry.c | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/wayland/registry.c b/wayland/registry.c index 45735ccd..c6344cab 100644 --- a/wayland/registry.c +++ b/wayland/registry.c | |||
@@ -43,25 +43,25 @@ static const struct wl_output_listener output_listener = { | |||
43 | }; | 43 | }; |
44 | 44 | ||
45 | const char *XKB_MASK_NAMES[MASK_LAST] = { | 45 | const char *XKB_MASK_NAMES[MASK_LAST] = { |
46 | XKB_MOD_NAME_SHIFT, | 46 | XKB_MOD_NAME_SHIFT, |
47 | XKB_MOD_NAME_CAPS, | 47 | XKB_MOD_NAME_CAPS, |
48 | XKB_MOD_NAME_CTRL, | 48 | XKB_MOD_NAME_CTRL, |
49 | XKB_MOD_NAME_ALT, | 49 | XKB_MOD_NAME_ALT, |
50 | "Mod2", | 50 | "Mod2", |
51 | "Mod3", | 51 | "Mod3", |
52 | XKB_MOD_NAME_LOGO, | 52 | XKB_MOD_NAME_LOGO, |
53 | "Mod5", | 53 | "Mod5", |
54 | }; | 54 | }; |
55 | 55 | ||
56 | const enum mod_bit XKB_MODS[MASK_LAST] = { | 56 | const enum mod_bit XKB_MODS[MASK_LAST] = { |
57 | MOD_SHIFT, | 57 | MOD_SHIFT, |
58 | MOD_CAPS, | 58 | MOD_CAPS, |
59 | MOD_CTRL, | 59 | MOD_CTRL, |
60 | MOD_ALT, | 60 | MOD_ALT, |
61 | MOD_MOD2, | 61 | MOD_MOD2, |
62 | MOD_MOD3, | 62 | MOD_MOD3, |
63 | MOD_LOGO, | 63 | MOD_LOGO, |
64 | MOD_MOD5 | 64 | MOD_MOD5 |
65 | }; | 65 | }; |
66 | 66 | ||
67 | static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, | 67 | static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, |
@@ -113,14 +113,29 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard, | |||
113 | 113 | ||
114 | static void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, | 114 | static void keyboard_handle_enter(void *data, struct wl_keyboard *keyboard, |
115 | uint32_t serial, struct wl_surface *surface, struct wl_array *keys) { | 115 | uint32_t serial, struct wl_surface *surface, struct wl_array *keys) { |
116 | // this space intentionally left blank | ||
116 | } | 117 | } |
117 | 118 | ||
118 | static void keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, | 119 | static void keyboard_handle_leave(void *data, struct wl_keyboard *keyboard, |
119 | uint32_t serial, struct wl_surface *surface) { | 120 | uint32_t serial, struct wl_surface *surface) { |
121 | // this space intentionally left blank | ||
120 | } | 122 | } |
121 | 123 | ||
122 | static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, | 124 | static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard, |
123 | uint32_t serial, uint32_t time, uint32_t key, uint32_t state_w) { | 125 | uint32_t serial, uint32_t time, uint32_t key, uint32_t state_w) { |
126 | struct registry *registry = data; | ||
127 | enum wl_keyboard_key_state state = state_w; | ||
128 | |||
129 | if (!input->xkb.state) { | ||
130 | return; | ||
131 | } | ||
132 | |||
133 | xkb_keysym_t sym = xkb_state_key_get_one_sym(input->xkb.state, key + 8); | ||
134 | registry->input->sym = (state == WL_KEYBOARD_KEY_STATE_PRESSED ? sym : XKB_KEY_NoSymbol); | ||
135 | registry->input->code = (state == WL_KEYBOARD_KEY_STATE_PRESSED ? key + 8 : 0); | ||
136 | if (registry->input->notify) { | ||
137 | registry->input->notify(state, sym, key); | ||
138 | } | ||
124 | } | 139 | } |
125 | 140 | ||
126 | static void keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, | 141 | static void keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, |