File: | cdk/x11/cdkdevice-xi2.c |
Warning: | line 776, column 11 Assigned value is garbage or undefined |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* CDK - The GIMP Drawing Kit | |||
2 | * Copyright (C) 2009 Carlos Garnacho <carlosg@gnome.org> | |||
3 | * | |||
4 | * This library is free software; you can redistribute it and/or | |||
5 | * modify it under the terms of the GNU Lesser General Public | |||
6 | * License as published by the Free Software Foundation; either | |||
7 | * version 2 of the License, or (at your option) any later version. | |||
8 | * | |||
9 | * This library is distributed in the hope that it will be useful, | |||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
12 | * Lesser General Public License for more details. | |||
13 | * | |||
14 | * You should have received a copy of the GNU Lesser General Public | |||
15 | * License along with this library. If not, see <http://www.gnu.org/licenses/>. | |||
16 | */ | |||
17 | ||||
18 | #include "config.h" | |||
19 | ||||
20 | #include "cdkx11device-xi2.h" | |||
21 | #include "cdkdeviceprivate.h" | |||
22 | ||||
23 | #include "cdkintl.h" | |||
24 | #include "cdkasync.h" | |||
25 | #include "cdkprivate-x11.h" | |||
26 | ||||
27 | #include <stdlib.h> | |||
28 | #include <X11/Xlib.h> | |||
29 | #include <X11/Xutil.h> | |||
30 | #include <X11/extensions/XInput2.h> | |||
31 | ||||
32 | #include <math.h> | |||
33 | ||||
34 | /* for the use of round() */ | |||
35 | #include "fallback-c89.c" | |||
36 | ||||
37 | typedef struct _ScrollValuator ScrollValuator; | |||
38 | ||||
39 | struct _ScrollValuator | |||
40 | { | |||
41 | guint n_valuator : 4; | |||
42 | guint direction : 4; | |||
43 | guint last_value_valid : 1; | |||
44 | gdouble last_value; | |||
45 | gdouble increment; | |||
46 | }; | |||
47 | ||||
48 | struct _CdkX11DeviceXI2 | |||
49 | { | |||
50 | CdkDevice parent_instance; | |||
51 | ||||
52 | gint device_id; | |||
53 | GArray *scroll_valuators; | |||
54 | gdouble *last_axes; | |||
55 | }; | |||
56 | ||||
57 | struct _CdkX11DeviceXI2Class | |||
58 | { | |||
59 | CdkDeviceClass parent_class; | |||
60 | }; | |||
61 | ||||
62 | G_DEFINE_TYPE (CdkX11DeviceXI2, cdk_x11_device_xi2, CDK_TYPE_DEVICE)static void cdk_x11_device_xi2_init (CdkX11DeviceXI2 *self); static void cdk_x11_device_xi2_class_init (CdkX11DeviceXI2Class *klass ); static GType cdk_x11_device_xi2_get_type_once (void); static gpointer cdk_x11_device_xi2_parent_class = ((void*)0); static gint CdkX11DeviceXI2_private_offset; static void cdk_x11_device_xi2_class_intern_init (gpointer klass) { cdk_x11_device_xi2_parent_class = g_type_class_peek_parent (klass); if (CdkX11DeviceXI2_private_offset != 0) g_type_class_adjust_private_offset (klass, &CdkX11DeviceXI2_private_offset); cdk_x11_device_xi2_class_init ((CdkX11DeviceXI2Class*) klass); } __attribute__ ((__unused__ )) static inline gpointer cdk_x11_device_xi2_get_instance_private (CdkX11DeviceXI2 *self) { return (((gpointer) ((guint8*) (self ) + (glong) (CdkX11DeviceXI2_private_offset)))); } GType cdk_x11_device_xi2_get_type (void) { static GType static_g_define_type_id = 0; if ((__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer), "Expression evaluates to false"); (void) ( 0 ? (gpointer) * (&static_g_define_type_id) : ((void*)0)) ; (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id ) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (*(&static_g_define_type_id)) gapg_temp_newval; __typeof__ ((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id ); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5) ; gapg_temp_newval; })) && g_once_init_enter_pointer ( &static_g_define_type_id)); })) ) { GType g_define_type_id = cdk_x11_device_xi2_get_type_once (); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer) , "Expression evaluates to false"); 0 ? (void) (*(&static_g_define_type_id ) = (g_define_type_id)) : (void) 0; g_once_init_leave_pointer ((&static_g_define_type_id), (gpointer) (guintptr) (g_define_type_id )); })) ; } return static_g_define_type_id; } __attribute__ ( (__noinline__)) static GType cdk_x11_device_xi2_get_type_once (void) { GType g_define_type_id = g_type_register_static_simple ((cdk_device_get_type ()), g_intern_static_string ("CdkX11DeviceXI2" ), sizeof (CdkX11DeviceXI2Class), (GClassInitFunc)(void (*)(void )) cdk_x11_device_xi2_class_intern_init, sizeof (CdkX11DeviceXI2 ), (GInstanceInitFunc)(void (*)(void)) cdk_x11_device_xi2_init , (GTypeFlags) 0); { {{};} } return g_define_type_id; } | |||
63 | ||||
64 | ||||
65 | static void cdk_x11_device_xi2_finalize (GObject *object); | |||
66 | static void cdk_x11_device_xi2_get_property (GObject *object, | |||
67 | guint prop_id, | |||
68 | GValue *value, | |||
69 | GParamSpec *pspec); | |||
70 | static void cdk_x11_device_xi2_set_property (GObject *object, | |||
71 | guint prop_id, | |||
72 | const GValue *value, | |||
73 | GParamSpec *pspec); | |||
74 | ||||
75 | static void cdk_x11_device_xi2_get_state (CdkDevice *device, | |||
76 | CdkWindow *window, | |||
77 | gdouble *axes, | |||
78 | CdkModifierType *mask); | |||
79 | static void cdk_x11_device_xi2_set_window_cursor (CdkDevice *device, | |||
80 | CdkWindow *window, | |||
81 | CdkCursor *cursor); | |||
82 | static void cdk_x11_device_xi2_warp (CdkDevice *device, | |||
83 | CdkScreen *screen, | |||
84 | gdouble x, | |||
85 | gdouble y); | |||
86 | static void cdk_x11_device_xi2_query_state (CdkDevice *device, | |||
87 | CdkWindow *window, | |||
88 | CdkWindow **root_window, | |||
89 | CdkWindow **child_window, | |||
90 | gdouble *root_x, | |||
91 | gdouble *root_y, | |||
92 | gdouble *win_x, | |||
93 | gdouble *win_y, | |||
94 | CdkModifierType *mask); | |||
95 | ||||
96 | static CdkGrabStatus cdk_x11_device_xi2_grab (CdkDevice *device, | |||
97 | CdkWindow *window, | |||
98 | gboolean owner_events, | |||
99 | CdkEventMask event_mask, | |||
100 | CdkWindow *confine_to, | |||
101 | CdkCursor *cursor, | |||
102 | guint32 time_); | |||
103 | static void cdk_x11_device_xi2_ungrab (CdkDevice *device, | |||
104 | guint32 time_); | |||
105 | ||||
106 | static CdkWindow * cdk_x11_device_xi2_window_at_position (CdkDevice *device, | |||
107 | gdouble *win_x, | |||
108 | gdouble *win_y, | |||
109 | CdkModifierType *mask, | |||
110 | gboolean get_toplevel); | |||
111 | static void cdk_x11_device_xi2_select_window_events (CdkDevice *device, | |||
112 | CdkWindow *window, | |||
113 | CdkEventMask event_mask); | |||
114 | ||||
115 | ||||
116 | enum { | |||
117 | PROP_0, | |||
118 | PROP_DEVICE_ID | |||
119 | }; | |||
120 | ||||
121 | static void | |||
122 | cdk_x11_device_xi2_class_init (CdkX11DeviceXI2Class *klass) | |||
123 | { | |||
124 | GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((klass)), (((GType) ((20) << (2)))))))); | |||
125 | CdkDeviceClass *device_class = CDK_DEVICE_CLASS (klass)((((CdkDeviceClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((klass)), ((cdk_device_get_type ())))))); | |||
126 | ||||
127 | object_class->finalize = cdk_x11_device_xi2_finalize; | |||
128 | object_class->get_property = cdk_x11_device_xi2_get_property; | |||
129 | object_class->set_property = cdk_x11_device_xi2_set_property; | |||
130 | ||||
131 | device_class->get_state = cdk_x11_device_xi2_get_state; | |||
132 | device_class->set_window_cursor = cdk_x11_device_xi2_set_window_cursor; | |||
133 | device_class->warp = cdk_x11_device_xi2_warp; | |||
134 | device_class->query_state = cdk_x11_device_xi2_query_state; | |||
135 | device_class->grab = cdk_x11_device_xi2_grab; | |||
136 | device_class->ungrab = cdk_x11_device_xi2_ungrab; | |||
137 | device_class->window_at_position = cdk_x11_device_xi2_window_at_position; | |||
138 | device_class->select_window_events = cdk_x11_device_xi2_select_window_events; | |||
139 | ||||
140 | g_object_class_install_property (object_class, | |||
141 | PROP_DEVICE_ID, | |||
142 | g_param_spec_int ("device-id", | |||
143 | P_("Device ID")dgettext("ctk30" "-properties","Device ID"), | |||
144 | P_("Device identifier")dgettext("ctk30" "-properties","Device identifier"), | |||
145 | 0, G_MAXINT2147483647, 0, | |||
146 | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); | |||
147 | } | |||
148 | ||||
149 | static void | |||
150 | cdk_x11_device_xi2_init (CdkX11DeviceXI2 *device) | |||
151 | { | |||
152 | device->scroll_valuators = g_array_new (FALSE(0), FALSE(0), sizeof (ScrollValuator)); | |||
153 | } | |||
154 | ||||
155 | static void | |||
156 | cdk_x11_device_xi2_finalize (GObject *object) | |||
157 | { | |||
158 | CdkX11DeviceXI2 *device = CDK_X11_DEVICE_XI2 (object)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((cdk_x11_device_xi2_get_type ())))))); | |||
159 | ||||
160 | g_array_free (device->scroll_valuators, TRUE(!(0))); | |||
161 | g_free (device->last_axes); | |||
162 | ||||
163 | G_OBJECT_CLASS (cdk_x11_device_xi2_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((cdk_x11_device_xi2_parent_class)), (((GType) ((20) << (2))))))))->finalize (object); | |||
164 | } | |||
165 | ||||
166 | static void | |||
167 | cdk_x11_device_xi2_get_property (GObject *object, | |||
168 | guint prop_id, | |||
169 | GValue *value, | |||
170 | GParamSpec *pspec) | |||
171 | { | |||
172 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (object)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((cdk_x11_device_xi2_get_type ())))))); | |||
173 | ||||
174 | switch (prop_id) | |||
175 | { | |||
176 | case PROP_DEVICE_ID: | |||
177 | g_value_set_int (value, device_xi2->device_id); | |||
178 | break; | |||
179 | default: | |||
180 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "cdkdevice-xi2.c", 180, ("property"), _glib__property_id, _glib__pspec ->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) ( _glib__pspec))->g_class))->g_type)))), (g_type_name ((( (((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); | |||
181 | break; | |||
182 | } | |||
183 | } | |||
184 | ||||
185 | static void | |||
186 | cdk_x11_device_xi2_set_property (GObject *object, | |||
187 | guint prop_id, | |||
188 | const GValue *value, | |||
189 | GParamSpec *pspec) | |||
190 | { | |||
191 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (object)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((cdk_x11_device_xi2_get_type ())))))); | |||
192 | ||||
193 | switch (prop_id) | |||
194 | { | |||
195 | case PROP_DEVICE_ID: | |||
196 | device_xi2->device_id = g_value_get_int (value); | |||
197 | break; | |||
198 | default: | |||
199 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "cdkdevice-xi2.c", 199, ("property"), _glib__property_id, _glib__pspec ->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) ( _glib__pspec))->g_class))->g_type)))), (g_type_name ((( (((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); | |||
200 | break; | |||
201 | } | |||
202 | } | |||
203 | ||||
204 | static void | |||
205 | cdk_x11_device_xi2_get_state (CdkDevice *device, | |||
206 | CdkWindow *window, | |||
207 | gdouble *axes, | |||
208 | CdkModifierType *mask) | |||
209 | { | |||
210 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
211 | ||||
212 | if (axes) | |||
213 | { | |||
214 | CdkDisplay *display; | |||
215 | XIDeviceInfo *info; | |||
216 | gint i, j, ndevices; | |||
217 | ||||
218 | display = cdk_device_get_display (device); | |||
219 | ||||
220 | cdk_x11_display_error_trap_push (display); | |||
221 | info = XIQueryDevice (CDK_DISPLAY_XDISPLAY (display)(((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((display)), ((cdk_x11_display_get_type()))))))->xdisplay ), | |||
222 | device_xi2->device_id, &ndevices); | |||
223 | cdk_x11_display_error_trap_pop_ignored (display); | |||
224 | ||||
225 | for (i = 0, j = 0; info && i < info->num_classes; i++) | |||
226 | { | |||
227 | XIAnyClassInfo *class_info = info->classes[i]; | |||
228 | CdkAxisUse use; | |||
229 | gdouble value; | |||
230 | ||||
231 | if (class_info->type != XIValuatorClass2) | |||
232 | continue; | |||
233 | ||||
234 | value = ((XIValuatorClassInfo *) class_info)->value; | |||
235 | use = cdk_device_get_axis_use (device, j); | |||
236 | ||||
237 | switch (use) | |||
238 | { | |||
239 | case CDK_AXIS_X: | |||
240 | case CDK_AXIS_Y: | |||
241 | case CDK_AXIS_IGNORE: | |||
242 | if (cdk_device_get_mode (device) == CDK_MODE_WINDOW) | |||
243 | _cdk_device_translate_window_coord (device, window, j, value, &axes[j]); | |||
244 | else | |||
245 | { | |||
246 | gint root_x, root_y; | |||
247 | ||||
248 | /* FIXME: Maybe root coords chaching should happen here */ | |||
249 | cdk_window_get_origin (window, &root_x, &root_y); | |||
250 | _cdk_device_translate_screen_coord (device, window, | |||
251 | root_x, root_y, | |||
252 | j, value, | |||
253 | &axes[j]); | |||
254 | } | |||
255 | break; | |||
256 | default: | |||
257 | _cdk_device_translate_axis (device, j, value, &axes[j]); | |||
258 | break; | |||
259 | } | |||
260 | ||||
261 | j++; | |||
262 | } | |||
263 | ||||
264 | if (info) | |||
265 | XIFreeDeviceInfo (info); | |||
266 | } | |||
267 | ||||
268 | if (mask) | |||
269 | cdk_x11_device_xi2_query_state (device, window, | |||
270 | NULL((void*)0), NULL((void*)0), | |||
271 | NULL((void*)0), NULL((void*)0), | |||
272 | NULL((void*)0), NULL((void*)0), | |||
273 | mask); | |||
274 | } | |||
275 | ||||
276 | static void | |||
277 | cdk_x11_device_xi2_set_window_cursor (CdkDevice *device, | |||
278 | CdkWindow *window, | |||
279 | CdkCursor *cursor) | |||
280 | { | |||
281 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
282 | ||||
283 | /* Non-master devices don't have a cursor */ | |||
284 | if (cdk_device_get_device_type (device) != CDK_DEVICE_TYPE_MASTER) | |||
285 | return; | |||
286 | ||||
287 | if (cursor) | |||
288 | XIDefineCursor (CDK_WINDOW_XDISPLAY (window)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((cdk_window_get_screen (window)))), ((cdk_x11_screen_get_type ()))))))->xdisplay), | |||
289 | device_xi2->device_id, | |||
290 | CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid), | |||
291 | cdk_x11_cursor_get_xcursor (cursor)); | |||
292 | else | |||
293 | XIUndefineCursor (CDK_WINDOW_XDISPLAY (window)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((cdk_window_get_screen (window)))), ((cdk_x11_screen_get_type ()))))))->xdisplay), | |||
294 | device_xi2->device_id, | |||
295 | CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid)); | |||
296 | } | |||
297 | ||||
298 | static void | |||
299 | cdk_x11_device_xi2_warp (CdkDevice *device, | |||
300 | CdkScreen *screen, | |||
301 | gdouble x, | |||
302 | gdouble y) | |||
303 | { | |||
304 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
305 | Window dest; | |||
306 | ||||
307 | dest = CDK_WINDOW_XID (cdk_screen_get_root_window (screen))(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((cdk_screen_get_root_window (screen))), ( (cdk_window_get_type ()))))))->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid); | |||
308 | ||||
309 | XIWarpPointer (CDK_SCREEN_XDISPLAY (screen)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((screen)), ((cdk_x11_screen_get_type ()))))))->xdisplay ), | |||
310 | device_xi2->device_id, | |||
311 | None0L, dest, | |||
312 | 0, 0, 0, 0, | |||
313 | round (x * CDK_X11_SCREEN(screen)((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((screen)), ((cdk_x11_screen_get_type ()))))))->window_scale), | |||
314 | round (y * CDK_X11_SCREEN(screen)((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((screen)), ((cdk_x11_screen_get_type ()))))))->window_scale)); | |||
315 | } | |||
316 | ||||
317 | static void | |||
318 | cdk_x11_device_xi2_query_state (CdkDevice *device, | |||
319 | CdkWindow *window, | |||
320 | CdkWindow **root_window, | |||
321 | CdkWindow **child_window, | |||
322 | gdouble *root_x, | |||
323 | gdouble *root_y, | |||
324 | gdouble *win_x, | |||
325 | gdouble *win_y, | |||
326 | CdkModifierType *mask) | |||
327 | { | |||
328 | CdkWindowImplX11 *impl = CDK_WINDOW_IMPL_X11 (window->impl)((((CdkWindowImplX11*) (void *) g_type_check_instance_cast (( GTypeInstance*) ((window->impl)), ((cdk_window_impl_x11_get_type ())))))); | |||
329 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
330 | CdkDisplay *display; | |||
331 | CdkScreen *default_screen; | |||
332 | Window xroot_window, xchild_window; | |||
333 | gdouble xroot_x, xroot_y, xwin_x, xwin_y; | |||
334 | XIButtonState button_state; | |||
335 | XIModifierState mod_state; | |||
336 | XIGroupState group_state; | |||
337 | ||||
338 | display = cdk_window_get_display (window); | |||
339 | default_screen = cdk_display_get_default_screen (display); | |||
340 | ||||
341 | if (cdk_device_get_device_type (device) == CDK_DEVICE_TYPE_SLAVE) | |||
342 | { | |||
343 | CdkDevice *master = cdk_device_get_associated_device (device); | |||
344 | ||||
345 | if (master) | |||
346 | _cdk_device_query_state (master, window, root_window, child_window, | |||
347 | root_x, root_y, win_x, win_y, mask); | |||
348 | return; | |||
349 | } | |||
350 | ||||
351 | if (!CDK_X11_DISPLAY (display)((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((display)), ((cdk_x11_display_get_type()))))))->trusted_client || | |||
352 | !XIQueryPointer (CDK_WINDOW_XDISPLAY (window)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((cdk_window_get_screen (window)))), ((cdk_x11_screen_get_type ()))))))->xdisplay), | |||
353 | device_xi2->device_id, | |||
354 | CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid), | |||
355 | &xroot_window, | |||
356 | &xchild_window, | |||
357 | &xroot_x, &xroot_y, | |||
358 | &xwin_x, &xwin_y, | |||
359 | &button_state, | |||
360 | &mod_state, | |||
361 | &group_state)) | |||
362 | { | |||
363 | XSetWindowAttributes attributes; | |||
364 | Display *xdisplay; | |||
365 | Window xwindow, w; | |||
366 | ||||
367 | /* FIXME: untrusted clients not multidevice-safe */ | |||
368 | xdisplay = CDK_SCREEN_XDISPLAY (default_screen)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((default_screen)), ((cdk_x11_screen_get_type ()))))))-> xdisplay); | |||
369 | xwindow = CDK_SCREEN_XROOTWIN (default_screen)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((default_screen)), ((cdk_x11_screen_get_type ()))))))-> xroot_window); | |||
370 | ||||
371 | w = XCreateWindow (xdisplay, xwindow, 0, 0, 1, 1, 0, | |||
372 | CopyFromParent0L, InputOnly2, CopyFromParent0L, | |||
373 | 0, &attributes); | |||
374 | XIQueryPointer (xdisplay, device_xi2->device_id, | |||
375 | w, | |||
376 | &xroot_window, | |||
377 | &xchild_window, | |||
378 | &xroot_x, &xroot_y, | |||
379 | &xwin_x, &xwin_y, | |||
380 | &button_state, | |||
381 | &mod_state, | |||
382 | &group_state); | |||
383 | XDestroyWindow (xdisplay, w); | |||
384 | } | |||
385 | ||||
386 | if (root_window) | |||
387 | *root_window = cdk_x11_window_lookup_for_display (display, xroot_window); | |||
388 | ||||
389 | if (child_window) | |||
390 | *child_window = cdk_x11_window_lookup_for_display (display, xchild_window); | |||
391 | ||||
392 | if (root_x) | |||
393 | *root_x = xroot_x / impl->window_scale; | |||
394 | ||||
395 | if (root_y) | |||
396 | *root_y = xroot_y / impl->window_scale; | |||
397 | ||||
398 | if (win_x) | |||
399 | *win_x = xwin_x / impl->window_scale; | |||
400 | ||||
401 | if (win_y) | |||
402 | *win_y = xwin_y / impl->window_scale; | |||
403 | ||||
404 | if (mask) | |||
405 | *mask = _cdk_x11_device_xi2_translate_state (&mod_state, &button_state, &group_state); | |||
406 | ||||
407 | free (button_state.mask); | |||
408 | } | |||
409 | ||||
410 | static CdkGrabStatus | |||
411 | cdk_x11_device_xi2_grab (CdkDevice *device, | |||
412 | CdkWindow *window, | |||
413 | gboolean owner_events, | |||
414 | CdkEventMask event_mask, | |||
415 | CdkWindow *confine_to G_GNUC_UNUSED__attribute__ ((__unused__)), | |||
416 | CdkCursor *cursor, | |||
417 | guint32 time_) | |||
418 | { | |||
419 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
420 | CdkX11DeviceManagerXI2 *device_manager_xi2; | |||
421 | CdkDisplay *display; | |||
422 | XIEventMask mask; | |||
423 | Window xwindow; | |||
424 | Cursor xcursor; | |||
425 | gint status; | |||
426 | ||||
427 | display = cdk_device_get_display (device); | |||
428 | G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push
clang diagnostic ignored "-Wdeprecated-declarations" ; | |||
429 | device_manager_xi2 = CDK_X11_DEVICE_MANAGER_XI2 (cdk_display_get_device_manager (display))((((CdkX11DeviceManagerXI2*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((cdk_display_get_device_manager (display) )), ((cdk_x11_device_manager_xi2_get_type ())))))); | |||
430 | G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop ; | |||
431 | ||||
432 | /* FIXME: confine_to is actually unused */ | |||
433 | ||||
434 | xwindow = CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid); | |||
435 | ||||
436 | if (!cursor) | |||
437 | xcursor = None0L; | |||
438 | else | |||
439 | { | |||
440 | _cdk_x11_cursor_update_theme (cursor); | |||
441 | xcursor = cdk_x11_cursor_get_xcursor (cursor); | |||
442 | } | |||
443 | ||||
444 | mask.deviceid = device_xi2->device_id; | |||
445 | mask.mask = _cdk_x11_device_xi2_translate_event_mask (device_manager_xi2, | |||
446 | event_mask, | |||
447 | &mask.mask_len); | |||
448 | ||||
449 | #ifdef G_ENABLE_DEBUG1 | |||
450 | if (CDK_DEBUG_CHECK (NOGRABS)(_cdk_debug_flags & CDK_DEBUG_NOGRABS)) | |||
451 | status = GrabSuccess0; | |||
452 | else | |||
453 | #endif | |||
454 | status = XIGrabDevice (CDK_DISPLAY_XDISPLAY (display)(((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((display)), ((cdk_x11_display_get_type()))))))->xdisplay ), | |||
455 | device_xi2->device_id, | |||
456 | xwindow, | |||
457 | time_, | |||
458 | xcursor, | |||
459 | GrabModeAsync1, GrabModeAsync1, | |||
460 | owner_events, | |||
461 | &mask); | |||
462 | ||||
463 | g_free (mask.mask); | |||
464 | ||||
465 | _cdk_x11_display_update_grab_info (display, device, status); | |||
466 | ||||
467 | return _cdk_x11_convert_grab_status (status); | |||
468 | } | |||
469 | ||||
470 | static void | |||
471 | cdk_x11_device_xi2_ungrab (CdkDevice *device, | |||
472 | guint32 time_) | |||
473 | { | |||
474 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
475 | CdkDisplay *display; | |||
476 | gulong serial; | |||
477 | ||||
478 | display = cdk_device_get_display (device); | |||
479 | serial = NextRequest (CDK_DISPLAY_XDISPLAY (display))(((_XPrivDisplay)((((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((display)), ((cdk_x11_display_get_type()) )))))->xdisplay)))->request + 1); | |||
480 | ||||
481 | XIUngrabDevice (CDK_DISPLAY_XDISPLAY (display)(((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((display)), ((cdk_x11_display_get_type()))))))->xdisplay ), device_xi2->device_id, time_); | |||
482 | ||||
483 | _cdk_x11_display_update_grab_info_ungrab (display, device, time_, serial); | |||
484 | } | |||
485 | ||||
486 | static CdkWindow * | |||
487 | cdk_x11_device_xi2_window_at_position (CdkDevice *device, | |||
488 | gdouble *win_x, | |||
489 | gdouble *win_y, | |||
490 | CdkModifierType *mask, | |||
491 | gboolean get_toplevel) | |||
492 | { | |||
493 | CdkWindowImplX11 *impl; | |||
494 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
495 | CdkDisplay *display; | |||
496 | CdkScreen *screen; | |||
497 | Display *xdisplay; | |||
498 | CdkWindow *window; | |||
499 | Window xwindow, root, child, last = None0L; | |||
500 | gdouble xroot_x, xroot_y, xwin_x, xwin_y; | |||
501 | XIButtonState button_state = { 0 }; | |||
502 | XIModifierState mod_state; | |||
503 | XIGroupState group_state; | |||
504 | Boolint retval; | |||
505 | ||||
506 | display = cdk_device_get_display (device); | |||
507 | screen = cdk_display_get_default_screen (display); | |||
508 | ||||
509 | cdk_x11_display_error_trap_push (display); | |||
510 | ||||
511 | /* This function really only works if the mouse pointer is held still | |||
512 | * during its operation. If it moves from one leaf window to another | |||
513 | * than we'll end up with inaccurate values for win_x, win_y | |||
514 | * and the result. | |||
515 | */ | |||
516 | cdk_x11_display_grab (display); | |||
517 | ||||
518 | xdisplay = CDK_SCREEN_XDISPLAY (screen)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((screen)), ((cdk_x11_screen_get_type ()))))))->xdisplay ); | |||
519 | xwindow = CDK_SCREEN_XROOTWIN (screen)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((screen)), ((cdk_x11_screen_get_type ()))))))->xroot_window ); | |||
520 | ||||
521 | if (G_LIKELY (CDK_X11_DISPLAY (display)->trusted_client)(((((CdkX11Display*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((display)), ((cdk_x11_display_get_type()))))))->trusted_client )) | |||
| ||||
522 | { | |||
523 | XIQueryPointer (xdisplay, | |||
524 | device_xi2->device_id, | |||
525 | xwindow, | |||
526 | &root, &child, | |||
527 | &xroot_x, &xroot_y, | |||
528 | &xwin_x, &xwin_y, | |||
529 | &button_state, | |||
530 | &mod_state, | |||
531 | &group_state); | |||
532 | ||||
533 | if (root == xwindow) | |||
534 | xwindow = child; | |||
535 | else | |||
536 | xwindow = root; | |||
537 | } | |||
538 | else | |||
539 | { | |||
540 | gint width, height; | |||
541 | GList *toplevels, *list; | |||
542 | Window pointer_window; | |||
543 | ||||
544 | /* FIXME: untrusted clients case not multidevice-safe */ | |||
545 | pointer_window = None0L; | |||
546 | ||||
547 | screen = cdk_display_get_default_screen (display); | |||
548 | toplevels = cdk_screen_get_toplevel_windows (screen); | |||
549 | for (list = toplevels; list != NULL((void*)0); list = list->next) | |||
550 | { | |||
551 | window = CDK_WINDOW (list->data)((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((list->data)), ((cdk_window_get_type ())))))); | |||
552 | xwindow = CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid); | |||
553 | ||||
554 | /* Free previous button mask, if any */ | |||
555 | g_free (button_state.mask); | |||
556 | ||||
557 | retval = XIQueryPointer (xdisplay, | |||
558 | device_xi2->device_id, | |||
559 | xwindow, | |||
560 | &root, &child, | |||
561 | &xroot_x, &xroot_y, | |||
562 | &xwin_x, &xwin_y, | |||
563 | &button_state, | |||
564 | &mod_state, | |||
565 | &group_state); | |||
566 | if (!retval) | |||
567 | continue; | |||
568 | ||||
569 | if (child != None0L) | |||
570 | { | |||
571 | pointer_window = child; | |||
572 | break; | |||
573 | } | |||
574 | cdk_window_get_geometry (window, NULL((void*)0), NULL((void*)0), &width, &height); | |||
575 | if (xwin_x >= 0 && xwin_y >= 0 && xwin_x < width && xwin_y < height) | |||
576 | { | |||
577 | /* A childless toplevel, or below another window? */ | |||
578 | XSetWindowAttributes attributes; | |||
579 | Window w; | |||
580 | ||||
581 | free (button_state.mask); | |||
582 | ||||
583 | w = XCreateWindow (xdisplay, xwindow, (int)xwin_x, (int)xwin_y, 1, 1, 0, | |||
584 | CopyFromParent0L, InputOnly2, CopyFromParent0L, | |||
585 | 0, &attributes); | |||
586 | XMapWindow (xdisplay, w); | |||
587 | XIQueryPointer (xdisplay, | |||
588 | device_xi2->device_id, | |||
589 | xwindow, | |||
590 | &root, &child, | |||
591 | &xroot_x, &xroot_y, | |||
592 | &xwin_x, &xwin_y, | |||
593 | &button_state, | |||
594 | &mod_state, | |||
595 | &group_state); | |||
596 | XDestroyWindow (xdisplay, w); | |||
597 | if (child == w) | |||
598 | { | |||
599 | pointer_window = xwindow; | |||
600 | break; | |||
601 | } | |||
602 | } | |||
603 | ||||
604 | g_list_free (toplevels); | |||
605 | if (pointer_window != None0L) | |||
606 | break; | |||
607 | } | |||
608 | ||||
609 | xwindow = pointer_window; | |||
610 | } | |||
611 | ||||
612 | while (xwindow) | |||
613 | { | |||
614 | last = xwindow; | |||
615 | free (button_state.mask); | |||
616 | ||||
617 | retval = XIQueryPointer (xdisplay, | |||
618 | device_xi2->device_id, | |||
619 | xwindow, | |||
620 | &root, &xwindow, | |||
621 | &xroot_x, &xroot_y, | |||
622 | &xwin_x, &xwin_y, | |||
623 | &button_state, | |||
624 | &mod_state, | |||
625 | &group_state); | |||
626 | if (!retval) | |||
627 | break; | |||
628 | ||||
629 | if (get_toplevel && last != root && | |||
630 | (window = cdk_x11_window_lookup_for_display (display, last)) != NULL((void*)0) && | |||
631 | CDK_WINDOW_TYPE (window)((((CdkWindow *)(window)))->window_type) != CDK_WINDOW_FOREIGN) | |||
632 | { | |||
633 | xwindow = last; | |||
634 | break; | |||
635 | } | |||
636 | } | |||
637 | ||||
638 | cdk_x11_display_ungrab (display); | |||
639 | ||||
640 | if (cdk_x11_display_error_trap_pop (display) == 0) | |||
641 | { | |||
642 | window = cdk_x11_window_lookup_for_display (display, last); | |||
643 | impl = NULL((void*)0); | |||
644 | if (window) | |||
645 | impl = CDK_WINDOW_IMPL_X11 (window->impl)((((CdkWindowImplX11*) (void *) g_type_check_instance_cast (( GTypeInstance*) ((window->impl)), ((cdk_window_impl_x11_get_type ())))))); | |||
646 | ||||
647 | if (mask) | |||
648 | *mask = _cdk_x11_device_xi2_translate_state (&mod_state, &button_state, &group_state); | |||
649 | ||||
650 | free (button_state.mask); | |||
651 | } | |||
652 | else | |||
653 | { | |||
654 | window = NULL((void*)0); | |||
655 | ||||
656 | if (mask) | |||
657 | *mask = 0; | |||
658 | } | |||
659 | ||||
660 | if (win_x) | |||
661 | *win_x = (window) ? (xwin_x / impl->window_scale) : -1; | |||
662 | ||||
663 | if (win_y) | |||
664 | *win_y = (window) ? (xwin_y / impl->window_scale) : -1; | |||
665 | ||||
666 | ||||
667 | return window; | |||
668 | } | |||
669 | ||||
670 | static void | |||
671 | cdk_x11_device_xi2_select_window_events (CdkDevice *device, | |||
672 | CdkWindow *window, | |||
673 | CdkEventMask event_mask) | |||
674 | { | |||
675 | CdkX11DeviceXI2 *device_xi2 = CDK_X11_DEVICE_XI2 (device)((((CdkX11DeviceXI2*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_x11_device_xi2_get_type ())))))); | |||
676 | CdkX11DeviceManagerXI2 *device_manager_xi2; | |||
677 | CdkDisplay *display; | |||
678 | XIEventMask evmask; | |||
679 | ||||
680 | display = cdk_device_get_display (device); | |||
681 | G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push
clang diagnostic ignored "-Wdeprecated-declarations" ; | |||
682 | device_manager_xi2 = CDK_X11_DEVICE_MANAGER_XI2 (cdk_display_get_device_manager (display))((((CdkX11DeviceManagerXI2*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((cdk_display_get_device_manager (display) )), ((cdk_x11_device_manager_xi2_get_type ())))))); | |||
683 | G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop ; | |||
684 | ||||
685 | evmask.deviceid = device_xi2->device_id; | |||
686 | evmask.mask = _cdk_x11_device_xi2_translate_event_mask (device_manager_xi2, | |||
687 | event_mask, | |||
688 | &evmask.mask_len); | |||
689 | ||||
690 | XISelectEvents (CDK_WINDOW_XDISPLAY (window)(((((CdkX11Screen*) (void *) g_type_check_instance_cast ((GTypeInstance *) (((cdk_window_get_screen (window)))), ((cdk_x11_screen_get_type ()))))))->xdisplay), | |||
691 | CDK_WINDOW_XID (window)(((((CdkWindowImplX11*) (void *) g_type_check_instance_cast ( (GTypeInstance*) ((((((CdkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((window)), ((cdk_window_get_type ())))))) ->impl)), ((cdk_window_impl_x11_get_type ()))))))->xid), | |||
692 | &evmask, 1); | |||
693 | ||||
694 | g_free (evmask.mask); | |||
695 | } | |||
696 | ||||
697 | guchar * | |||
698 | _cdk_x11_device_xi2_translate_event_mask (CdkX11DeviceManagerXI2 *device_manager_xi2, | |||
699 | CdkEventMask event_mask, | |||
700 | gint *len) | |||
701 | { | |||
702 | guchar *mask; | |||
703 | gint minor; | |||
704 | ||||
705 | g_object_get (device_manager_xi2, "minor", &minor, NULL((void*)0)); | |||
706 | ||||
707 | *len = XIMaskLen (XI_LASTEVENT)(((32) >> 3) + 1); | |||
708 | mask = g_new0 (guchar, *len)((guchar *) g_malloc0_n ((*len), sizeof (guchar))); | |||
709 | ||||
710 | if (event_mask & CDK_POINTER_MOTION_MASK || | |||
711 | event_mask & CDK_POINTER_MOTION_HINT_MASK) | |||
712 | XISetMask (mask, XI_Motion)(((unsigned char*)(mask))[(6)>>3] |= (1 << ((6) & 7))); | |||
713 | ||||
714 | if (event_mask & CDK_BUTTON_MOTION_MASK || | |||
715 | event_mask & CDK_BUTTON1_MOTION_MASK || | |||
716 | event_mask & CDK_BUTTON2_MOTION_MASK || | |||
717 | event_mask & CDK_BUTTON3_MOTION_MASK) | |||
718 | { | |||
719 | XISetMask (mask, XI_ButtonPress)(((unsigned char*)(mask))[(4)>>3] |= (1 << ((4) & 7))); | |||
720 | XISetMask (mask, XI_ButtonRelease)(((unsigned char*)(mask))[(5)>>3] |= (1 << ((5) & 7))); | |||
721 | XISetMask (mask, XI_Motion)(((unsigned char*)(mask))[(6)>>3] |= (1 << ((6) & 7))); | |||
722 | } | |||
723 | ||||
724 | if (event_mask & CDK_SCROLL_MASK) | |||
725 | { | |||
726 | XISetMask (mask, XI_ButtonPress)(((unsigned char*)(mask))[(4)>>3] |= (1 << ((4) & 7))); | |||
727 | XISetMask (mask, XI_ButtonRelease)(((unsigned char*)(mask))[(5)>>3] |= (1 << ((5) & 7))); | |||
728 | } | |||
729 | ||||
730 | if (event_mask & CDK_BUTTON_PRESS_MASK) | |||
731 | XISetMask (mask, XI_ButtonPress)(((unsigned char*)(mask))[(4)>>3] |= (1 << ((4) & 7))); | |||
732 | ||||
733 | if (event_mask & CDK_BUTTON_RELEASE_MASK) | |||
734 | XISetMask (mask, XI_ButtonRelease)(((unsigned char*)(mask))[(5)>>3] |= (1 << ((5) & 7))); | |||
735 | ||||
736 | if (event_mask & CDK_KEY_PRESS_MASK) | |||
737 | XISetMask (mask, XI_KeyPress)(((unsigned char*)(mask))[(2)>>3] |= (1 << ((2) & 7))); | |||
738 | ||||
739 | if (event_mask & CDK_KEY_RELEASE_MASK) | |||
740 | XISetMask (mask, XI_KeyRelease)(((unsigned char*)(mask))[(3)>>3] |= (1 << ((3) & 7))); | |||
741 | ||||
742 | if (event_mask & CDK_ENTER_NOTIFY_MASK) | |||
743 | XISetMask (mask, XI_Enter)(((unsigned char*)(mask))[(7)>>3] |= (1 << ((7) & 7))); | |||
744 | ||||
745 | if (event_mask & CDK_LEAVE_NOTIFY_MASK) | |||
746 | XISetMask (mask, XI_Leave)(((unsigned char*)(mask))[(8)>>3] |= (1 << ((8) & 7))); | |||
747 | ||||
748 | if (event_mask & CDK_FOCUS_CHANGE_MASK) | |||
749 | { | |||
750 | XISetMask (mask, XI_FocusIn)(((unsigned char*)(mask))[(9)>>3] |= (1 << ((9) & 7))); | |||
751 | XISetMask (mask, XI_FocusOut)(((unsigned char*)(mask))[(10)>>3] |= (1 << ((10) & 7))); | |||
752 | } | |||
753 | ||||
754 | #ifdef XINPUT_2_21 | |||
755 | /* XInput 2.2 includes multitouch support */ | |||
756 | if (minor >= 2 && | |||
757 | event_mask & CDK_TOUCH_MASK) | |||
758 | { | |||
759 | XISetMask (mask, XI_TouchBegin)(((unsigned char*)(mask))[(18)>>3] |= (1 << ((18) & 7))); | |||
760 | XISetMask (mask, XI_TouchUpdate)(((unsigned char*)(mask))[(19)>>3] |= (1 << ((19) & 7))); | |||
761 | XISetMask (mask, XI_TouchEnd)(((unsigned char*)(mask))[(20)>>3] |= (1 << ((20) & 7))); | |||
762 | } | |||
763 | #endif /* XINPUT_2_2 */ | |||
764 | ||||
765 | return mask; | |||
766 | } | |||
767 | ||||
768 | guint | |||
769 | _cdk_x11_device_xi2_translate_state (XIModifierState *mods_state, | |||
770 | XIButtonState *buttons_state, | |||
771 | XIGroupState *group_state) | |||
772 | { | |||
773 | guint state = 0; | |||
774 | ||||
775 | if (mods_state
| |||
776 | state = mods_state->effective; | |||
| ||||
777 | ||||
778 | if (buttons_state) | |||
779 | { | |||
780 | gint len, i; | |||
781 | ||||
782 | /* We're only interested in the first 3 buttons */ | |||
783 | len = MIN (3, buttons_state->mask_len * 8)(((3) < (buttons_state->mask_len * 8)) ? (3) : (buttons_state ->mask_len * 8)); | |||
784 | ||||
785 | for (i = 1; i <= len; i++) | |||
786 | { | |||
787 | if (!XIMaskIsSet (buttons_state->mask, i)(((unsigned char*)(buttons_state->mask))[(i)>>3] & (1 << ((i) & 7)))) | |||
788 | continue; | |||
789 | ||||
790 | switch (i) | |||
791 | { | |||
792 | case 1: | |||
793 | state |= CDK_BUTTON1_MASK; | |||
794 | break; | |||
795 | case 2: | |||
796 | state |= CDK_BUTTON2_MASK; | |||
797 | break; | |||
798 | case 3: | |||
799 | state |= CDK_BUTTON3_MASK; | |||
800 | break; | |||
801 | default: | |||
802 | break; | |||
803 | } | |||
804 | } | |||
805 | } | |||
806 | ||||
807 | if (group_state) | |||
808 | state |= (group_state->effective) << 13; | |||
809 | ||||
810 | return state; | |||
811 | } | |||
812 | ||||
813 | void | |||
814 | _cdk_x11_device_xi2_add_scroll_valuator (CdkX11DeviceXI2 *device, | |||
815 | guint n_valuator, | |||
816 | CdkScrollDirection direction, | |||
817 | gdouble increment) | |||
818 | { | |||
819 | ScrollValuator scroll; | |||
820 | ||||
821 | g_return_if_fail (CDK_IS_X11_DEVICE_XI2 (device))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((device)); GType __t = ((cdk_x11_device_xi2_get_type ())) ; gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0) ); else __r = g_type_check_instance_is_a (__inst, __t); __r; } )))))) { } else { g_return_if_fail_warning ("Cdk", ((const char *) (__func__)), "CDK_IS_X11_DEVICE_XI2 (device)"); return; } } while (0); | |||
822 | g_return_if_fail (n_valuator < cdk_device_get_n_axes (CDK_DEVICE (device)))do { if ((n_valuator < cdk_device_get_n_axes (((((CdkDevice *) (void *) g_type_check_instance_cast ((GTypeInstance*) ((device )), ((cdk_device_get_type ()))))))))) { } else { g_return_if_fail_warning ("Cdk", ((const char*) (__func__)), "n_valuator < cdk_device_get_n_axes (CDK_DEVICE (device))" ); return; } } while (0); | |||
823 | ||||
824 | scroll.n_valuator = n_valuator; | |||
825 | scroll.direction = direction; | |||
826 | scroll.last_value_valid = FALSE(0); | |||
827 | scroll.increment = increment; | |||
828 | ||||
829 | g_array_append_val (device->scroll_valuators, scroll)g_array_append_vals (device->scroll_valuators, &(scroll ), 1); | |||
830 | } | |||
831 | ||||
832 | gboolean | |||
833 | _cdk_x11_device_xi2_get_scroll_delta (CdkX11DeviceXI2 *device, | |||
834 | guint n_valuator, | |||
835 | gdouble valuator_value, | |||
836 | CdkScrollDirection *direction_ret, | |||
837 | gdouble *delta_ret) | |||
838 | { | |||
839 | guint i; | |||
840 | ||||
841 | g_return_val_if_fail (CDK_IS_X11_DEVICE_XI2 (device), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((device)); GType __t = ((cdk_x11_device_xi2_get_type ())) ; gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0) ); else __r = g_type_check_instance_is_a (__inst, __t); __r; } )))))) { } else { g_return_if_fail_warning ("Cdk", ((const char *) (__func__)), "CDK_IS_X11_DEVICE_XI2 (device)"); return ((0 )); } } while (0); | |||
842 | g_return_val_if_fail (n_valuator < cdk_device_get_n_axes (CDK_DEVICE (device)), FALSE)do { if ((n_valuator < cdk_device_get_n_axes (((((CdkDevice *) (void *) g_type_check_instance_cast ((GTypeInstance*) ((device )), ((cdk_device_get_type ()))))))))) { } else { g_return_if_fail_warning ("Cdk", ((const char*) (__func__)), "n_valuator < cdk_device_get_n_axes (CDK_DEVICE (device))" ); return ((0)); } } while (0); | |||
843 | ||||
844 | for (i = 0; i < device->scroll_valuators->len; i++) | |||
845 | { | |||
846 | ScrollValuator *scroll; | |||
847 | ||||
848 | scroll = &g_array_index (device->scroll_valuators, ScrollValuator, i)(((ScrollValuator*) (void *) (device->scroll_valuators)-> data) [(i)]); | |||
849 | ||||
850 | if (scroll->n_valuator == n_valuator) | |||
851 | { | |||
852 | if (direction_ret) | |||
853 | *direction_ret = scroll->direction; | |||
854 | ||||
855 | if (delta_ret) | |||
856 | *delta_ret = 0; | |||
857 | ||||
858 | if (scroll->last_value_valid) | |||
859 | { | |||
860 | if (delta_ret) | |||
861 | *delta_ret = (valuator_value - scroll->last_value) / scroll->increment; | |||
862 | ||||
863 | scroll->last_value = valuator_value; | |||
864 | } | |||
865 | else | |||
866 | { | |||
867 | scroll->last_value = valuator_value; | |||
868 | scroll->last_value_valid = TRUE(!(0)); | |||
869 | } | |||
870 | ||||
871 | return TRUE(!(0)); | |||
872 | } | |||
873 | } | |||
874 | ||||
875 | return FALSE(0); | |||
876 | } | |||
877 | ||||
878 | void | |||
879 | _cdk_device_xi2_reset_scroll_valuators (CdkX11DeviceXI2 *device) | |||
880 | { | |||
881 | guint i; | |||
882 | ||||
883 | for (i = 0; i < device->scroll_valuators->len; i++) | |||
884 | { | |||
885 | ScrollValuator *scroll; | |||
886 | ||||
887 | scroll = &g_array_index (device->scroll_valuators, ScrollValuator, i)(((ScrollValuator*) (void *) (device->scroll_valuators)-> data) [(i)]); | |||
888 | scroll->last_value_valid = FALSE(0); | |||
889 | } | |||
890 | } | |||
891 | ||||
892 | void | |||
893 | _cdk_device_xi2_unset_scroll_valuators (CdkX11DeviceXI2 *device) | |||
894 | { | |||
895 | if (device->scroll_valuators->len > 0) | |||
896 | g_array_remove_range (device->scroll_valuators, 0, | |||
897 | device->scroll_valuators->len); | |||
898 | } | |||
899 | ||||
900 | gint | |||
901 | _cdk_x11_device_xi2_get_id (CdkX11DeviceXI2 *device) | |||
902 | { | |||
903 | g_return_val_if_fail (CDK_IS_X11_DEVICE_XI2 (device), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((device)); GType __t = ((cdk_x11_device_xi2_get_type ())) ; gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0) ); else __r = g_type_check_instance_is_a (__inst, __t); __r; } )))))) { } else { g_return_if_fail_warning ("Cdk", ((const char *) (__func__)), "CDK_IS_X11_DEVICE_XI2 (device)"); return (0) ; } } while (0); | |||
904 | ||||
905 | return device->device_id; | |||
906 | } | |||
907 | ||||
908 | gdouble | |||
909 | cdk_x11_device_xi2_get_last_axis_value (CdkX11DeviceXI2 *device, | |||
910 | gint n_axis) | |||
911 | { | |||
912 | if (n_axis >= cdk_device_get_n_axes (CDK_DEVICE (device)((((CdkDevice*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((device)), ((cdk_device_get_type ())))))))) | |||
913 | return 0; | |||
914 | ||||
915 | if (!device->last_axes) | |||
916 | return 0; | |||
917 | ||||
918 | return device->last_axes[n_axis]; | |||
919 | } | |||
920 | ||||
921 | void | |||
922 | cdk_x11_device_xi2_store_axes (CdkX11DeviceXI2 *device, | |||
923 | gdouble *axes, | |||
924 | gint n_axes) | |||
925 | { | |||
926 | g_free (device->last_axes); | |||
927 | ||||
928 | if (axes && n_axes) | |||
929 | device->last_axes = g_memdup2 (axes, sizeof (gdouble) * n_axes); | |||
930 | else | |||
931 | device->last_axes = NULL((void*)0); | |||
932 | } |