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"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <glib-object.h>
9 : : #include <libpeas.h>
10 : : #include <libvalent-core.h>
11 : :
12 : : #include "valent-input.h"
13 : : #include "valent-input-adapter.h"
14 : :
15 : :
16 : : /**
17 : : * ValentInput:
18 : : *
19 : : * A class for controlling pointer and keyboard devices.
20 : : *
21 : : * `ValentInput` is an abstraction of virtual input devices, intended for use by
22 : : * [class@Valent.DevicePlugin] implementations.
23 : : *
24 : : * Plugins can implement [class@Valent.InputAdapter] to provide an interface to
25 : : * control the pointer and keyboard.
26 : : *
27 : : * Since: 1.0
28 : : */
29 : : struct _ValentInput
30 : : {
31 : : ValentComponent parent_instance;
32 : :
33 : : ValentInputAdapter *default_adapter;
34 : : };
35 : :
36 [ + + + - ]: 194 : G_DEFINE_FINAL_TYPE (ValentInput, valent_input, VALENT_TYPE_COMPONENT)
37 : :
38 : : /*
39 : : * ValentComponent
40 : : */
41 : : static void
42 : 6 : valent_input_bind_preferred (ValentComponent *component,
43 : : GObject *extension)
44 : : {
45 : 6 : ValentInput *self = VALENT_INPUT (component);
46 : 6 : ValentInputAdapter *adapter = VALENT_INPUT_ADAPTER (extension);
47 : :
48 : 6 : VALENT_ENTRY;
49 : :
50 [ + - ]: 6 : g_assert (VALENT_IS_INPUT (self));
51 [ + + - + ]: 6 : g_assert (adapter == NULL || VALENT_IS_INPUT_ADAPTER (adapter));
52 : :
53 : 6 : self->default_adapter = adapter;
54 : :
55 : 6 : VALENT_EXIT;
56 : : }
57 : :
58 : : /*
59 : : * GObject
60 : : */
61 : : static void
62 : 4 : valent_input_class_init (ValentInputClass *klass)
63 : : {
64 : 4 : ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
65 : :
66 : 4 : component_class->bind_preferred = valent_input_bind_preferred;
67 : : }
68 : :
69 : : static void
70 : 4 : valent_input_init (ValentInput *self)
71 : : {
72 : 4 : }
73 : :
74 : : /**
75 : : * valent_input_get_default:
76 : : *
77 : : * Get the default [class@Valent.Input].
78 : : *
79 : : * Returns: (transfer none) (not nullable): a `ValentInput`
80 : : *
81 : : * Since: 1.0
82 : : */
83 : : ValentInput *
84 : 11 : valent_input_get_default (void)
85 : : {
86 : 11 : static ValentInput *default_instance = NULL;
87 : :
88 [ + + ]: 11 : if (default_instance == NULL)
89 : : {
90 : 4 : default_instance = g_object_new (VALENT_TYPE_INPUT,
91 : : "plugin-domain", "input",
92 : : "plugin-type", VALENT_TYPE_INPUT_ADAPTER,
93 : : NULL);
94 : 4 : g_object_add_weak_pointer (G_OBJECT (default_instance),
95 : : (gpointer)&default_instance);
96 : : }
97 : :
98 : 11 : return default_instance;
99 : : }
100 : :
101 : : /**
102 : : * valent_input_keyboard_keysym:
103 : : * @input: a `ValentInput`
104 : : * @keysym: a keysym
105 : : * @state: %TRUE to press, or %FALSE to release
106 : : *
107 : : * Press or release @keysym.
108 : : *
109 : : * Since: 1.0
110 : : */
111 : : void
112 : 24 : valent_input_keyboard_keysym (ValentInput *input,
113 : : uint32_t keysym,
114 : : gboolean state)
115 : : {
116 : 24 : VALENT_ENTRY;
117 : :
118 [ + - ]: 24 : g_return_if_fail (VALENT_IS_INPUT (input));
119 : :
120 [ + - ]: 24 : if G_LIKELY (input->default_adapter != NULL)
121 : 24 : valent_input_adapter_keyboard_keysym (input->default_adapter, keysym, state);
122 : :
123 : 24 : VALENT_EXIT;
124 : : }
125 : :
126 : : /**
127 : : * valent_input_pointer_axis:
128 : : * @input: a `ValentInput`
129 : : * @dx: movement on x-axis
130 : : * @dy: movement on y-axis
131 : : *
132 : : * Scroll the surface under the pointer (@dx, @dy), relative to its current
133 : : * position.
134 : : *
135 : : * Since: 1.0
136 : : */
137 : : void
138 : 2 : valent_input_pointer_axis (ValentInput *input,
139 : : double dx,
140 : : double dy)
141 : : {
142 : 2 : VALENT_ENTRY;
143 : :
144 [ + - ]: 2 : g_return_if_fail (VALENT_IS_INPUT (input));
145 : :
146 [ + - ]: 2 : if G_LIKELY (input->default_adapter != NULL)
147 : 2 : valent_input_adapter_pointer_axis (input->default_adapter, dx, dy);
148 : :
149 : 2 : VALENT_EXIT;
150 : : }
151 : :
152 : : /**
153 : : * valent_input_pointer_button:
154 : : * @input: a `ValentInput`
155 : : * @button: a button
156 : : * @state: %TRUE to press, or %FALSE to release
157 : : *
158 : : * Press or release @button.
159 : : *
160 : : * Since: 1.0
161 : : */
162 : : void
163 : 14 : valent_input_pointer_button (ValentInput *input,
164 : : unsigned int button,
165 : : gboolean state)
166 : : {
167 : 14 : VALENT_ENTRY;
168 : :
169 [ + - ]: 14 : g_return_if_fail (VALENT_IS_INPUT (input));
170 : :
171 [ + - ]: 14 : if G_LIKELY (input->default_adapter != NULL)
172 : 14 : valent_input_adapter_pointer_button (input->default_adapter, button, state);
173 : :
174 : 14 : VALENT_EXIT;
175 : : }
176 : :
177 : : /**
178 : : * valent_input_pointer_motion:
179 : : * @input: a `ValentInput`
180 : : * @dx: position on x-axis
181 : : * @dy: position on y-axis
182 : : *
183 : : * Move the pointer (@dx, @dy), relative to its current position.
184 : : *
185 : : * Since: 1.0
186 : : */
187 : : void
188 : 4 : valent_input_pointer_motion (ValentInput *input,
189 : : double dx,
190 : : double dy)
191 : : {
192 : 4 : VALENT_ENTRY;
193 : :
194 [ + - ]: 4 : g_return_if_fail (VALENT_IS_INPUT (input));
195 : :
196 [ + - ]: 4 : if G_LIKELY (input->default_adapter != NULL)
197 : 4 : valent_input_adapter_pointer_motion (input->default_adapter, dx, dy);
198 : :
199 : 4 : VALENT_EXIT;
200 : : }
201 : :
|