1 #if !defined(HIKARI_KEYBOARD_H)
2 #define HIKARI_KEYBOARD_H
3
4 #include <wayland-server-core.h>
5 #include <wayland-util.h>
6 #include <xkbcommon/xkbcommon.h>
7
8 #include <wlr/types/wlr_input_device.h>
9
10 #include <hikari/binding_group.h>
11 #include <hikari/keyboard_config.h>
12
13 struct hikari_keyboard {
14 struct wl_list server_keyboards;
15 struct wlr_input_device *device;
16
17 struct wl_listener modifiers;
18 struct wl_listener key;
19 struct wl_listener destroy;
20
21 struct xkb_keymap *keymap;
22
23 struct hikari_binding_group bindings[HIKARI_BINDING_GROUP_MASK];
24 };
25
26 void
27 hikari_keyboard_init(
28 struct hikari_keyboard *keyboard, struct wlr_input_device *device);
29
30 void
31 hikari_keyboard_fini(struct hikari_keyboard *keyboard);
32
33 void
34 hikari_keyboard_configure(struct hikari_keyboard *keyboard,
35 struct hikari_keyboard_config *keyboard_config);
36
37 void
38 hikari_keyboard_configure_bindings(
39 struct hikari_keyboard *keyboard, struct wl_list *bindings);
40
41 typedef void (*hikari_keysym_iterator)(
42 struct hikari_keyboard *keyboard, uint32_t keycode, xkb_keysym_t sym);
43
44 void
45 hikari_keyboard_for_keysym(struct hikari_keyboard *keyboard,
46 uint32_t keycode,
47 hikari_keysym_iterator iter);
48
49 static inline uint32_t
hikari_keyboard_get_codepoint(struct hikari_keyboard * keyboard,uint32_t keycode)50 hikari_keyboard_get_codepoint(
51 struct hikari_keyboard *keyboard, uint32_t keycode)
52 {
53 return xkb_state_key_get_utf32(
54 keyboard->device->keyboard->xkb_state, keycode);
55 }
56
57 static inline bool
hikari_keyboard_check_modifier(struct hikari_keyboard * keyboard,uint32_t modifier)58 hikari_keyboard_check_modifier(
59 struct hikari_keyboard *keyboard, uint32_t modifier)
60 {
61 uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->device->keyboard);
62
63 return modifiers == modifier;
64 }
65
66 #endif
67