1 #include <hikari/pointer.h>
2
3 #include <wlr/backend/libinput.h>
4
5 #include <hikari/memory.h>
6 #include <hikari/pointer_config.h>
7 #include <hikari/server.h>
8
9 static void
destroy_handler(struct wl_listener * listener,void * data)10 destroy_handler(struct wl_listener *listener, void *data)
11 {
12 struct hikari_pointer *pointer = wl_container_of(listener, pointer, destroy);
13
14 hikari_pointer_fini(pointer);
15 hikari_free(pointer);
16 }
17
18 void
hikari_pointer_init(struct hikari_pointer * pointer,struct wlr_input_device * device)19 hikari_pointer_init(
20 struct hikari_pointer *pointer, struct wlr_input_device *device)
21 {
22 pointer->device = device;
23
24 wl_list_insert(&hikari_server.pointers, &pointer->server_pointers);
25
26 pointer->destroy.notify = destroy_handler;
27 wl_signal_add(&device->events.destroy, &pointer->destroy);
28 }
29
30 void
hikari_pointer_fini(struct hikari_pointer * pointer)31 hikari_pointer_fini(struct hikari_pointer *pointer)
32 {
33 wl_list_remove(&pointer->destroy.link);
34 wl_list_remove(&pointer->server_pointers);
35 }
36
37 void
hikari_pointer_configure(struct hikari_pointer * pointer,struct hikari_pointer_config * pointer_config)38 hikari_pointer_configure(struct hikari_pointer *pointer,
39 struct hikari_pointer_config *pointer_config)
40 {
41 struct libinput_device *libinput_device =
42 wlr_libinput_get_device_handle(pointer->device);
43
44 if (libinput_device != NULL) {
45 if (hikari_pointer_config_has_accel(pointer_config)) {
46 libinput_device_config_accel_set_speed(
47 libinput_device, hikari_pointer_config_get_accel(pointer_config));
48 }
49
50 if (hikari_pointer_config_has_scroll_button(pointer_config)) {
51 libinput_device_config_scroll_set_button(libinput_device,
52 hikari_pointer_config_get_scroll_button(pointer_config));
53 }
54
55 if (hikari_pointer_config_has_disable_while_typing(pointer_config)) {
56 if (libinput_device_config_dwt_is_available(libinput_device)) {
57 libinput_device_config_dwt_set_enabled(libinput_device,
58 hikari_pointer_config_get_disable_while_typing(pointer_config));
59 }
60 }
61
62 if (hikari_pointer_config_has_natural_scrolling(pointer_config)) {
63 if (libinput_device_config_scroll_has_natural_scroll(libinput_device)) {
64 libinput_device_config_scroll_set_natural_scroll_enabled(
65 libinput_device,
66 hikari_pointer_config_get_natural_scrolling(pointer_config));
67 }
68 }
69
70 if (hikari_pointer_config_has_middle_emulation(pointer_config)) {
71 if (libinput_device_config_middle_emulation_is_available(
72 libinput_device)) {
73 libinput_device_config_middle_emulation_set_enabled(libinput_device,
74 hikari_pointer_config_get_middle_emulation(pointer_config));
75 }
76 }
77
78 if (hikari_pointer_config_has_scroll_method(pointer_config)) {
79 libinput_device_config_scroll_set_method(libinput_device,
80 hikari_pointer_config_get_scroll_method(pointer_config));
81 }
82
83 if (hikari_pointer_config_has_tap(pointer_config)) {
84 if (libinput_device_config_tap_get_finger_count(libinput_device) > 0) {
85 libinput_device_config_tap_set_enabled(
86 libinput_device, hikari_pointer_config_get_tap(pointer_config));
87 }
88 }
89
90 if (hikari_pointer_config_has_tap_drag(pointer_config)) {
91 if (libinput_device_config_tap_get_finger_count(libinput_device) > 0) {
92 libinput_device_config_tap_set_drag_enabled(libinput_device,
93 hikari_pointer_config_get_tap_drag(pointer_config));
94 }
95 }
96
97 if (hikari_pointer_config_has_tap_drag_lock(pointer_config)) {
98 if (libinput_device_config_tap_get_finger_count(libinput_device) > 0) {
99 libinput_device_config_tap_set_drag_lock_enabled(libinput_device,
100 hikari_pointer_config_get_tap_drag_lock(pointer_config));
101 }
102 }
103 }
104 }
105