Merge branch 'devel/x11' into tizen
[platform/upstream/inputproto.git] / XI2proto.h
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 alingned 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 */
109 typedef int32_t FP1616;
110
111 /** Fixed point 32.32 */
112 typedef 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  */
126 typedef 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  */
143 typedef 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 num_buttons * Atom that names the buttons in the
153  * device-native setup (i.e. ignoring button mappings).
154  */
155 typedef struct {
156     uint16_t    type;           /**< Always ButtonClass */
157     uint16_t    length;         /**< Length in 4 byte units */
158     uint16_t    sourceid;       /**< source device for this class */
159     uint16_t    num_buttons;    /**< Number of buttons provided */
160 } xXIButtonInfo;
161
162 /**
163  * Denotes key capability on a device.
164  * Struct is followed by num_keys * CARD32 that lists the keycodes available
165  * on the device.
166  */
167 typedef struct {
168     uint16_t    type;           /**< Always KeyClass */
169     uint16_t    length;         /**< Length in 4 byte units */
170     uint16_t    sourceid;       /**< source device for this class */
171     uint16_t    num_keycodes;   /**< Number of keys provided */
172 } xXIKeyInfo;
173
174 /**
175  * Denotes an valuator capability on a device.
176  * One XIValuatorInfo describes exactly one valuator (axis) on the device.
177  */
178 typedef struct {
179     uint16_t    type;           /**< Always ValuatorClass       */
180     uint16_t    length;         /**< Length in 4 byte units */
181     uint16_t    sourceid;       /**< source device for this class */
182     uint16_t    number;         /**< Valuator number            */
183     Atom        label;          /**< Axis label                 */
184     FP3232      min;            /**< Min value                  */
185     FP3232      max;            /**< Max value                  */
186     FP3232      value;          /**< Last published value       */
187     uint32_t    resolution;     /**< Resolutions in units/m     */
188     uint8_t     mode;           /**< ModeRelative or ModeAbsolute */
189     uint8_t     pad1;
190     uint16_t    pad2;
191 } xXIValuatorInfo;
192
193 /***
194  * Denotes a scroll valuator on a device.
195  * One XIScrollInfo describes exactly one scroll valuator that must have a
196  * XIValuatorInfo struct.
197  */
198 typedef struct {
199     uint16_t    type;           /**< Always ValuatorClass         */
200     uint16_t    length;         /**< Length in 4 byte units       */
201     uint16_t    sourceid;       /**< source device for this class */
202     uint16_t    number;         /**< Valuator number              */
203     uint16_t    scroll_type;    /**< ::XIScrollTypeVertical, ::XIScrollTypeHorizontal */
204     uint16_t    pad0;
205     uint32_t    flags;          /**< ::XIScrollFlagEmulate, ::XIScrollFlagPreferred   */
206     FP3232      increment;      /**< Increment for one unit of scrolling              */
207 } xXIScrollInfo;
208
209 /**
210  * Denotes multitouch capability on a device.
211  */
212 typedef struct {
213     uint16_t    type;           /**< Always TouchClass */
214     uint16_t    length;         /**< Length in 4 byte units */
215     uint16_t    sourceid;       /**< source device for this class */
216     uint8_t     mode;           /**< DirectTouch or DependentTouch */
217     uint8_t     num_touches;    /**< Maximum number of touches (0==unlimited) */
218 } xXITouchInfo;
219
220 /**
221  * Used to select for events on a given window.
222  * Struct is followed by (mask_len * CARD8), with each bit set representing
223  * the event mask for the given type. A mask bit represents an event type if
224  * (mask == (1 << type)).
225  */
226 typedef struct {
227     uint16_t    deviceid;       /**< Device id to select for        */
228     uint16_t    mask_len;       /**< Length of mask in 4 byte units */
229 } xXIEventMask;
230
231 /**
232  * XKB modifier information.
233  * The effective modifier is a binary mask of base, latched, and locked
234  * modifiers.
235  */
236 typedef struct
237 {
238     uint32_t    base_mods;              /**< Logically pressed modifiers */
239     uint32_t    latched_mods;           /**< Logically latched modifiers */
240     uint32_t    locked_mods;            /**< Logically locked modifiers */
241     uint32_t    effective_mods;         /**< Effective modifiers */
242 } xXIModifierInfo;
243
244 /**
245  * XKB group information.
246  * The effective group is the mathematical sum of base, latched, and locked
247  * group after group wrapping is taken into account.
248  */
249 typedef struct
250 {
251     uint8_t     base_group;             /**< Logically "pressed" group */
252     uint8_t     latched_group;          /**< Logically latched group */
253     uint8_t     locked_group;           /**< Logically locked group */
254     uint8_t     effective_group;        /**< Effective group */
255 } xXIGroupInfo;
256
257
258 /*************************************************************************************
259  *                                                                                   *
260  *                                   REQUESTS                                        *
261  *                                                                                   *
262  *************************************************************************************/
263
264 /**
265  * Query the server for the supported X Input extension version.
266  */
267
268 typedef struct {
269     uint8_t     reqType;                /**< Input extension major code */
270     uint8_t     ReqType;                /**< Always ::X_XIQueryVersion */
271     uint16_t    length;                 /**< Length in 4 byte units */
272     uint16_t    major_version;
273     uint16_t    minor_version;
274 } xXIQueryVersionReq;
275 #define sz_xXIQueryVersionReq                     8
276
277 typedef struct {
278     uint8_t     repType;                /**< ::X_Reply */
279     uint8_t     RepType;                /**< Always ::X_XIQueryVersion */
280     uint16_t    sequenceNumber;
281     uint32_t    length;
282     uint16_t    major_version;
283     uint16_t    minor_version;
284     uint32_t    pad1;
285     uint32_t    pad2;
286     uint32_t    pad3;
287     uint32_t    pad4;
288     uint32_t    pad5;
289 } xXIQueryVersionReply;
290 #define sz_xXIQueryVersionReply             32
291
292 /**
293  * Query the server for information about a specific device or all input
294  * devices.
295  */
296 typedef struct {
297     uint8_t     reqType;                /**< Input extension major code */
298     uint8_t     ReqType;                /**< Always ::X_XIQueryDevice */
299     uint16_t    length;                 /**< Length in 4 byte units */
300     uint16_t    deviceid;
301     uint16_t    pad;
302 } xXIQueryDeviceReq;
303 #define sz_xXIQueryDeviceReq                    8
304
305 typedef struct {
306     uint8_t     repType;                /**< ::X_Reply */
307     uint8_t     RepType;                /**< Always ::X_XIQueryDevice */
308     uint16_t    sequenceNumber;
309     uint32_t    length;
310     uint16_t    num_devices;
311     uint16_t    pad0;
312     uint32_t    pad1;
313     uint32_t    pad2;
314     uint32_t    pad3;
315     uint32_t    pad4;
316     uint32_t    pad5;
317 } xXIQueryDeviceReply;
318 #define sz_xXIQueryDeviceReply                  32
319
320 /**
321  * Select for events on a given window.
322  */
323 typedef struct {
324     uint8_t     reqType;                /**< Input extension major code */
325     uint8_t     ReqType;                /**< Always ::X_XISelectEvents */
326     uint16_t    length;                 /**< Length in 4 byte units */
327     Window      win;
328     uint16_t    num_masks;
329     uint16_t    pad;
330 } xXISelectEventsReq;
331 #define sz_xXISelectEventsReq                  12
332
333 /**
334  * Query for selected events on a given window.
335  */
336 typedef struct {
337     uint8_t     reqType;                /**< Input extension major code */
338     uint8_t     ReqType;                /**< Always ::X_XIGetSelectedEvents */
339     uint16_t    length;                 /**< Length in 4 byte units */
340     Window      win;
341 } xXIGetSelectedEventsReq;
342 #define sz_xXIGetSelectedEventsReq              8
343
344 typedef struct {
345     uint8_t     repType;                /**< Input extension major opcode */
346     uint8_t     RepType;                /**< Always ::X_XIGetSelectedEvents */
347     uint16_t    sequenceNumber;
348     uint32_t    length;
349     uint16_t    num_masks;              /**< Number of xXIEventMask structs
350                                              trailing the reply */
351     uint16_t    pad0;
352     uint32_t    pad1;
353     uint32_t    pad2;
354     uint32_t    pad3;
355     uint32_t    pad4;
356     uint32_t    pad5;
357 } xXIGetSelectedEventsReply;
358 #define sz_xXIGetSelectedEventsReply            32
359
360 /**
361  * Query the given device's screen/window coordinates.
362  */
363
364 typedef struct {
365     uint8_t     reqType;                /**< Input extension major code */
366     uint8_t     ReqType;                /**< Always ::X_XIQueryPointer */
367     uint16_t    length;                 /**< Length in 4 byte units */
368     Window      win;
369     uint16_t    deviceid;
370     uint16_t    pad1;
371 } xXIQueryPointerReq;
372 #define sz_xXIQueryPointerReq                   12
373
374
375 typedef struct {
376     uint8_t     repType;                /**< Input extension major opcode */
377     uint8_t     RepType;                /**< Always ::X_XIQueryPointer */
378     uint16_t    sequenceNumber;
379     uint32_t    length;
380     Window      root;
381     Window      child;
382     FP1616      root_x;
383     FP1616      root_y;
384     FP1616      win_x;
385     FP1616      win_y;
386     uint8_t     same_screen;
387     uint8_t     pad0;
388     uint16_t    buttons_len;
389     xXIModifierInfo mods;
390     xXIGroupInfo group;
391 } xXIQueryPointerReply;
392 #define sz_xXIQueryPointerReply                 56
393
394 /**
395  * Warp the given device's pointer to the specified position.
396  */
397
398 typedef struct {
399     uint8_t     reqType;                /**< Input extension major code */
400     uint8_t     ReqType;                /**< Always ::X_XIWarpPointer   */
401     uint16_t    length;                 /**< Length in 4 byte units */
402     Window      src_win;
403     Window      dst_win;
404     FP1616      src_x;
405     FP1616      src_y;
406     uint16_t    src_width;
407     uint16_t    src_height;
408     FP1616      dst_x;
409     FP1616      dst_y;
410     uint16_t    deviceid;
411     uint16_t    pad1;
412 } xXIWarpPointerReq;
413 #define sz_xXIWarpPointerReq                    36
414
415 /**
416  * Change the given device's sprite to the given cursor.
417  */
418
419 typedef struct {
420     uint8_t     reqType;                /**< Input extension major code */
421     uint8_t     ReqType;                /**< Always ::X_XIChangeCursor  */
422     uint16_t    length;                 /**< Length in 4 byte units */
423     Window      win;
424     Cursor      cursor;
425     uint16_t    deviceid;
426     uint16_t    pad1;
427 } xXIChangeCursorReq;
428 #define sz_xXIChangeCursorReq                           16
429
430 /**
431  * Modify the device hierarchy.
432  */
433
434 typedef struct {
435     uint8_t     reqType;                /**< Input extension major code */
436     uint8_t     ReqType;                /**< Always ::X_XIChangeHierarchy */
437     uint16_t    length;                 /**< Length in 4 byte units */
438     uint8_t     num_changes;
439     uint8_t     pad0;
440     uint16_t    pad1;
441 } xXIChangeHierarchyReq;
442 #define sz_xXIChangeHierarchyReq                        8
443
444 /**
445  * Generic header for any hierarchy change.
446  */
447 typedef struct {
448     uint16_t    type;
449     uint16_t    length;                 /**< Length in 4 byte units */
450 } xXIAnyHierarchyChangeInfo;
451
452 /**
453  * Create a new master device.
454  * Name of new master follows struct (4-byte padded)
455  */
456 typedef struct {
457     uint16_t    type;                   /**< Always ::XIAddMaster */
458     uint16_t    length;                 /**< 2 + (namelen + padding)/4 */
459     uint16_t    name_len;
460     uint8_t     send_core;
461     uint8_t     enable;
462 } xXIAddMasterInfo;
463
464 /**
465  * Delete a master device. Will automatically delete the master device paired
466  * with the given master device.
467  */
468 typedef struct {
469     uint16_t    type;            /**< Always ::XIRemoveMaster */
470     uint16_t    length;          /**< 3 */
471     uint16_t    deviceid;
472     uint8_t     return_mode;     /**< ::XIAttachToMaster, ::XIFloating */
473     uint8_t     pad;
474     uint16_t    return_pointer;  /**< Pointer to attach slave ptr devices to */
475     uint16_t    return_keyboard; /**< keyboard to attach slave keybd devices to*/
476 } xXIRemoveMasterInfo;
477
478 /**
479  * Attach an SD to a new device.
480  * NewMaster has to be of same type (pointer->pointer, keyboard->keyboard);
481  */
482 typedef struct {
483     uint16_t    type;           /**< Always ::XIAttachSlave */
484     uint16_t    length;         /**< 2 */
485     uint16_t    deviceid;
486     uint16_t    new_master;     /**< id of new master device */
487 } xXIAttachSlaveInfo;
488
489 /**
490  * Detach an SD from its current master device.
491  */
492 typedef struct {
493     uint16_t    type;           /**< Always ::XIDetachSlave */
494     uint16_t    length;         /**< 2 */
495     uint16_t    deviceid;
496     uint16_t    pad;
497 } xXIDetachSlaveInfo;
498
499
500 /**
501  * Set the window/client's ClientPointer.
502  */
503 typedef struct {
504     uint8_t     reqType;
505     uint8_t     ReqType;                /**< Always ::X_XISetClientPointer */
506     uint16_t    length;                 /**< Length in 4 byte units */
507     Window      win;
508     uint16_t    deviceid;
509     uint16_t    pad1;
510 } xXISetClientPointerReq;
511 #define sz_xXISetClientPointerReq                 12
512
513 /**
514  * Query the given window/client's ClientPointer setting.
515  */
516 typedef struct {
517     uint8_t     reqType;
518     uint8_t     ReqType;                /**< Always ::X_GetClientPointer */
519     uint16_t    length;                 /**< Length in 4 byte units */
520     Window      win;
521 } xXIGetClientPointerReq;
522 #define sz_xXIGetClientPointerReq                 8
523
524 typedef struct {
525     uint8_t     repType;                /**< Input extension major opcode */
526     uint8_t     RepType;                /**< Always ::X_GetClientPointer */
527     uint16_t    sequenceNumber;
528     uint32_t    length;
529     BOOL        set;                    /**< client pointer is set? */
530     uint8_t     pad0;
531     uint16_t    deviceid;
532     uint32_t    pad1;
533     uint32_t    pad2;
534     uint32_t    pad3;
535     uint32_t    pad4;
536     uint32_t    pad5;
537 } xXIGetClientPointerReply;
538 #define sz_xXIGetClientPointerReply               32
539
540 /**
541  * Set the input focus to the specified window.
542  */
543 typedef struct {
544     uint8_t     reqType;
545     uint8_t     ReqType;                /**< Always ::X_XISetFocus */
546     uint16_t    length;                 /**< Length in 4 byte units */
547     Window      focus;
548     Time        time;
549     uint16_t    deviceid;
550     uint16_t    pad0;
551 } xXISetFocusReq;
552 #define sz_xXISetFocusReq                       16
553
554 /**
555  * Query the current input focus.
556  */
557 typedef struct {
558     uint8_t     reqType;
559     uint8_t     ReqType;                /**< Always ::X_XIGetDeviceFocus */
560     uint16_t    length;                 /**< Length in 4 byte units */
561     uint16_t    deviceid;
562     uint16_t    pad0;
563 } xXIGetFocusReq;
564 #define sz_xXIGetFocusReq                       8
565
566 typedef struct {
567     uint8_t     repType;                /**< Input extension major opcode */
568     uint8_t     RepType;                /**< Always ::X_XIGetFocus */
569     uint16_t    sequenceNumber;
570     uint32_t    length;
571     Window      focus;
572     uint32_t    pad1;
573     uint32_t    pad2;
574     uint32_t    pad3;
575     uint32_t    pad4;
576     uint32_t    pad5;
577 } xXIGetFocusReply;
578 #define sz_xXIGetFocusReply                     32
579
580
581 /**
582  * Grab the given device.
583  */
584 typedef struct {
585     uint8_t     reqType;
586     uint8_t     ReqType;                /**< Always ::X_XIGrabDevice */
587     uint16_t    length;                 /**< Length in 4 byte units */
588     Window      grab_window;
589     Time        time;
590     Cursor      cursor;
591     uint16_t    deviceid;
592     uint8_t     grab_mode;
593     uint8_t     paired_device_mode;
594     uint8_t     owner_events;
595     uint8_t     pad;
596     uint16_t    mask_len;
597 } xXIGrabDeviceReq;
598 #define sz_xXIGrabDeviceReq                     24
599
600 /**
601  * Return codes from a XIPassiveGrabDevice request.
602  */
603 typedef struct {
604     uint32_t    modifiers;              /**< Modifier state */
605     uint8_t     status;                 /**< Grab status code */
606     uint8_t     pad0;
607     uint16_t    pad1;
608 } xXIGrabModifierInfo;
609
610 typedef struct {
611     uint8_t     repType;                /**< Input extension major opcode */
612     uint8_t     RepType;                /**< Always ::X_XIGrabDevice */
613     uint16_t    sequenceNumber;
614     uint32_t    length;
615     uint8_t     status;
616     uint8_t     pad0;
617     uint16_t    pad1;
618     uint32_t    pad2;
619     uint32_t    pad3;
620     uint32_t    pad4;
621     uint32_t    pad5;
622     uint32_t    pad6;
623 } xXIGrabDeviceReply;
624 #define sz_xXIGrabDeviceReply                  32
625
626 /**
627  * Ungrab the specified device.
628  *
629  */
630 typedef struct {
631     uint8_t     reqType;
632     uint8_t     ReqType;                /**< Always ::X_XIUngrabDevice */
633     uint16_t    length;                 /**< Length in 4 byte units */
634     Time        time;
635     uint16_t    deviceid;
636     uint16_t    pad;
637 } xXIUngrabDeviceReq;
638 #define sz_xXIUngrabDeviceReq                   12
639
640
641 /**
642  * Allow or replay events on the specified grabbed device.
643  */
644 typedef struct {
645     uint8_t     reqType;
646     uint8_t     ReqType;                /**< Always ::X_XIAllowEvents */
647     uint16_t    length;                 /**< Length in 4 byte units */
648     Time        time;
649     uint16_t    deviceid;
650     uint8_t     mode;
651     uint8_t     pad;
652 } xXIAllowEventsReq;
653 #define sz_xXIAllowEventsReq                   12
654
655 /**
656  * Allow or replay events on the specified grabbed device.
657  * Since XI 2.2
658  */
659 typedef struct {
660     uint8_t     reqType;
661     uint8_t     ReqType;                /**< Always ::X_XIAllowEvents */
662     uint16_t    length;                 /**< Length in 4 byte units */
663     Time        time;
664     uint16_t    deviceid;
665     uint8_t     mode;
666     uint8_t     pad;
667     uint32_t    touchid;                /**< Since XI 2.2 */
668     Window      grab_window;            /**< Since XI 2.2 */
669 } xXI2_2AllowEventsReq;
670 #define sz_xXI2_2AllowEventsReq                20
671
672
673 /**
674  * Passively grab the device.
675  */
676 typedef struct {
677     uint8_t     reqType;
678     uint8_t     ReqType;                /**< Always ::X_XIPassiveGrabDevice */
679     uint16_t    length;                 /**< Length in 4 byte units */
680     Time        time;
681     Window      grab_window;
682     Cursor      cursor;
683     uint32_t    detail;
684     uint16_t    deviceid;
685     uint16_t    num_modifiers;
686     uint16_t    mask_len;
687     uint8_t     grab_type;
688     uint8_t     grab_mode;
689     uint8_t     paired_device_mode;
690     uint8_t     owner_events;
691     uint16_t    pad1;
692 } xXIPassiveGrabDeviceReq;
693 #define sz_xXIPassiveGrabDeviceReq              32
694
695 typedef struct {
696     uint8_t     repType;                /**< Input extension major opcode */
697     uint8_t     RepType;                /**< Always ::X_XIPassiveGrabDevice */
698     uint16_t    sequenceNumber;
699     uint32_t    length;
700     uint16_t    num_modifiers;
701     uint16_t    pad1;
702     uint32_t    pad2;
703     uint32_t    pad3;
704     uint32_t    pad4;
705     uint32_t    pad5;
706     uint32_t    pad6;
707 } xXIPassiveGrabDeviceReply;
708 #define sz_xXIPassiveGrabDeviceReply            32
709
710 /**
711  * Delete a passive grab for the given device.
712  */
713 typedef struct {
714     uint8_t     reqType;
715     uint8_t     ReqType;                /**< Always ::X_XIPassiveUngrabDevice */
716     uint16_t    length;                 /**< Length in 4 byte units */
717     Window      grab_window;
718     uint32_t    detail;
719     uint16_t    deviceid;
720     uint16_t    num_modifiers;
721     uint8_t     grab_type;
722     uint8_t     pad0;
723     uint16_t    pad1;
724 } xXIPassiveUngrabDeviceReq;
725 #define sz_xXIPassiveUngrabDeviceReq            20
726
727 /**
728  * List all device properties on the specified device.
729  */
730 typedef struct {
731     uint8_t     reqType;
732     uint8_t     ReqType;                /**< Always ::X_XIListProperties */
733     uint16_t    length;                 /**< Length in 4 byte units */
734     uint16_t    deviceid;
735     uint16_t    pad;
736 } xXIListPropertiesReq;
737 #define sz_xXIListPropertiesReq                 8
738
739 typedef struct {
740     uint8_t     repType;                /**< Input extension major opcode */
741     uint8_t     RepType;                /**< Always ::X_XIListProperties */
742     uint16_t    sequenceNumber;
743     uint32_t    length;
744     uint16_t    num_properties;
745     uint16_t    pad0;
746     uint32_t    pad1;
747     uint32_t    pad2;
748     uint32_t    pad3;
749     uint32_t    pad4;
750     uint32_t    pad5;
751 } xXIListPropertiesReply;
752 #define sz_xXIListPropertiesReply               32
753
754 /**
755  * Change a property on the specified device.
756  */
757 typedef struct {
758     uint8_t     reqType;
759     uint8_t     ReqType;                /**< Always ::X_XIChangeProperty */
760     uint16_t    length;                 /**< Length in 4 byte units */
761     uint16_t    deviceid;
762     uint8_t     mode;
763     uint8_t     format;
764     Atom        property;
765     Atom        type;
766     uint32_t    num_items;
767 } xXIChangePropertyReq;
768 #define sz_xXIChangePropertyReq                 20
769
770 /**
771  * Delete the specified property.
772  */
773 typedef struct {
774     uint8_t     reqType;
775     uint8_t     ReqType;                /**< Always X_XIDeleteProperty */
776     uint16_t    length;                 /**< Length in 4 byte units */
777     uint16_t    deviceid;
778     uint16_t    pad0;
779     Atom        property;
780 } xXIDeletePropertyReq;
781 #define sz_xXIDeletePropertyReq                 12
782
783 /**
784  * Query the specified property's values.
785  */
786 typedef struct {
787     uint8_t     reqType;
788     uint8_t     ReqType;                /**< Always X_XIGetProperty */
789     uint16_t    length;                 /**< Length in 4 byte units */
790     uint16_t    deviceid;
791 #if defined(__cplusplus) || defined(c_plusplus)
792     uint8_t     c_delete;
793 #else
794     uint8_t     delete;
795 #endif
796     uint8_t     pad0;
797     Atom        property;
798     Atom        type;
799     uint32_t    offset;
800     uint32_t    len;
801 } xXIGetPropertyReq;
802 #define sz_xXIGetPropertyReq                    24
803
804 typedef struct {
805     uint8_t     repType;                /**< Input extension major opcode */
806     uint8_t     RepType;                /**< Always X_XIGetProperty */
807     uint16_t    sequenceNumber;
808     uint32_t    length;
809     Atom        type;
810     uint32_t    bytes_after;
811     uint32_t    num_items;
812     uint8_t     format;
813     uint8_t     pad0;
814     uint16_t    pad1;
815     uint32_t    pad2;
816     uint32_t    pad3;
817 } xXIGetPropertyReply;
818 #define sz_xXIGetPropertyReply               32
819
820 typedef struct {
821     uint16_t    deviceid;
822     uint16_t    pad;
823     Barrier     barrier;
824     uint32_t    eventid;
825 } xXIBarrierReleasePointerInfo;
826
827 typedef struct {
828     uint8_t     reqType;                /**< Input extension major opcode */
829     uint8_t     ReqType;                /**< Always X_XIBarrierReleasePointer */
830     uint16_t    length;
831     uint32_t    num_barriers;
832     /* array of xXIBarrierReleasePointerInfo */
833 } xXIBarrierReleasePointerReq;
834 #define sz_xXIBarrierReleasePointerReq       8
835
836 /*************************************************************************************
837  *                                                                                   *
838  *                                      EVENTS                                       *
839  *                                                                                   *
840  *************************************************************************************/
841
842 /**
843  * Generic XI2 event header. All XI2 events use the same header.
844  */
845 typedef struct
846 {
847     uint8_t     type;
848     uint8_t     extension;              /**< XI extension offset */
849     uint16_t    sequenceNumber;
850     uint32_t    length;
851     uint16_t    evtype;
852     uint16_t    deviceid;
853     Time        time;
854 } xXIGenericDeviceEvent;
855
856 /**
857  * Device hierarchy information.
858  */
859 typedef struct
860 {
861     uint16_t    deviceid;
862     uint16_t    attachment;             /**< ID of master or paired device */
863     uint8_t     use;                    /**< ::XIMasterKeyboard,
864                                              ::XIMasterPointer,
865                                              ::XISlaveKeyboard,
866                                              ::XISlavePointer,
867                                              ::XIFloatingSlave */
868     BOOL        enabled;                /**< TRUE if the device is enabled */
869     uint16_t    pad;
870     uint32_t    flags;                  /**< ::XIMasterAdded, ::XIMasterRemoved,
871                                              ::XISlaveAttached, ::XISlaveDetached,
872                                              ::XISlaveAdded, ::XISlaveRemoved,
873                                              ::XIDeviceEnabled, ::XIDeviceDisabled */
874 } xXIHierarchyInfo;
875
876 /**
877  * The device hierarchy has been modified. This event includes the device
878  * hierarchy after the modification has been applied.
879  */
880 typedef struct
881 {
882     uint8_t     type;                   /**< Always GenericEvent */
883     uint8_t     extension;              /**< XI extension offset */
884     uint16_t    sequenceNumber;
885     uint32_t    length;                 /**< Length in 4 byte units */
886     uint16_t    evtype;                 /**< ::XI_Hierarchy */
887     uint16_t    deviceid;
888     Time        time;
889     uint32_t    flags;                  /**< ::XIMasterAdded, ::XIMasterDeleted,
890                                              ::XISlaveAttached, ::XISlaveDetached,
891                                              ::XISlaveAdded, ::XISlaveRemoved,
892                                              ::XIDeviceEnabled, ::XIDeviceDisabled */
893     uint16_t    num_info;
894     uint16_t    pad0;
895     uint32_t    pad1;
896     uint32_t    pad2;
897 } xXIHierarchyEvent;
898
899 /**
900  * A device has changed capabilities.
901  */
902 typedef struct
903 {
904     uint8_t     type;                   /**< Always GenericEvent */
905     uint8_t     extension;              /**< XI extension offset */
906     uint16_t    sequenceNumber;
907     uint32_t    length;                 /**< Length in 4 byte units */
908     uint16_t    evtype;                 /**< XI_DeviceChanged */
909     uint16_t    deviceid;               /**< Device that has changed */
910     Time        time;
911     uint16_t    num_classes;            /**< Number of classes that have changed */
912     uint16_t    sourceid;               /**< Source of the new classes */
913     uint8_t     reason;                 /**< ::XISlaveSwitch, ::XIDeviceChange */
914     uint8_t     pad0;
915     uint16_t    pad1;
916     uint32_t    pad2;
917     uint32_t    pad3;
918 } xXIDeviceChangedEvent;
919
920 /**
921  * The owner of a touch stream has passed on ownership to another client.
922  */
923 typedef struct
924 {
925     uint8_t     type;               /**< Always GenericEvent */
926     uint8_t     extension;          /**< XI extension offset */
927     uint16_t    sequenceNumber;
928     uint32_t    length;             /**< Length in 4 byte units */
929     uint16_t    evtype;             /**< XI_TouchOwnership */
930     uint16_t    deviceid;           /**< Device that has changed */
931     Time        time;
932     uint32_t    touchid;
933     Window      root;
934     Window      event;
935     Window      child;
936 /* └──────── 32 byte boundary ────────┘ */
937     uint16_t    sourceid;
938     uint16_t    pad0;
939     uint32_t    flags;
940     uint32_t    pad1;
941     uint32_t    pad2;
942 } xXITouchOwnershipEvent;
943
944 /**
945  * Default input event for pointer, keyboard or touch input.
946  */
947 typedef struct
948 {
949     uint8_t     type;                   /**< Always GenericEvent */
950     uint8_t     extension;              /**< XI extension offset */
951     uint16_t    sequenceNumber;
952     uint32_t    length;                 /**< Length in 4 byte uints */
953     uint16_t    evtype;
954     uint16_t    deviceid;
955     Time        time;
956     uint32_t    detail;                 /**< Keycode or button */
957     Window      root;
958     Window      event;
959     Window      child;
960 /* └──────── 32 byte boundary ────────┘ */
961     FP1616      root_x;                 /**< Always screen coords, 16.16 fixed point */
962     FP1616      root_y;
963     FP1616      event_x;                /**< Always screen coords, 16.16 fixed point */
964     FP1616      event_y;
965     uint16_t    buttons_len;            /**< Len of button flags in 4 b units */
966     uint16_t    valuators_len;          /**< Len of val. flags in 4 b units */
967     uint16_t    sourceid;               /**< The source device */
968     uint16_t    pad0;
969     uint32_t    flags;                  /**< ::XIKeyRepeat */
970     xXIModifierInfo     mods;
971     xXIGroupInfo        group;
972 } xXIDeviceEvent;
973
974
975 /**
976  * Sent when an input event is generated. RawEvents include valuator
977  * information in both device-specific data (i.e. unaccelerated) and
978  * processed data (i.e. accelerated, if applicable).
979  */
980 typedef struct
981 {
982     uint8_t     type;                   /**< Always GenericEvent */
983     uint8_t     extension;              /**< XI extension offset */
984     uint16_t    sequenceNumber;
985     uint32_t    length;                 /**< Length in 4 byte uints */
986     uint16_t    evtype;                 /**< ::XI_RawEvent */
987     uint16_t    deviceid;
988     Time        time;
989     uint32_t    detail;
990     uint16_t    sourceid;               /**< The source device (XI 2.1) */
991     uint16_t    valuators_len;          /**< Length of trailing valuator
992                                              mask in 4 byte units */
993     uint32_t    flags;                  /**< ::XIKeyRepeat */
994     uint32_t    pad2;
995 } xXIRawEvent;
996
997 /**
998  * Note that the layout of root, event, child, root_x, root_y, event_x,
999  * event_y must be identical to the xXIDeviceEvent.
1000  */
1001 typedef struct
1002 {
1003     uint8_t     type;                   /**< Always GenericEvent */
1004     uint8_t     extension;              /**< XI extension offset */
1005     uint16_t    sequenceNumber;
1006     uint32_t    length;                 /**< Length in 4 byte uints */
1007     uint16_t    evtype;                 /**< ::XI_Enter */
1008     uint16_t    deviceid;
1009     Time        time;
1010     uint16_t    sourceid;
1011     uint8_t     mode;
1012     uint8_t     detail;
1013     Window      root;
1014     Window      event;
1015     Window      child;
1016 /* └──────── 32 byte boundary ────────┘ */
1017     FP1616      root_x;
1018     FP1616      root_y;
1019     FP1616      event_x;
1020     FP1616      event_y;
1021     BOOL        same_screen;
1022     BOOL        focus;
1023     uint16_t    buttons_len;            /**< Length of trailing button mask
1024                                              in 4 byte units */
1025     xXIModifierInfo     mods;
1026     xXIGroupInfo        group;
1027 } xXIEnterEvent;
1028
1029 typedef xXIEnterEvent xXILeaveEvent;
1030 typedef xXIEnterEvent xXIFocusInEvent;
1031 typedef xXIEnterEvent xXIFocusOutEvent;
1032
1033 /**
1034  * Sent when a device property is created, modified or deleted. Does not
1035  * include property data, the client is required to query the data.
1036  */
1037 typedef struct
1038 {
1039     uint8_t     type;                   /**< Always GenericEvent */
1040     uint8_t     extension;              /**< XI extension offset */
1041     uint16_t    sequenceNumber;
1042     uint32_t    length;                 /**< Length in 4 byte units */
1043     uint16_t    evtype;                 /**< ::XI_PropertyEvent */
1044     uint16_t    deviceid;
1045     Time        time;
1046     Atom        property;
1047     uint8_t     what;                   /**< ::XIPropertyDeleted,
1048                                              ::XIPropertyCreated,
1049                                              ::XIPropertyMotified */
1050     uint8_t     pad0;
1051     uint16_t    pad1;
1052     uint32_t    pad2;
1053     uint32_t    pad3;
1054 } xXIPropertyEvent;
1055
1056 typedef struct
1057 {
1058     uint8_t     type;                   /**< Always GenericEvent */
1059     uint8_t     extension;              /**< XI extension offset */
1060     uint16_t    sequenceNumber;
1061     uint32_t    length;                 /**< Length in 4 byte units */
1062     uint16_t    evtype;                 /**< ::XI_BarrierHit or ::XI_BarrierLeave */
1063     uint16_t    deviceid;
1064     Time        time;
1065     uint32_t    eventid;
1066     Window      root;
1067     Window      event;
1068     Barrier     barrier;
1069 /* └──────── 32 byte boundary ────────┘ */
1070     uint32_t    dtime;
1071     uint32_t    flags;                  /**< ::XIBarrierPointerReleased
1072                                              ::XIBarrierDeviceIsGrabbed */
1073     uint16_t    sourceid;
1074     int16_t     pad;
1075     FP1616      root_x;
1076     FP1616      root_y;
1077     FP3232      dx;
1078     FP3232      dy;
1079 } xXIBarrierEvent;
1080
1081 typedef xXIBarrierEvent xXIBarrierHitEvent;
1082 typedef xXIBarrierEvent xXIBarrierPointerReleasedEvent;
1083 typedef xXIBarrierEvent xXIBarrierLeaveEvent;
1084
1085 #undef Window
1086 #undef Time
1087 #undef Atom
1088 #undef Cursor
1089 #undef Barrier
1090
1091 #endif /* _XI2PROTO_H_ */