diff options
author | Tony Crisci <tony@dubstepdish.com> | 2017-12-14 11:11:56 -0500 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2017-12-14 11:11:56 -0500 |
commit | 92fef27eaa0b52c9d37bdabff14ae21cd6660f46 (patch) | |
tree | 7a923bbbc233079006597d82721117bae88b6ac6 /sway/input/keyboard.c | |
parent | seat configuration (diff) | |
download | sway-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.c | 51 |
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 @@ | |||
5 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { | 5 | static 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 | ||
14 | static void handle_keyboard_modifiers(struct wl_listener *listener, | 18 | static 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 | ||
22 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, | 30 | struct 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 | |||
47 | void 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 | ||
61 | void sway_keyboard_destroy(struct sway_keyboard *keyboard) { | 79 | void 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); |