39.5 KB、1169行 生 Blame 履歴
1/*
2 * Copyright © 2009 Red Hat, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 */
24
25/* Conventions for this file:
26 * Names:
27 * structs: always typedef'd, prefixed with xXI, CamelCase
28 * struct members: lower_case_with_underscores
29 * Exceptions: reqType, ReqType, repType, RepType, sequenceNumber are
30 * named as such for historical reasons.
31 * request opcodes: X_XIRequestName as CamelCase
32 * defines: defines used in client applications must go in XI2.h
33 * defines used only in protocol handling: XISOMENAME
34 *
35 * Data types: unless there is a historical name for a datatype (e.g.
36 * Window), use stdint types specifying the size of the datatype.
37 * historical data type names must be defined and undefined at the top and
38 * end of the file.
39 *
40 * General:
41 * spaces, not tabs.
42 * structs specific to a request or reply added before the request
43 * definition. structs used in more than one request, reply or event
44 * appended to the common structs section before the definition of the
45 * first request.
46 * members of structs vertically aligned on column 16 if datatypes permit.
47 * otherwise aligned on next available 8n column.
48 */
49
50/**
51 * Protocol definitions for the XI2 protocol.
52 * This file should not be included by clients that merely use XI2, but do not
53 * need the wire protocol. Such clients should include XI2.h, or the matching
54 * header from the library.
55 *
56 */
57#ifndef _XI2PROTO_H_
58#define _XI2PROTO_H_
59
60#include <X11/Xproto.h>
61#include <X11/X.h>
62#include <X11/extensions/XI2.h>
63#include <stdint.h>
64
65/* make sure types have right sizes for protocol structures. */
66#define Window uint32_t
67#define Time uint32_t
68#define Atom uint32_t
69#define Cursor uint32_t
70#define Barrier uint32_t
71
72/**
73 * XI2 Request opcodes
74 */
75#define X_XIQueryPointer 40
76#define X_XIWarpPointer 41
77#define X_XIChangeCursor 42
78#define X_XIChangeHierarchy 43
79#define X_XISetClientPointer 44
80#define X_XIGetClientPointer 45
81#define X_XISelectEvents 46
82#define X_XIQueryVersion 47
83#define X_XIQueryDevice 48
84#define X_XISetFocus 49
85#define X_XIGetFocus 50
86#define X_XIGrabDevice 51
87#define X_XIUngrabDevice 52
88#define X_XIAllowEvents 53
89#define X_XIPassiveGrabDevice 54
90#define X_XIPassiveUngrabDevice 55
91#define X_XIListProperties 56
92#define X_XIChangeProperty 57
93#define X_XIDeleteProperty 58
94#define X_XIGetProperty 59
95#define X_XIGetSelectedEvents 60
96#define X_XIBarrierReleasePointer 61
97
98/** Number of XI requests */
99#define XI2REQUESTS (X_XIBarrierReleasePointer - X_XIQueryPointer + 1)
100/** Number of XI2 events */
101#define XI2EVENTS (XI_LASTEVENT + 1)
102
103/*************************************************************************************
104 * *
105 * COMMON STRUCTS *
106 * *
107 *************************************************************************************/
108/** Fixed point 16.16 */
109typedef int32_t FP1616;
110
111/** Fixed point 32.32 */
112typedef struct {
113 int32_t integral;
114 uint32_t frac;
115} FP3232;
116
117/**
118 * Struct to describe a device.
119 *
120 * For a MasterPointer or a MasterKeyboard, 'attachment' specifies the
121 * paired master device.
122 * For a SlaveKeyboard or SlavePointer, 'attachment' specifies the master
123 * device this device is attached to.
124 * For a FloatingSlave, 'attachment' is undefined.
125 */
126typedef struct {
127 uint16_t deviceid;
128 uint16_t use; /**< ::XIMasterPointer, ::XIMasterKeyboard,
129 ::XISlavePointer, ::XISlaveKeyboard,
130 ::XIFloatingSlave */
131 uint16_t attachment; /**< Current attachment or pairing.*/
132 uint16_t num_classes; /**< Number of classes following this struct. */
133 uint16_t name_len; /**< Length of name in bytes. */
134 uint8_t enabled; /**< TRUE if device is enabled. */
135 uint8_t pad;
136} xXIDeviceInfo;
137
138/**
139 * Default template for a device class.
140 * A device class is equivalent to a device's capabilities. Multiple classes
141 * are supported per device.
142 */
143typedef struct {
144 uint16_t type; /**< One of *class */
145 uint16_t length; /**< Length in 4 byte units */
146 uint16_t sourceid; /**< source device for this class */
147 uint16_t pad;
148} xXIAnyInfo;
149
150/**
151 * Denotes button capability on a device.
152 * Struct is followed by a button bit-mask (padded to four byte chunks) and
153 * then num_buttons * Atom that names the buttons in the device-native setup
154 * (i.e. ignoring button mappings).
155 */
156typedef struct {
157 uint16_t type; /**< Always ButtonClass */
158 uint16_t length; /**< Length in 4 byte units */
159 uint16_t sourceid; /**< source device for this class */
160 uint16_t num_buttons; /**< Number of buttons provided */
161} xXIButtonInfo;
162
163/**
164 * Denotes key capability on a device.
165 * Struct is followed by num_keys * CARD32 that lists the keycodes available
166 * on the device.
167 */
168typedef struct {
169 uint16_t type; /**< Always KeyClass */
170 uint16_t length; /**< Length in 4 byte units */
171 uint16_t sourceid; /**< source device for this class */
172 uint16_t num_keycodes; /**< Number of keys provided */
173} xXIKeyInfo;
174
175/**
176 * Denotes an valuator capability on a device.
177 * One XIValuatorInfo describes exactly one valuator (axis) on the device.
178 */
179typedef struct {
180 uint16_t type; /**< Always ValuatorClass */
181 uint16_t length; /**< Length in 4 byte units */
182 uint16_t sourceid; /**< source device for this class */
183 uint16_t number; /**< Valuator number */
184 Atom label; /**< Axis label */
185 FP3232 min; /**< Min value */
186 FP3232 max; /**< Max value */
187 FP3232 value; /**< Last published value */
188 uint32_t resolution; /**< Resolutions in units/m */
189 uint8_t mode; /**< ModeRelative or ModeAbsolute */
190 uint8_t pad1;
191 uint16_t pad2;
192} xXIValuatorInfo;
193
194/***
195 * Denotes a scroll valuator on a device.
196 * One XIScrollInfo describes exactly one scroll valuator that must have a
197 * XIValuatorInfo struct.
198 */
199typedef struct {
200 uint16_t type; /**< Always ValuatorClass */
201 uint16_t length; /**< Length in 4 byte units */
202 uint16_t sourceid; /**< source device for this class */
203 uint16_t number; /**< Valuator number */
204 uint16_t scroll_type; /**< ::XIScrollTypeVertical, ::XIScrollTypeHorizontal */
205 uint16_t pad0;
206 uint32_t flags; /**< ::XIScrollFlagEmulate, ::XIScrollFlagPreferred */
207 FP3232 increment; /**< Increment for one unit of scrolling */
208} xXIScrollInfo;
209
210/**
211 * Denotes multitouch capability on a device.
212 */
213typedef struct {
214 uint16_t type; /**< Always TouchClass */
215 uint16_t length; /**< Length in 4 byte units */
216 uint16_t sourceid; /**< source device for this class */
217 uint8_t mode; /**< DirectTouch or DependentTouch */
218 uint8_t num_touches; /**< Maximum number of touches (0==unlimited) */
219} xXITouchInfo;
220
221/**
222 * Denotes touchpad gesture capability on a device.
223 */
224typedef struct {
225 uint16_t type; /**< Always GestureClass */
226 uint16_t length; /**< Length in 4 byte units */
227 uint16_t sourceid; /**< source device for this class */
228 uint8_t num_touches; /**< Maximum number of touches gesture supports (0==unlimited) */
229 uint8_t pad0;
230} xXIGestureInfo;
231
232/**
233 * Used to select for events on a given window.
234 * Struct is followed by (mask_len * CARD8), with each bit set representing
235 * the event mask for the given type. A mask bit represents an event type if
236 * (mask == (1 << type)).
237 */
238typedef struct {
239 uint16_t deviceid; /**< Device id to select for */
240 uint16_t mask_len; /**< Length of mask in 4 byte units */
241} xXIEventMask;
242
243/**
244 * XKB modifier information.
245 * The effective modifier is a binary mask of base, latched, and locked
246 * modifiers.
247 */
248typedef struct
249{
250 uint32_t base_mods; /**< Logically pressed modifiers */
251 uint32_t latched_mods; /**< Logically latched modifiers */
252 uint32_t locked_mods; /**< Logically locked modifiers */
253 uint32_t effective_mods; /**< Effective modifiers */
254} xXIModifierInfo;
255
256/**
257 * XKB group information.
258 * The effective group is the mathematical sum of base, latched, and locked
259 * group after group wrapping is taken into account.
260 */
261typedef struct
262{
263 uint8_t base_group; /**< Logically "pressed" group */
264 uint8_t latched_group; /**< Logically latched group */
265 uint8_t locked_group; /**< Logically locked group */
266 uint8_t effective_group; /**< Effective group */
267} xXIGroupInfo;
268
269
270/*************************************************************************************
271 * *
272 * REQUESTS *
273 * *
274 *************************************************************************************/
275
276/**
277 * Query the server for the supported X Input extension version.
278 */
279
280typedef struct {
281 uint8_t reqType; /**< Input extension major code */
282 uint8_t ReqType; /**< Always ::X_XIQueryVersion */
283 uint16_t length; /**< Length in 4 byte units */
284 uint16_t major_version;
285 uint16_t minor_version;
286} xXIQueryVersionReq;
287#define sz_xXIQueryVersionReq 8
288
289typedef struct {
290 uint8_t repType; /**< ::X_Reply */
291 uint8_t RepType; /**< Always ::X_XIQueryVersion */
292 uint16_t sequenceNumber;
293 uint32_t length;
294 uint16_t major_version;
295 uint16_t minor_version;
296 uint32_t pad1;
297 uint32_t pad2;
298 uint32_t pad3;
299 uint32_t pad4;
300 uint32_t pad5;
301} xXIQueryVersionReply;
302#define sz_xXIQueryVersionReply 32
303
304/**
305 * Query the server for information about a specific device or all input
306 * devices.
307 */
308typedef struct {
309 uint8_t reqType; /**< Input extension major code */
310 uint8_t ReqType; /**< Always ::X_XIQueryDevice */
311 uint16_t length; /**< Length in 4 byte units */
312 uint16_t deviceid;
313 uint16_t pad;
314} xXIQueryDeviceReq;
315#define sz_xXIQueryDeviceReq 8
316
317typedef struct {
318 uint8_t repType; /**< ::X_Reply */
319 uint8_t RepType; /**< Always ::X_XIQueryDevice */
320 uint16_t sequenceNumber;
321 uint32_t length;
322 uint16_t num_devices;
323 uint16_t pad0;
324 uint32_t pad1;
325 uint32_t pad2;
326 uint32_t pad3;
327 uint32_t pad4;
328 uint32_t pad5;
329} xXIQueryDeviceReply;
330#define sz_xXIQueryDeviceReply 32
331
332/**
333 * Select for events on a given window.
334 */
335typedef struct {
336 uint8_t reqType; /**< Input extension major code */
337 uint8_t ReqType; /**< Always ::X_XISelectEvents */
338 uint16_t length; /**< Length in 4 byte units */
339 Window win;
340 uint16_t num_masks;
341 uint16_t pad;
342} xXISelectEventsReq;
343#define sz_xXISelectEventsReq 12
344
345/**
346 * Query for selected events on a given window.
347 */
348typedef struct {
349 uint8_t reqType; /**< Input extension major code */
350 uint8_t ReqType; /**< Always ::X_XIGetSelectedEvents */
351 uint16_t length; /**< Length in 4 byte units */
352 Window win;
353} xXIGetSelectedEventsReq;
354#define sz_xXIGetSelectedEventsReq 8
355
356typedef struct {
357 uint8_t repType; /**< Input extension major opcode */
358 uint8_t RepType; /**< Always ::X_XIGetSelectedEvents */
359 uint16_t sequenceNumber;
360 uint32_t length;
361 uint16_t num_masks; /**< Number of xXIEventMask structs
362 trailing the reply */
363 uint16_t pad0;
364 uint32_t pad1;
365 uint32_t pad2;
366 uint32_t pad3;
367 uint32_t pad4;
368 uint32_t pad5;
369} xXIGetSelectedEventsReply;
370#define sz_xXIGetSelectedEventsReply 32
371
372/**
373 * Query the given device's screen/window coordinates.
374 */
375
376typedef struct {
377 uint8_t reqType; /**< Input extension major code */
378 uint8_t ReqType; /**< Always ::X_XIQueryPointer */
379 uint16_t length; /**< Length in 4 byte units */
380 Window win;
381 uint16_t deviceid;
382 uint16_t pad1;
383} xXIQueryPointerReq;
384#define sz_xXIQueryPointerReq 12
385
386
387typedef struct {
388 uint8_t repType; /**< Input extension major opcode */
389 uint8_t RepType; /**< Always ::X_XIQueryPointer */
390 uint16_t sequenceNumber;
391 uint32_t length;
392 Window root;
393 Window child;
394 FP1616 root_x;
395 FP1616 root_y;
396 FP1616 win_x;
397 FP1616 win_y;
398 uint8_t same_screen;
399 uint8_t pad0;
400 uint16_t buttons_len;
401 xXIModifierInfo mods;
402 xXIGroupInfo group;
403} xXIQueryPointerReply;
404#define sz_xXIQueryPointerReply 56
405
406/**
407 * Warp the given device's pointer to the specified position.
408 */
409
410typedef struct {
411 uint8_t reqType; /**< Input extension major code */
412 uint8_t ReqType; /**< Always ::X_XIWarpPointer */
413 uint16_t length; /**< Length in 4 byte units */
414 Window src_win;
415 Window dst_win;
416 FP1616 src_x;
417 FP1616 src_y;
418 uint16_t src_width;
419 uint16_t src_height;
420 FP1616 dst_x;
421 FP1616 dst_y;
422 uint16_t deviceid;
423 uint16_t pad1;
424} xXIWarpPointerReq;
425#define sz_xXIWarpPointerReq 36
426
427/**
428 * Change the given device's sprite to the given cursor.
429 */
430
431typedef struct {
432 uint8_t reqType; /**< Input extension major code */
433 uint8_t ReqType; /**< Always ::X_XIChangeCursor */
434 uint16_t length; /**< Length in 4 byte units */
435 Window win;
436 Cursor cursor;
437 uint16_t deviceid;
438 uint16_t pad1;
439} xXIChangeCursorReq;
440#define sz_xXIChangeCursorReq 16
441
442/**
443 * Modify the device hierarchy.
444 */
445
446typedef struct {
447 uint8_t reqType; /**< Input extension major code */
448 uint8_t ReqType; /**< Always ::X_XIChangeHierarchy */
449 uint16_t length; /**< Length in 4 byte units */
450 uint8_t num_changes;
451 uint8_t pad0;
452 uint16_t pad1;
453} xXIChangeHierarchyReq;
454#define sz_xXIChangeHierarchyReq 8
455
456/**
457 * Generic header for any hierarchy change.
458 */
459typedef struct {
460 uint16_t type;
461 uint16_t length; /**< Length in 4 byte units */
462} xXIAnyHierarchyChangeInfo;
463
464/**
465 * Create a new master device.
466 * Name of new master follows struct (4-byte padded)
467 */
468typedef struct {
469 uint16_t type; /**< Always ::XIAddMaster */
470 uint16_t length; /**< 2 + (namelen + padding)/4 */
471 uint16_t name_len;
472 uint8_t send_core;
473 uint8_t enable;
474} xXIAddMasterInfo;
475
476/**
477 * Delete a master device. Will automatically delete the master device paired
478 * with the given master device.
479 */
480typedef struct {
481 uint16_t type; /**< Always ::XIRemoveMaster */
482 uint16_t length; /**< 3 */
483 uint16_t deviceid;
484 uint8_t return_mode; /**< ::XIAttachToMaster, ::XIFloating */
485 uint8_t pad;
486 uint16_t return_pointer; /**< Pointer to attach slave ptr devices to */
487 uint16_t return_keyboard; /**< keyboard to attach slave keybd devices to*/
488} xXIRemoveMasterInfo;
489
490/**
491 * Attach an SD to a new device.
492 * NewMaster has to be of same type (pointer->pointer, keyboard->keyboard);
493 */
494typedef struct {
495 uint16_t type; /**< Always ::XIAttachSlave */
496 uint16_t length; /**< 2 */
497 uint16_t deviceid;
498 uint16_t new_master; /**< id of new master device */
499} xXIAttachSlaveInfo;
500
501/**
502 * Detach an SD from its current master device.
503 */
504typedef struct {
505 uint16_t type; /**< Always ::XIDetachSlave */
506 uint16_t length; /**< 2 */
507 uint16_t deviceid;
508 uint16_t pad;
509} xXIDetachSlaveInfo;
510
511
512/**
513 * Set the window/client's ClientPointer.
514 */
515typedef struct {
516 uint8_t reqType;
517 uint8_t ReqType; /**< Always ::X_XISetClientPointer */
518 uint16_t length; /**< Length in 4 byte units */
519 Window win;
520 uint16_t deviceid;
521 uint16_t pad1;
522} xXISetClientPointerReq;
523#define sz_xXISetClientPointerReq 12
524
525/**
526 * Query the given window/client's ClientPointer setting.
527 */
528typedef struct {
529 uint8_t reqType;
530 uint8_t ReqType; /**< Always ::X_GetClientPointer */
531 uint16_t length; /**< Length in 4 byte units */
532 Window win;
533} xXIGetClientPointerReq;
534#define sz_xXIGetClientPointerReq 8
535
536typedef struct {
537 uint8_t repType; /**< Input extension major opcode */
538 uint8_t RepType; /**< Always ::X_GetClientPointer */
539 uint16_t sequenceNumber;
540 uint32_t length;
541 BOOL set; /**< client pointer is set? */
542 uint8_t pad0;
543 uint16_t deviceid;
544 uint32_t pad1;
545 uint32_t pad2;
546 uint32_t pad3;
547 uint32_t pad4;
548 uint32_t pad5;
549} xXIGetClientPointerReply;
550#define sz_xXIGetClientPointerReply 32
551
552/**
553 * Set the input focus to the specified window.
554 */
555typedef struct {
556 uint8_t reqType;
557 uint8_t ReqType; /**< Always ::X_XISetFocus */
558 uint16_t length; /**< Length in 4 byte units */
559 Window focus;
560 Time time;
561 uint16_t deviceid;
562 uint16_t pad0;
563} xXISetFocusReq;
564#define sz_xXISetFocusReq 16
565
566/**
567 * Query the current input focus.
568 */
569typedef struct {
570 uint8_t reqType;
571 uint8_t ReqType; /**< Always ::X_XIGetDeviceFocus */
572 uint16_t length; /**< Length in 4 byte units */
573 uint16_t deviceid;
574 uint16_t pad0;
575} xXIGetFocusReq;
576#define sz_xXIGetFocusReq 8
577
578typedef struct {
579 uint8_t repType; /**< Input extension major opcode */
580 uint8_t RepType; /**< Always ::X_XIGetFocus */
581 uint16_t sequenceNumber;
582 uint32_t length;
583 Window focus;
584 uint32_t pad1;
585 uint32_t pad2;
586 uint32_t pad3;
587 uint32_t pad4;
588 uint32_t pad5;
589} xXIGetFocusReply;
590#define sz_xXIGetFocusReply 32
591
592
593/**
594 * Grab the given device.
595 */
596typedef struct {
597 uint8_t reqType;
598 uint8_t ReqType; /**< Always ::X_XIGrabDevice */
599 uint16_t length; /**< Length in 4 byte units */
600 Window grab_window;
601 Time time;
602 Cursor cursor;
603 uint16_t deviceid;
604 uint8_t grab_mode;
605 uint8_t paired_device_mode;
606 uint8_t owner_events;
607 uint8_t pad;
608 uint16_t mask_len;
609} xXIGrabDeviceReq;
610#define sz_xXIGrabDeviceReq 24
611
612/**
613 * Return codes from a XIPassiveGrabDevice request.
614 */
615typedef struct {
616 uint32_t modifiers; /**< Modifier state */
617 uint8_t status; /**< Grab status code */
618 uint8_t pad0;
619 uint16_t pad1;
620} xXIGrabModifierInfo;
621
622typedef struct {
623 uint8_t repType; /**< Input extension major opcode */
624 uint8_t RepType; /**< Always ::X_XIGrabDevice */
625 uint16_t sequenceNumber;
626 uint32_t length;
627 uint8_t status;
628 uint8_t pad0;
629 uint16_t pad1;
630 uint32_t pad2;
631 uint32_t pad3;
632 uint32_t pad4;
633 uint32_t pad5;
634 uint32_t pad6;
635} xXIGrabDeviceReply;
636#define sz_xXIGrabDeviceReply 32
637
638/**
639 * Ungrab the specified device.
640 *
641 */
642typedef struct {
643 uint8_t reqType;
644 uint8_t ReqType; /**< Always ::X_XIUngrabDevice */
645 uint16_t length; /**< Length in 4 byte units */
646 Time time;
647 uint16_t deviceid;
648 uint16_t pad;
649} xXIUngrabDeviceReq;
650#define sz_xXIUngrabDeviceReq 12
651
652
653/**
654 * Allow or replay events on the specified grabbed device.
655 */
656typedef struct {
657 uint8_t reqType;
658 uint8_t ReqType; /**< Always ::X_XIAllowEvents */
659 uint16_t length; /**< Length in 4 byte units */
660 Time time;
661 uint16_t deviceid;
662 uint8_t mode;
663 uint8_t pad;
664} xXIAllowEventsReq;
665#define sz_xXIAllowEventsReq 12
666
667/**
668 * Allow or replay events on the specified grabbed device.
669 * Since XI 2.2
670 */
671typedef struct {
672 uint8_t reqType;
673 uint8_t ReqType; /**< Always ::X_XIAllowEvents */
674 uint16_t length; /**< Length in 4 byte units */
675 Time time;
676 uint16_t deviceid;
677 uint8_t mode;
678 uint8_t pad;
679 uint32_t touchid; /**< Since XI 2.2 */
680 Window grab_window; /**< Since XI 2.2 */
681} xXI2_2AllowEventsReq;
682#define sz_xXI2_2AllowEventsReq 20
683
684
685/**
686 * Passively grab the device.
687 */
688typedef struct {
689 uint8_t reqType;
690 uint8_t ReqType; /**< Always ::X_XIPassiveGrabDevice */
691 uint16_t length; /**< Length in 4 byte units */
692 Time time;
693 Window grab_window;
694 Cursor cursor;
695 uint32_t detail;
696 uint16_t deviceid;
697 uint16_t num_modifiers;
698 uint16_t mask_len;
699 uint8_t grab_type;
700 uint8_t grab_mode;
701 uint8_t paired_device_mode;
702 uint8_t owner_events;
703 uint16_t pad1;
704} xXIPassiveGrabDeviceReq;
705#define sz_xXIPassiveGrabDeviceReq 32
706
707typedef struct {
708 uint8_t repType; /**< Input extension major opcode */
709 uint8_t RepType; /**< Always ::X_XIPassiveGrabDevice */
710 uint16_t sequenceNumber;
711 uint32_t length;
712 uint16_t num_modifiers;
713 uint16_t pad1;
714 uint32_t pad2;
715 uint32_t pad3;
716 uint32_t pad4;
717 uint32_t pad5;
718 uint32_t pad6;
719} xXIPassiveGrabDeviceReply;
720#define sz_xXIPassiveGrabDeviceReply 32
721
722/**
723 * Delete a passive grab for the given device.
724 */
725typedef struct {
726 uint8_t reqType;
727 uint8_t ReqType; /**< Always ::X_XIPassiveUngrabDevice */
728 uint16_t length; /**< Length in 4 byte units */
729 Window grab_window;
730 uint32_t detail;
731 uint16_t deviceid;
732 uint16_t num_modifiers;
733 uint8_t grab_type;
734 uint8_t pad0;
735 uint16_t pad1;
736} xXIPassiveUngrabDeviceReq;
737#define sz_xXIPassiveUngrabDeviceReq 20
738
739/**
740 * List all device properties on the specified device.
741 */
742typedef struct {
743 uint8_t reqType;
744 uint8_t ReqType; /**< Always ::X_XIListProperties */
745 uint16_t length; /**< Length in 4 byte units */
746 uint16_t deviceid;
747 uint16_t pad;
748} xXIListPropertiesReq;
749#define sz_xXIListPropertiesReq 8
750
751typedef struct {
752 uint8_t repType; /**< Input extension major opcode */
753 uint8_t RepType; /**< Always ::X_XIListProperties */
754 uint16_t sequenceNumber;
755 uint32_t length;
756 uint16_t num_properties;
757 uint16_t pad0;
758 uint32_t pad1;
759 uint32_t pad2;
760 uint32_t pad3;
761 uint32_t pad4;
762 uint32_t pad5;
763} xXIListPropertiesReply;
764#define sz_xXIListPropertiesReply 32
765
766/**
767 * Change a property on the specified device.
768 */
769typedef struct {
770 uint8_t reqType;
771 uint8_t ReqType; /**< Always ::X_XIChangeProperty */
772 uint16_t length; /**< Length in 4 byte units */
773 uint16_t deviceid;
774 uint8_t mode;
775 uint8_t format;
776 Atom property;
777 Atom type;
778 uint32_t num_items;
779} xXIChangePropertyReq;
780#define sz_xXIChangePropertyReq 20
781
782/**
783 * Delete the specified property.
784 */
785typedef struct {
786 uint8_t reqType;
787 uint8_t ReqType; /**< Always X_XIDeleteProperty */
788 uint16_t length; /**< Length in 4 byte units */
789 uint16_t deviceid;
790 uint16_t pad0;
791 Atom property;
792} xXIDeletePropertyReq;
793#define sz_xXIDeletePropertyReq 12
794
795/**
796 * Query the specified property's values.
797 */
798typedef struct {
799 uint8_t reqType;
800 uint8_t ReqType; /**< Always X_XIGetProperty */
801 uint16_t length; /**< Length in 4 byte units */
802 uint16_t deviceid;
803#if defined(__cplusplus) || defined(c_plusplus)
804 uint8_t c_delete;
805#else
806 uint8_t delete;
807#endif
808 uint8_t pad0;
809 Atom property;
810 Atom type;
811 uint32_t offset;
812 uint32_t len;
813} xXIGetPropertyReq;
814#define sz_xXIGetPropertyReq 24
815
816typedef struct {
817 uint8_t repType; /**< Input extension major opcode */
818 uint8_t RepType; /**< Always X_XIGetProperty */
819 uint16_t sequenceNumber;
820 uint32_t length;
821 Atom type;
822 uint32_t bytes_after;
823 uint32_t num_items;
824 uint8_t format;
825 uint8_t pad0;
826 uint16_t pad1;
827 uint32_t pad2;
828 uint32_t pad3;
829} xXIGetPropertyReply;
830#define sz_xXIGetPropertyReply 32
831
832typedef struct {
833 uint16_t deviceid;
834 uint16_t pad;
835 Barrier barrier;
836 uint32_t eventid;
837} xXIBarrierReleasePointerInfo;
838
839typedef struct {
840 uint8_t reqType; /**< Input extension major opcode */
841 uint8_t ReqType; /**< Always X_XIBarrierReleasePointer */
842 uint16_t length;
843 uint32_t num_barriers;
844 /* array of xXIBarrierReleasePointerInfo */
845} xXIBarrierReleasePointerReq;
846#define sz_xXIBarrierReleasePointerReq 8
847
848/*************************************************************************************
849 * *
850 * EVENTS *
851 * *
852 *************************************************************************************/
853
854/**
855 * Generic XI2 event header. All XI2 events use the same header.
856 */
857typedef struct
858{
859 uint8_t type;
860 uint8_t extension; /**< XI extension offset */
861 uint16_t sequenceNumber;
862 uint32_t length;
863 uint16_t evtype;
864 uint16_t deviceid;
865 Time time;
866} xXIGenericDeviceEvent;
867
868/**
869 * Device hierarchy information.
870 */
871typedef struct
872{
873 uint16_t deviceid;
874 uint16_t attachment; /**< ID of master or paired device */
875 uint8_t use; /**< ::XIMasterKeyboard,
876 ::XIMasterPointer,
877 ::XISlaveKeyboard,
878 ::XISlavePointer,
879 ::XIFloatingSlave */
880 BOOL enabled; /**< TRUE if the device is enabled */
881 uint16_t pad;
882 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterRemoved,
883 ::XISlaveAttached, ::XISlaveDetached,
884 ::XISlaveAdded, ::XISlaveRemoved,
885 ::XIDeviceEnabled, ::XIDeviceDisabled */
886} xXIHierarchyInfo;
887
888/**
889 * The device hierarchy has been modified. This event includes the device
890 * hierarchy after the modification has been applied.
891 */
892typedef struct
893{
894 uint8_t type; /**< Always GenericEvent */
895 uint8_t extension; /**< XI extension offset */
896 uint16_t sequenceNumber;
897 uint32_t length; /**< Length in 4 byte units */
898 uint16_t evtype; /**< ::XI_Hierarchy */
899 uint16_t deviceid;
900 Time time;
901 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterDeleted,
902 ::XISlaveAttached, ::XISlaveDetached,
903 ::XISlaveAdded, ::XISlaveRemoved,
904 ::XIDeviceEnabled, ::XIDeviceDisabled */
905 uint16_t num_info;
906 uint16_t pad0;
907 uint32_t pad1;
908 uint32_t pad2;
909} xXIHierarchyEvent;
910
911/**
912 * A device has changed capabilities.
913 */
914typedef struct
915{
916 uint8_t type; /**< Always GenericEvent */
917 uint8_t extension; /**< XI extension offset */
918 uint16_t sequenceNumber;
919 uint32_t length; /**< Length in 4 byte units */
920 uint16_t evtype; /**< XI_DeviceChanged */
921 uint16_t deviceid; /**< Device that has changed */
922 Time time;
923 uint16_t num_classes; /**< Number of classes that have changed */
924 uint16_t sourceid; /**< Source of the new classes */
925 uint8_t reason; /**< ::XISlaveSwitch, ::XIDeviceChange */
926 uint8_t pad0;
927 uint16_t pad1;
928 uint32_t pad2;
929 uint32_t pad3;
930} xXIDeviceChangedEvent;
931
932/**
933 * The owner of a touch stream has passed on ownership to another client.
934 */
935typedef struct
936{
937 uint8_t type; /**< Always GenericEvent */
938 uint8_t extension; /**< XI extension offset */
939 uint16_t sequenceNumber;
940 uint32_t length; /**< Length in 4 byte units */
941 uint16_t evtype; /**< XI_TouchOwnership */
942 uint16_t deviceid; /**< Device that has changed */
943 Time time;
944 uint32_t touchid;
945 Window root;
946 Window event;
947 Window child;
948/* └──────── 32 byte boundary ────────┘ */
949 uint16_t sourceid;
950 uint16_t pad0;
951 uint32_t flags;
952 uint32_t pad1;
953 uint32_t pad2;
954} xXITouchOwnershipEvent;
955
956/**
957 * Default input event for pointer, keyboard or touch input.
958 */
959typedef struct
960{
961 uint8_t type; /**< Always GenericEvent */
962 uint8_t extension; /**< XI extension offset */
963 uint16_t sequenceNumber;
964 uint32_t length; /**< Length in 4 byte uints */
965 uint16_t evtype;
966 uint16_t deviceid;
967 Time time;
968 uint32_t detail; /**< Keycode or button */
969 Window root;
970 Window event;
971 Window child;
972/* └──────── 32 byte boundary ────────┘ */
973 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */
974 FP1616 root_y;
975 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */
976 FP1616 event_y;
977 uint16_t buttons_len; /**< Len of button flags in 4 b units */
978 uint16_t valuators_len; /**< Len of val. flags in 4 b units */
979 uint16_t sourceid; /**< The source device */
980 uint16_t pad0;
981 uint32_t flags; /**< ::XIKeyRepeat */
982 xXIModifierInfo mods;
983 xXIGroupInfo group;
984} xXIDeviceEvent;
985
986
987/**
988 * Sent when an input event is generated. RawEvents include valuator
989 * information in both device-specific data (i.e. unaccelerated) and
990 * processed data (i.e. accelerated, if applicable).
991 */
992typedef struct
993{
994 uint8_t type; /**< Always GenericEvent */
995 uint8_t extension; /**< XI extension offset */
996 uint16_t sequenceNumber;
997 uint32_t length; /**< Length in 4 byte uints */
998 uint16_t evtype; /**< ::XI_RawEvent */
999 uint16_t deviceid;
1000 Time time;
1001 uint32_t detail;
1002 uint16_t sourceid; /**< The source device (XI 2.1) */
1003 uint16_t valuators_len; /**< Length of trailing valuator
1004 mask in 4 byte units */
1005 uint32_t flags; /**< ::XIKeyRepeat */
1006 uint32_t pad2;
1007} xXIRawEvent;
1008
1009/**
1010 * Note that the layout of root, event, child, root_x, root_y, event_x,
1011 * event_y must be identical to the xXIDeviceEvent.
1012 */
1013typedef struct
1014{
1015 uint8_t type; /**< Always GenericEvent */
1016 uint8_t extension; /**< XI extension offset */
1017 uint16_t sequenceNumber;
1018 uint32_t length; /**< Length in 4 byte uints */
1019 uint16_t evtype; /**< ::XI_Enter */
1020 uint16_t deviceid;
1021 Time time;
1022 uint16_t sourceid;
1023 uint8_t mode;
1024 uint8_t detail;
1025 Window root;
1026 Window event;
1027 Window child;
1028/* └──────── 32 byte boundary ────────┘ */
1029 FP1616 root_x;
1030 FP1616 root_y;
1031 FP1616 event_x;
1032 FP1616 event_y;
1033 BOOL same_screen;
1034 BOOL focus;
1035 uint16_t buttons_len; /**< Length of trailing button mask
1036 in 4 byte units */
1037 xXIModifierInfo mods;
1038 xXIGroupInfo group;
1039} xXIEnterEvent;
1040
1041typedef xXIEnterEvent xXILeaveEvent;
1042typedef xXIEnterEvent xXIFocusInEvent;
1043typedef xXIEnterEvent xXIFocusOutEvent;
1044
1045/**
1046 * Sent when a device property is created, modified or deleted. Does not
1047 * include property data, the client is required to query the data.
1048 */
1049typedef struct
1050{
1051 uint8_t type; /**< Always GenericEvent */
1052 uint8_t extension; /**< XI extension offset */
1053 uint16_t sequenceNumber;
1054 uint32_t length; /**< Length in 4 byte units */
1055 uint16_t evtype; /**< ::XI_PropertyEvent */
1056 uint16_t deviceid;
1057 Time time;
1058 Atom property;
1059 uint8_t what; /**< ::XIPropertyDeleted,
1060 ::XIPropertyCreated,
1061 ::XIPropertyMotified */
1062 uint8_t pad0;
1063 uint16_t pad1;
1064 uint32_t pad2;
1065 uint32_t pad3;
1066} xXIPropertyEvent;
1067
1068typedef struct
1069{
1070 uint8_t type; /**< Always GenericEvent */
1071 uint8_t extension; /**< XI extension offset */
1072 uint16_t sequenceNumber;
1073 uint32_t length; /**< Length in 4 byte units */
1074 uint16_t evtype; /**< ::XI_BarrierHit or ::XI_BarrierLeave */
1075 uint16_t deviceid;
1076 Time time;
1077 uint32_t eventid;
1078 Window root;
1079 Window event;
1080 Barrier barrier;
1081/* └──────── 32 byte boundary ────────┘ */
1082 uint32_t dtime;
1083 uint32_t flags; /**< ::XIBarrierPointerReleased
1084 ::XIBarrierDeviceIsGrabbed */
1085 uint16_t sourceid;
1086 int16_t pad;
1087 FP1616 root_x;
1088 FP1616 root_y;
1089 FP3232 dx;
1090 FP3232 dy;
1091} xXIBarrierEvent;
1092
1093typedef xXIBarrierEvent xXIBarrierHitEvent;
1094typedef xXIBarrierEvent xXIBarrierPointerReleasedEvent;
1095typedef xXIBarrierEvent xXIBarrierLeaveEvent;
1096
1097/**
1098 * Event for touchpad gesture pinch input events
1099 */
1100typedef struct
1101{
1102 uint8_t type; /**< Always GenericEvent */
1103 uint8_t extension; /**< XI extension offset */
1104 uint16_t sequenceNumber;
1105 uint32_t length; /**< Length in 4 byte uints */
1106 uint16_t evtype;
1107 uint16_t deviceid;
1108 Time time;
1109 uint32_t detail; /**< The number of touches in the gesture */
1110 Window root;
1111 Window event;
1112 Window child;
1113/* └──────── 32 byte boundary ────────┘ */
1114 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */
1115 FP1616 root_y;
1116 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */
1117 FP1616 event_y;
1118 FP1616 delta_x;
1119 FP1616 delta_y;
1120 FP1616 delta_unaccel_x;
1121 FP1616 delta_unaccel_y;
1122 FP1616 scale;
1123 FP1616 delta_angle;
1124 uint16_t sourceid; /**< The source device */
1125 uint16_t pad0;
1126 xXIModifierInfo mods;
1127 xXIGroupInfo group;
1128 uint32_t flags; /**< ::XIGesturePinchEventCancelled */
1129} xXIGesturePinchEvent;
1130
1131/**
1132 * Event for touchpad gesture swipe input events
1133 */
1134typedef struct
1135{
1136 uint8_t type; /**< Always GenericEvent */
1137 uint8_t extension; /**< XI extension offset */
1138 uint16_t sequenceNumber;
1139 uint32_t length; /**< Length in 4 byte uints */
1140 uint16_t evtype;
1141 uint16_t deviceid;
1142 Time time;
1143 uint32_t detail; /**< The number of touches in the gesture */
1144 Window root;
1145 Window event;
1146 Window child;
1147/* └──────── 32 byte boundary ────────┘ */
1148 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */
1149 FP1616 root_y;
1150 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */
1151 FP1616 event_y;
1152 FP1616 delta_x;
1153 FP1616 delta_y;
1154 FP1616 delta_unaccel_x;
1155 FP1616 delta_unaccel_y;
1156 uint16_t sourceid; /**< The source device */
1157 uint16_t pad0;
1158 xXIModifierInfo mods;
1159 xXIGroupInfo group;
1160 uint32_t flags; /**< ::XIGestureSwipeEventCancelled */
1161} xXIGestureSwipeEvent;
1162
1163#undef Window
1164#undef Time
1165#undef Atom
1166#undef Cursor
1167#undef Barrier
1168
1169#endif /* _XI2PROTO_H_ */