diff options
author | Tony Crisci <tony@dubstepdish.com> | 2017-12-10 13:59:04 -0500 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2017-12-10 15:01:09 -0500 |
commit | 609f63934ab3eb925741450aa7f78db1c11bdd37 (patch) | |
tree | dec4a8477166fda0557589fdeec5a30a2ccc025a /sway | |
parent | remove pointer device (diff) | |
download | sway-609f63934ab3eb925741450aa7f78db1c11bdd37.tar.gz sway-609f63934ab3eb925741450aa7f78db1c11bdd37.tar.zst sway-609f63934ab3eb925741450aa7f78db1c11bdd37.zip |
basic keyboard
Diffstat (limited to 'sway')
-rw-r--r-- | sway/input/keyboard.c | 57 | ||||
-rw-r--r-- | sway/input/seat.c | 14 | ||||
-rw-r--r-- | sway/meson.build | 2 |
3 files changed, 72 insertions, 1 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c new file mode 100644 index 00000000..59f81e62 --- /dev/null +++ b/sway/input/keyboard.c | |||
@@ -0,0 +1,57 @@ | |||
1 | #include "sway/input/seat.h" | ||
2 | #include "sway/input/keyboard.h" | ||
3 | #include "log.h" | ||
4 | |||
5 | static void handle_keyboard_key(struct wl_listener *listener, void *data) { | ||
6 | struct sway_keyboard *keyboard = | ||
7 | wl_container_of(listener, keyboard, keyboard_key); | ||
8 | struct wlr_event_keyboard_key *event = data; | ||
9 | wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); | ||
10 | wlr_seat_keyboard_notify_key(keyboard->seat->seat, event->time_msec, | ||
11 | event->keycode, event->state); | ||
12 | } | ||
13 | |||
14 | static void handle_keyboard_modifiers(struct wl_listener *listener, | ||
15 | void *data) { | ||
16 | struct sway_keyboard *keyboard = | ||
17 | wl_container_of(listener, keyboard, keyboard_modifiers); | ||
18 | wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); | ||
19 | wlr_seat_keyboard_notify_modifiers(keyboard->seat->seat); | ||
20 | } | ||
21 | |||
22 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, | ||
23 | struct wlr_input_device *device) { | ||
24 | struct sway_keyboard *keyboard = | ||
25 | calloc(1, sizeof(struct sway_keyboard)); | ||
26 | if (!sway_assert(keyboard, "could not allocate sway keyboard")) { | ||
27 | return NULL; | ||
28 | } | ||
29 | |||
30 | keyboard->device = device; | ||
31 | keyboard->seat = seat; | ||
32 | |||
33 | // TODO keyboard config | ||
34 | struct xkb_rule_names rules; | ||
35 | memset(&rules, 0, sizeof(rules)); | ||
36 | rules.rules = getenv("XKB_DEFAULT_RULES"); | ||
37 | rules.model = getenv("XKB_DEFAULT_MODEL"); | ||
38 | rules.layout = getenv("XKB_DEFAULT_LAYOUT"); | ||
39 | rules.variant = getenv("XKB_DEFAULT_VARIANT"); | ||
40 | rules.options = getenv("XKB_DEFAULT_OPTIONS"); | ||
41 | struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); | ||
42 | if (!sway_assert(context, "cannot create XKB context")) { | ||
43 | return NULL; | ||
44 | } | ||
45 | |||
46 | wlr_keyboard_set_keymap(device->keyboard, xkb_map_new_from_names(context, | ||
47 | &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); | ||
48 | xkb_context_unref(context); | ||
49 | |||
50 | wl_signal_add(&device->keyboard->events.key, &keyboard->keyboard_key); | ||
51 | keyboard->keyboard_key.notify = handle_keyboard_key; | ||
52 | |||
53 | wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); | ||
54 | keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; | ||
55 | |||
56 | return keyboard; | ||
57 | } | ||
diff --git a/sway/input/seat.c b/sway/input/seat.c index b3d36681..0a5329c8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include "sway/input/seat.h" | 4 | #include "sway/input/seat.h" |
5 | #include "sway/input/cursor.h" | 5 | #include "sway/input/cursor.h" |
6 | #include "sway/input/input-manager.h" | 6 | #include "sway/input/input-manager.h" |
7 | #include "sway/input/keyboard.h" | ||
7 | #include "sway/output.h" | 8 | #include "sway/output.h" |
8 | #include "sway/view.h" | 9 | #include "sway/view.h" |
9 | #include "log.h" | 10 | #include "log.h" |
@@ -36,6 +37,8 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, | |||
36 | 37 | ||
37 | sway_seat_configure_xcursor(seat); | 38 | sway_seat_configure_xcursor(seat); |
38 | 39 | ||
40 | wl_list_init(&seat->keyboards); | ||
41 | |||
39 | return seat; | 42 | return seat; |
40 | } | 43 | } |
41 | 44 | ||
@@ -45,6 +48,13 @@ static void seat_add_pointer(struct sway_seat *seat, | |||
45 | wlr_cursor_attach_input_device(seat->cursor->cursor, device); | 48 | wlr_cursor_attach_input_device(seat->cursor->cursor, device); |
46 | } | 49 | } |
47 | 50 | ||
51 | static void seat_add_keyboard(struct sway_seat *seat, | ||
52 | struct wlr_input_device *device) { | ||
53 | struct sway_keyboard *keyboard = sway_keyboard_create(seat, device); | ||
54 | wl_list_insert(&seat->keyboards, &keyboard->link); | ||
55 | wlr_seat_set_keyboard(seat->seat, device); | ||
56 | } | ||
57 | |||
48 | void sway_seat_add_device(struct sway_seat *seat, | 58 | void sway_seat_add_device(struct sway_seat *seat, |
49 | struct wlr_input_device *device) { | 59 | struct wlr_input_device *device) { |
50 | sway_log(L_DEBUG, "input add: %s", device->name); | 60 | sway_log(L_DEBUG, "input add: %s", device->name); |
@@ -53,6 +63,8 @@ void sway_seat_add_device(struct sway_seat *seat, | |||
53 | seat_add_pointer(seat, device); | 63 | seat_add_pointer(seat, device); |
54 | break; | 64 | break; |
55 | case WLR_INPUT_DEVICE_KEYBOARD: | 65 | case WLR_INPUT_DEVICE_KEYBOARD: |
66 | seat_add_keyboard(seat, device); | ||
67 | break; | ||
56 | case WLR_INPUT_DEVICE_TOUCH: | 68 | case WLR_INPUT_DEVICE_TOUCH: |
57 | case WLR_INPUT_DEVICE_TABLET_PAD: | 69 | case WLR_INPUT_DEVICE_TABLET_PAD: |
58 | case WLR_INPUT_DEVICE_TABLET_TOOL: | 70 | case WLR_INPUT_DEVICE_TABLET_TOOL: |
@@ -138,7 +150,7 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { | |||
138 | view->iface.set_activated(view, true); | 150 | view->iface.set_activated(view, true); |
139 | wl_signal_add(&container->events.destroy, &seat->focus_destroy); | 151 | wl_signal_add(&container->events.destroy, &seat->focus_destroy); |
140 | seat->focus_destroy.notify = handle_focus_destroy; | 152 | seat->focus_destroy.notify = handle_focus_destroy; |
141 | // TODO give keyboard focus | 153 | wlr_seat_keyboard_notify_enter(seat->seat, view->surface); |
142 | } | 154 | } |
143 | 155 | ||
144 | seat->focus = container; | 156 | seat->focus = container; |
diff --git a/sway/meson.build b/sway/meson.build index 18955693..79201f3a 100644 --- a/sway/meson.build +++ b/sway/meson.build | |||
@@ -5,6 +5,7 @@ sway_sources = files( | |||
5 | 'input/input-manager.c', | 5 | 'input/input-manager.c', |
6 | 'input/seat.c', | 6 | 'input/seat.c', |
7 | 'input/cursor.c', | 7 | 'input/cursor.c', |
8 | 'input/keyboard.c', | ||
8 | 'commands/exit.c', | 9 | 'commands/exit.c', |
9 | 'commands/exec.c', | 10 | 'commands/exec.c', |
10 | 'commands/exec_always.c', | 11 | 'commands/exec_always.c', |
@@ -30,6 +31,7 @@ sway_deps = [ | |||
30 | libcap, | 31 | libcap, |
31 | math, | 32 | math, |
32 | libinput, | 33 | libinput, |
34 | xkbcommon, | ||
33 | ] | 35 | ] |
34 | 36 | ||
35 | executable( | 37 | executable( |