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