Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-input-adapter"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gio/gio.h>
9 : : #include <libvalent-core.h>
10 : :
11 : : #include "valent-input-adapter.h"
12 : :
13 : :
14 : : /**
15 : : * ValentInputAdapter:
16 : : *
17 : : * An abstract base class for virtual input devices.
18 : : *
19 : : * `ValentInputAdapter` is a base class for plugins that provide an interface to
20 : : * the pointer and keyboard. This usually means simulating pointer and keyboard
21 : : * events on the host system.
22 : : *
23 : : * ## `.plugin` File
24 : : *
25 : : * Implementations may define the following extra fields in the `.plugin` file:
26 : : *
27 : : * - `X-InputAdapterPriority`
28 : : *
29 : : * An integer indicating the adapter priority. The implementation with the
30 : : * lowest value will be used as the primary adapter.
31 : : *
32 : : * Since: 1.0
33 : : */
34 : :
35 [ + + + - ]: 412 : G_DEFINE_ABSTRACT_TYPE (ValentInputAdapter, valent_input_adapter, VALENT_TYPE_EXTENSION)
36 : :
37 : : /* LCOV_EXCL_START */
38 : : static void
39 : : valent_input_adapter_real_keyboard_keysym (ValentInputAdapter *adapter,
40 : : uint32_t keysym,
41 : : gboolean state)
42 : : {
43 : : }
44 : :
45 : : static void
46 : : valent_input_adapter_real_pointer_axis (ValentInputAdapter *adapter,
47 : : double dx,
48 : : double dy)
49 : : {
50 : : }
51 : :
52 : : static void
53 : : valent_input_adapter_real_pointer_button (ValentInputAdapter *adapter,
54 : : unsigned int button,
55 : : gboolean state)
56 : : {
57 : : }
58 : :
59 : : static void
60 : : valent_input_adapter_real_pointer_motion (ValentInputAdapter *adapter,
61 : : double dx,
62 : : double dy)
63 : : {
64 : : }
65 : : /* LCOV_EXCL_STOP */
66 : :
67 : : /*
68 : : * GObject
69 : : */
70 : : static void
71 : 53 : valent_input_adapter_class_init (ValentInputAdapterClass *klass)
72 : : {
73 : 53 : klass->keyboard_keysym = valent_input_adapter_real_keyboard_keysym;
74 : 53 : klass->pointer_axis = valent_input_adapter_real_pointer_axis;
75 : 53 : klass->pointer_button = valent_input_adapter_real_pointer_button;
76 : 53 : klass->pointer_motion = valent_input_adapter_real_pointer_motion;
77 : : }
78 : :
79 : : static void
80 : 10 : valent_input_adapter_init (ValentInputAdapter *adapter)
81 : : {
82 : 10 : }
83 : :
84 : : /**
85 : : * valent_input_adapter_keyboard_keysym:
86 : : * @adapter: a `ValentInputAdapter`
87 : : * @keysym: a keysym
88 : : * @state: %TRUE to press, or %FALSE to release
89 : : *
90 : : * Press or release @keysym.
91 : : *
92 : : * Since: 1.0
93 : : */
94 : : void
95 : 24 : valent_input_adapter_keyboard_keysym (ValentInputAdapter *adapter,
96 : : uint32_t keysym,
97 : : gboolean state)
98 : : {
99 : 24 : VALENT_ENTRY;
100 : :
101 [ - + ]: 24 : g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
102 : :
103 : : /* Silently ignore empty symbols */
104 [ + - ]: 24 : if G_UNLIKELY (keysym == 0)
105 : 24 : VALENT_EXIT;
106 : :
107 : 24 : VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->keyboard_keysym (adapter,
108 : : keysym,
109 : : state);
110 : :
111 : 24 : VALENT_EXIT;
112 : : }
113 : :
114 : : /**
115 : : * valent_input_adapter_pointer_axis:
116 : : * @adapter: a `ValentInputAdapter`
117 : : * @dx: movement on x-axis
118 : : * @dy: movement on y-axis
119 : : *
120 : : * Scroll the surface under the pointer (@dx, @dy), relative to its current
121 : : * position.
122 : : *
123 : : * Implementations should handle any necessary scaling.
124 : : *
125 : : * Since: 1.0
126 : : */
127 : : void
128 : 2 : valent_input_adapter_pointer_axis (ValentInputAdapter *adapter,
129 : : double dx,
130 : : double dy)
131 : : {
132 : 2 : VALENT_ENTRY;
133 : :
134 [ - + ]: 2 : g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
135 : :
136 : : /* Silently ignore 0-delta motion */
137 [ - + + - : 2 : if G_UNLIKELY (G_APPROX_VALUE (dx, 0.0, 0.01) && G_APPROX_VALUE (dy, 0.0, 0.01))
+ - + - ]
138 : 2 : VALENT_EXIT;
139 : :
140 : 2 : VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_axis (adapter, dx, dy);
141 : :
142 : 2 : VALENT_EXIT;
143 : : }
144 : :
145 : : /**
146 : : * valent_input_adapter_pointer_button:
147 : : * @adapter: a `ValentInputAdapter`
148 : : * @button: a button number
149 : : * @state: %TRUE to press, or %FALSE to release
150 : : *
151 : : * Press or release @button.
152 : : *
153 : : * Since: 1.0
154 : : */
155 : : void
156 : 14 : valent_input_adapter_pointer_button (ValentInputAdapter *adapter,
157 : : unsigned int button,
158 : : gboolean state)
159 : : {
160 : 14 : VALENT_ENTRY;
161 : :
162 [ - + ]: 14 : g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
163 : :
164 : 14 : VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_button (adapter,
165 : : button,
166 : : state);
167 : :
168 : 14 : VALENT_EXIT;
169 : : }
170 : :
171 : : /**
172 : : * valent_input_adapter_pointer_motion:
173 : : * @adapter: a `ValentInputAdapter`
174 : : * @dx: movement on x-axis
175 : : * @dy: movement on y-axis
176 : : *
177 : : * Move the pointer (@dx, @dy), relative to its current position.
178 : : *
179 : : * Implementation should handle any necessary scaling
180 : : *
181 : : * Since: 1.0
182 : : */
183 : : void
184 : 4 : valent_input_adapter_pointer_motion (ValentInputAdapter *adapter,
185 : : double dx,
186 : : double dy)
187 : : {
188 : 4 : VALENT_ENTRY;
189 : :
190 [ - + ]: 4 : g_return_if_fail (VALENT_IS_INPUT_ADAPTER (adapter));
191 : :
192 : : /* Silently ignore 0-delta motion */
193 [ + + - + : 4 : if G_UNLIKELY (G_APPROX_VALUE (dx, 0.0, 0.01) && G_APPROX_VALUE (dy, 0.0, 0.01))
- - - - ]
194 : 4 : VALENT_EXIT;
195 : :
196 : 4 : VALENT_INPUT_ADAPTER_GET_CLASS (adapter)->pointer_motion (adapter, dx, dy);
197 : :
198 : 4 : VALENT_EXIT;
199 : : }
200 : :
|