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