aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/keyboard.c
diff options
context:
space:
mode:
authorLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-14 11:11:56 -0500
committerLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-14 11:11:56 -0500
commit92fef27eaa0b52c9d37bdabff14ae21cd6660f46 (patch)
tree7a923bbbc233079006597d82721117bae88b6ac6 /sway/input/keyboard.c
parentseat configuration (diff)
downloadsway-92fef27eaa0b52c9d37bdabff14ae21cd6660f46.tar.gz
sway-92fef27eaa0b52c9d37bdabff14ae21cd6660f46.tar.zst
sway-92fef27eaa0b52c9d37bdabff14ae21cd6660f46.zip
basic configuration
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r--sway/input/keyboard.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 6a792c65..53db3270 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -5,32 +5,46 @@
5static void handle_keyboard_key(struct wl_listener *listener, void *data) { 5static void handle_keyboard_key(struct wl_listener *listener, void *data) {
6 struct sway_keyboard *keyboard = 6 struct sway_keyboard *keyboard =
7 wl_container_of(listener, keyboard, keyboard_key); 7 wl_container_of(listener, keyboard, keyboard_key);
8 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
9 struct wlr_input_device *wlr_device =
10 keyboard->seat_device->input_device->wlr_device;
8 struct wlr_event_keyboard_key *event = data; 11 struct wlr_event_keyboard_key *event = data;
9 wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); 12 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
10 wlr_seat_keyboard_notify_key(keyboard->seat->seat, event->time_msec, 13 wlr_seat_set_keyboard(wlr_seat, wlr_device);
11 event->keycode, event->state); 14 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,event->keycode,
15 event->state);
12} 16}
13 17
14static void handle_keyboard_modifiers(struct wl_listener *listener, 18static void handle_keyboard_modifiers(struct wl_listener *listener,
15 void *data) { 19 void *data) {
16 struct sway_keyboard *keyboard = 20 struct sway_keyboard *keyboard =
17 wl_container_of(listener, keyboard, keyboard_modifiers); 21 wl_container_of(listener, keyboard, keyboard_modifiers);
18 wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); 22 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
19 wlr_seat_keyboard_notify_modifiers(keyboard->seat->seat); 23 struct wlr_input_device *wlr_device =
24 keyboard->seat_device->input_device->wlr_device;
25 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
26 wlr_seat_set_keyboard(wlr_seat, wlr_device);
27 wlr_seat_keyboard_notify_modifiers(wlr_seat);
20} 28}
21 29
22struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, 30struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
23 struct sway_input_device *device) { 31 struct sway_seat_device *device) {
24 struct sway_keyboard *keyboard = 32 struct sway_keyboard *keyboard =
25 calloc(1, sizeof(struct sway_keyboard)); 33 calloc(1, sizeof(struct sway_keyboard));
26 if (!sway_assert(keyboard, "could not allocate sway keyboard")) { 34 if (!sway_assert(keyboard, "could not allocate sway keyboard")) {
27 return NULL; 35 return NULL;
28 } 36 }
29 37
30 keyboard->device = device; 38 keyboard->seat_device = device;
31 keyboard->seat = seat; 39 device->keyboard = keyboard;
32 40
33 // TODO keyboard config 41 wl_list_init(&keyboard->keyboard_key.link);
42 wl_list_init(&keyboard->keyboard_modifiers.link);
43
44 return keyboard;
45}
46
47void sway_keyboard_configure(struct sway_keyboard *keyboard) {
34 struct xkb_rule_names rules; 48 struct xkb_rule_names rules;
35 memset(&rules, 0, sizeof(rules)); 49 memset(&rules, 0, sizeof(rules));
36 rules.rules = getenv("XKB_DEFAULT_RULES"); 50 rules.rules = getenv("XKB_DEFAULT_RULES");
@@ -38,27 +52,32 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
38 rules.layout = getenv("XKB_DEFAULT_LAYOUT"); 52 rules.layout = getenv("XKB_DEFAULT_LAYOUT");
39 rules.variant = getenv("XKB_DEFAULT_VARIANT"); 53 rules.variant = getenv("XKB_DEFAULT_VARIANT");
40 rules.options = getenv("XKB_DEFAULT_OPTIONS"); 54 rules.options = getenv("XKB_DEFAULT_OPTIONS");
55
41 struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); 56 struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
42 if (!sway_assert(context, "cannot create XKB context")) { 57 if (!sway_assert(context, "cannot create XKB context")) {
43 return NULL; 58 return;
44 } 59 }
45 60
46 wlr_keyboard_set_keymap(device->wlr_device->keyboard, 61 keyboard->keymap =
47 xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); 62 xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS);
63 wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap);
48 xkb_context_unref(context); 64 xkb_context_unref(context);
49 65
50 wl_signal_add(&device->wlr_device->keyboard->events.key, 66 wl_list_remove(&keyboard->keyboard_key.link);
67 wl_signal_add(
68 &keyboard->seat_device->input_device->wlr_device->keyboard->events.key,
51 &keyboard->keyboard_key); 69 &keyboard->keyboard_key);
52 keyboard->keyboard_key.notify = handle_keyboard_key; 70 keyboard->keyboard_key.notify = handle_keyboard_key;
53 71
54 wl_signal_add(&device->wlr_device->keyboard->events.modifiers, 72 wl_list_remove(&keyboard->keyboard_modifiers.link);
73 wl_signal_add(
74 &keyboard->seat_device->input_device->wlr_device->keyboard->events.modifiers,
55 &keyboard->keyboard_modifiers); 75 &keyboard->keyboard_modifiers);
56 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; 76 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers;
57
58 return keyboard;
59} 77}
60 78
61void sway_keyboard_destroy(struct sway_keyboard *keyboard) { 79void sway_keyboard_destroy(struct sway_keyboard *keyboard) {
80 xkb_keymap_unref(keyboard->keymap);
62 wl_list_remove(&keyboard->keyboard_key.link); 81 wl_list_remove(&keyboard->keyboard_key.link);
63 wl_list_remove(&keyboard->keyboard_modifiers.link); 82 wl_list_remove(&keyboard->keyboard_modifiers.link);
64 wl_list_remove(&keyboard->link); 83 wl_list_remove(&keyboard->link);