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 | |
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
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | include/client/registry.h | 58 | ||||
-rw-r--r-- | swaylock/main.c | 6 | ||||
-rw-r--r-- | wayland/registry.c | 47 |
4 files changed, 58 insertions, 55 deletions
@@ -49,7 +49,7 @@ Run these commands: | |||
49 | 49 | ||
50 | mkdir build | 50 | mkdir build |
51 | cd build | 51 | cd build |
52 | cmake .. | 52 | cmake -DCMAKE_BUILD_TYPE=Release .. |
53 | make | 53 | make |
54 | sudo make install | 54 | sudo make install |
55 | 55 | ||
diff --git a/include/client/registry.h b/include/client/registry.h index 2ab02174..253fcab8 100644 --- a/include/client/registry.h +++ b/include/client/registry.h | |||
@@ -8,26 +8,26 @@ | |||
8 | #include "list.h" | 8 | #include "list.h" |
9 | 9 | ||
10 | enum mod_bit { | 10 | enum mod_bit { |
11 | MOD_SHIFT = 1<<0, | 11 | MOD_SHIFT = 1<<0, |
12 | MOD_CAPS = 1<<1, | 12 | MOD_CAPS = 1<<1, |
13 | MOD_CTRL = 1<<2, | 13 | MOD_CTRL = 1<<2, |
14 | MOD_ALT = 1<<3, | 14 | MOD_ALT = 1<<3, |
15 | MOD_MOD2 = 1<<4, | 15 | MOD_MOD2 = 1<<4, |
16 | MOD_MOD3 = 1<<5, | 16 | MOD_MOD3 = 1<<5, |
17 | MOD_LOGO = 1<<6, | 17 | MOD_LOGO = 1<<6, |
18 | MOD_MOD5 = 1<<7, | 18 | MOD_MOD5 = 1<<7, |
19 | }; | 19 | }; |
20 | 20 | ||
21 | enum mask { | 21 | enum mask { |
22 | MASK_SHIFT, | 22 | MASK_SHIFT, |
23 | MASK_CAPS, | 23 | MASK_CAPS, |
24 | MASK_CTRL, | 24 | MASK_CTRL, |
25 | MASK_ALT, | 25 | MASK_ALT, |
26 | MASK_MOD2, | 26 | MASK_MOD2, |
27 | MASK_MOD3, | 27 | MASK_MOD3, |
28 | MASK_LOGO, | 28 | MASK_LOGO, |
29 | MASK_MOD5, | 29 | MASK_MOD5, |
30 | MASK_LAST | 30 | MASK_LAST |
31 | }; | 31 | }; |
32 | 32 | ||
33 | struct output_state { | 33 | struct output_state { |
@@ -44,26 +44,14 @@ struct xkb { | |||
44 | }; | 44 | }; |
45 | 45 | ||
46 | struct input { | 46 | struct input { |
47 | int *repeat_fd; | 47 | struct xkb xkb; |
48 | 48 | ||
49 | struct xkb xkb; | 49 | xkb_keysym_t sym; |
50 | uint32_t code; | ||
51 | uint32_t last_code; | ||
52 | uint32_t modifiers; | ||
50 | 53 | ||
51 | xkb_keysym_t sym; | 54 | void (*notify)(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t code); |
52 | uint32_t code; | ||
53 | uint32_t last_code; | ||
54 | uint32_t modifiers; | ||
55 | |||
56 | xkb_keysym_t repeat_sym; | ||
57 | uint32_t repeat_key; | ||
58 | |||
59 | int32_t repeat_rate_sec; | ||
60 | int32_t repeat_rate_nsec; | ||
61 | int32_t repeat_delay_sec; | ||
62 | int32_t repeat_delay_nsec; | ||
63 | |||
64 | struct { | ||
65 | void (*key)(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t code); | ||
66 | } notify; | ||
67 | }; | 55 | }; |
68 | 56 | ||
69 | struct registry { | 57 | struct registry { |
diff --git a/swaylock/main.c b/swaylock/main.c index 0e96afc7..c3743965 100644 --- a/swaylock/main.c +++ b/swaylock/main.c | |||
@@ -34,9 +34,9 @@ int main(int argc, char **argv) { | |||
34 | surfaces = create_list(); | 34 | surfaces = create_list(); |
35 | registry = registry_poll(); | 35 | registry = registry_poll(); |
36 | 36 | ||
37 | if (!registry->swaylock) { | 37 | /*if (!registry->swaylock) { |
38 | sway_abort("swaylock requires the compositor to support the swaylock extension."); | 38 | sway_abort("swaylock requires the compositor to support the swaylock extension."); |
39 | } | 39 | }*/ |
40 | 40 | ||
41 | int i; | 41 | int i; |
42 | for (i = 0; i < registry->outputs->length; ++i) { | 42 | for (i = 0; i < registry->outputs->length; ++i) { |
@@ -45,7 +45,7 @@ int main(int argc, char **argv) { | |||
45 | if (!window) { | 45 | if (!window) { |
46 | sway_abort("Failed to create surfaces."); | 46 | sway_abort("Failed to create surfaces."); |
47 | } | 47 | } |
48 | lock_set_lock_surface(registry->swaylock, output->output, window->surface); | 48 | //lock_set_lock_surface(registry->swaylock, output->output, window->surface); |
49 | list_add(surfaces, window); | 49 | list_add(surfaces, window); |
50 | } | 50 | } |
51 | 51 | ||
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, |