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 /* Definitions used by the library and client */
26 
27 #ifndef _XINPUT2_H_
28 #define _XINPUT2_H_
29 
30 #include <X11/Xlib.h>
31 #include <X11/extensions/XI2.h>
32 #include <X11/extensions/Xge.h>
33 #include <X11/extensions/Xfixes.h> /* PointerBarrier */
34 
35 /*******************************************************************
36  *
37  */
38 typedef struct {
39     int                 type;
40     char*               name;
41     Bool                send_core;
42     Bool                enable;
43 } XIAddMasterInfo;
44 
45 typedef struct {
46     int                 type;
47     int                 deviceid;
48     int                 return_mode; /* AttachToMaster, Floating */
49     int                 return_pointer;
50     int                 return_keyboard;
51 } XIRemoveMasterInfo;
52 
53 typedef struct {
54     int                 type;
55     int                 deviceid;
56     int                 new_master;
57 } XIAttachSlaveInfo;
58 
59 typedef struct {
60     int                 type;
61     int                 deviceid;
62 } XIDetachSlaveInfo;
63 
64 typedef union {
65     int                   type; /* must be first element */
66     XIAddMasterInfo       add;
67     XIRemoveMasterInfo    remove;
68     XIAttachSlaveInfo     attach;
69     XIDetachSlaveInfo     detach;
70 } XIAnyHierarchyChangeInfo;
71 
72 typedef struct
73 {
74     int    base;
75     int    latched;
76     int    locked;
77     int    effective;
78 } XIModifierState;
79 
80 typedef XIModifierState XIGroupState;
81 
82 typedef struct {
83     int           mask_len;
84     unsigned char *mask;
85 } XIButtonState;
86 
87 typedef struct {
88     int           mask_len;
89     unsigned char *mask;
90     double        *values;
91 } XIValuatorState;
92 
93 
94 typedef struct
95 {
96     int                 deviceid;
97     int                 mask_len;
98     unsigned char*      mask;
99 } XIEventMask;
100 
101 typedef struct
102 {
103     int         type;
104     int         sourceid;
105 } XIAnyClassInfo;
106 
107 typedef struct
108 {
109     int         type;
110     int         sourceid;
111     int         num_buttons;
112     Atom        *labels;
113     XIButtonState state;
114 } XIButtonClassInfo;
115 
116 typedef struct
117 {
118     int         type;
119     int         sourceid;
120     int         num_keycodes;
121     int         *keycodes;
122 } XIKeyClassInfo;
123 
124 typedef struct
125 {
126     int         type;
127     int         sourceid;
128     int         number;
129     Atom        label;
130     double      min;
131     double      max;
132     double      value;
133     int         resolution;
134     int         mode;
135 } XIValuatorClassInfo;
136 
137 /* new in XI 2.1 */
138 typedef struct
139 {
140     int         type;
141     int         sourceid;
142     int         number;
143     int         scroll_type;
144     double      increment;
145     int         flags;
146 } XIScrollClassInfo;
147 
148 typedef struct
149 {
150     int         type;
151     int         sourceid;
152     int         mode;
153     int         num_touches;
154 } XITouchClassInfo;
155 
156 /* new in XI 2.4 */
157 typedef struct
158 {
159     int         type;
160     int         sourceid;
161     int         num_touches;
162 } XIGestureClassInfo;
163 
164 typedef struct
165 {
166     int                 deviceid;
167     char                *name;
168     int                 use;
169     int                 attachment;
170     Bool                enabled;
171     int                 num_classes;
172     XIAnyClassInfo      **classes;
173 } XIDeviceInfo;
174 
175 typedef struct
176 {
177     int                 modifiers;
178     int                 status;
179 } XIGrabModifiers;
180 
181 typedef unsigned int BarrierEventID;
182 
183 typedef struct
184 {
185     int                 deviceid;
186     PointerBarrier      barrier;
187     BarrierEventID      eventid;
188 } XIBarrierReleasePointerInfo;
189 
190 /**
191  * Generic XI2 event. All XI2 events have the same header.
192  */
193 typedef struct {
194     int           type;         /* GenericEvent */
195     unsigned long serial;       /* # of last request processed by server */
196     Bool          send_event;   /* true if this came from a SendEvent request */
197     Display       *display;     /* Display the event was read from */
198     int           extension;    /* XI extension offset */
199     int           evtype;
200     Time          time;
201 } XIEvent;
202 
203 
204 typedef struct {
205     int           deviceid;
206     int           attachment;
207     int           use;
208     Bool          enabled;
209     int           flags;
210 } XIHierarchyInfo;
211 
212 /*
213  * Notifies the client that the device hierarchy has been changed. The client
214  * is expected to re-query the server for the device hierarchy.
215  */
216 typedef struct {
217     int           type;         /* GenericEvent */
218     unsigned long serial;       /* # of last request processed by server */
219     Bool          send_event;   /* true if this came from a SendEvent request */
220     Display       *display;     /* Display the event was read from */
221     int           extension;    /* XI extension offset */
222     int           evtype;       /* XI_HierarchyChanged */
223     Time          time;
224     int           flags;
225     int           num_info;
226     XIHierarchyInfo *info;
227 } XIHierarchyEvent;
228 
229 /*
230  * Notifies the client that the classes have been changed. This happens when
231  * the slave device that sends through the master changes.
232  */
233 typedef struct {
234     int           type;         /* GenericEvent */
235     unsigned long serial;       /* # of last request processed by server */
236     Bool          send_event;   /* true if this came from a SendEvent request */
237     Display       *display;     /* Display the event was read from */
238     int           extension;    /* XI extension offset */
239     int           evtype;       /* XI_DeviceChanged */
240     Time          time;
241     int           deviceid;     /* id of the device that changed */
242     int           sourceid;     /* Source for the new classes. */
243     int           reason;       /* Reason for the change */
244     int           num_classes;
245     XIAnyClassInfo **classes; /* same as in XIDeviceInfo */
246 } XIDeviceChangedEvent;
247 
248 typedef struct {
249     int           type;         /* GenericEvent */
250     unsigned long serial;       /* # of last request processed by server */
251     Bool          send_event;   /* true if this came from a SendEvent request */
252     Display       *display;     /* Display the event was read from */
253     int           extension;    /* XI extension offset */
254     int           evtype;
255     Time          time;
256     int           deviceid;
257     int           sourceid;
258     int           detail;
259     Window        root;
260     Window        event;
261     Window        child;
262     double        root_x;
263     double        root_y;
264     double        event_x;
265     double        event_y;
266     int           flags;
267     XIButtonState       buttons;
268     XIValuatorState     valuators;
269     XIModifierState     mods;
270     XIGroupState        group;
271 } XIDeviceEvent;
272 
273 typedef struct {
274     int           type;         /* GenericEvent */
275     unsigned long serial;       /* # of last request processed by server */
276     Bool          send_event;   /* true if this came from a SendEvent request */
277     Display       *display;     /* Display the event was read from */
278     int           extension;    /* XI extension offset */
279     int           evtype;       /* XI_RawKeyPress, XI_RawKeyRelease, etc. */
280     Time          time;
281     int           deviceid;
282     int           sourceid;     /* Bug: Always 0. https://bugs.freedesktop.org//show_bug.cgi?id=34240 */
283     int           detail;
284     int           flags;
285     XIValuatorState valuators;
286     double        *raw_values;
287 } XIRawEvent;
288 
289 typedef struct {
290     int           type;         /* GenericEvent */
291     unsigned long serial;       /* # of last request processed by server */
292     Bool          send_event;   /* true if this came from a SendEvent request */
293     Display       *display;     /* Display the event was read from */
294     int           extension;    /* XI extension offset */
295     int           evtype;
296     Time          time;
297     int           deviceid;
298     int           sourceid;
299     int           detail;
300     Window        root;
301     Window        event;
302     Window        child;
303     double        root_x;
304     double        root_y;
305     double        event_x;
306     double        event_y;
307     int           mode;
308     Bool          focus;
309     Bool          same_screen;
310     XIButtonState       buttons;
311     XIModifierState     mods;
312     XIGroupState        group;
313 } XIEnterEvent;
314 
315 typedef XIEnterEvent XILeaveEvent;
316 typedef XIEnterEvent XIFocusInEvent;
317 typedef XIEnterEvent XIFocusOutEvent;
318 
319 typedef struct {
320     int           type;         /* GenericEvent */
321     unsigned long serial;       /* # of last request processed by server */
322     Bool          send_event;   /* true if this came from a SendEvent request */
323     Display       *display;     /* Display the event was read from */
324     int           extension;    /* XI extension offset */
325     int           evtype;       /* XI_PropertyEvent */
326     Time          time;
327     int           deviceid;     /* id of the device that changed */
328     Atom          property;
329     int           what;
330 } XIPropertyEvent;
331 
332 typedef struct {
333     int           type;         /* GenericEvent */
334     unsigned long serial;       /* # of last request processed by server */
335     Bool          send_event;   /* true if this came from a SendEvent request */
336     Display       *display;     /* Display the event was read from */
337     int           extension;    /* XI extension offset */
338     int           evtype;
339     Time          time;
340     int           deviceid;
341     int           sourceid;
342     unsigned int  touchid;
343     Window        root;
344     Window        event;
345     Window        child;
346     int           flags;
347 } XITouchOwnershipEvent;
348 
349 typedef struct {
350     int           type;         /* GenericEvent */
351     unsigned long serial;       /* # of last request processed by server */
352     Bool          send_event;   /* true if this came from a SendEvent request */
353     Display       *display;     /* Display the event was read from */
354     int           extension;    /* XI extension offset */
355     int           evtype;
356     Time          time;
357     int           deviceid;
358     int           sourceid;
359     Window        event;
360     Window        root;
361     double        root_x;
362     double        root_y;
363     double        dx;
364     double        dy;
365     int           dtime;
366     int           flags;
367     PointerBarrier barrier;
368     BarrierEventID eventid;
369 } XIBarrierEvent;
370 
371 typedef struct {
372     int           type;         /* GenericEvent */
373     unsigned long serial;       /* # of last request processed by server */
374     Bool          send_event;   /* true if this came from a SendEvent request */
375     Display       *display;     /* Display the event was read from */
376     int           extension;    /* XI extension offset */
377     int           evtype;
378     Time          time;
379     int           deviceid;
380     int           sourceid;
381     int           detail;
382     Window        root;
383     Window        event;
384     Window        child;
385     double        root_x;
386     double        root_y;
387     double        event_x;
388     double        event_y;
389     double        delta_x;
390     double        delta_y;
391     double        delta_unaccel_x;
392     double        delta_unaccel_y;
393     double        scale;
394     double        delta_angle;
395     int           flags;
396     XIModifierState     mods;
397     XIGroupState        group;
398 } XIGesturePinchEvent;
399 
400 typedef struct {
401     int           type;         /* GenericEvent */
402     unsigned long serial;       /* # of last request processed by server */
403     Bool          send_event;   /* true if this came from a SendEvent request */
404     Display       *display;     /* Display the event was read from */
405     int           extension;    /* XI extension offset */
406     int           evtype;
407     Time          time;
408     int           deviceid;
409     int           sourceid;
410     int           detail;
411     Window        root;
412     Window        event;
413     Window        child;
414     double        root_x;
415     double        root_y;
416     double        event_x;
417     double        event_y;
418     double        delta_x;
419     double        delta_y;
420     double        delta_unaccel_x;
421     double        delta_unaccel_y;
422     int           flags;
423     XIModifierState     mods;
424     XIGroupState        group;
425 } XIGestureSwipeEvent;
426 
427 _XFUNCPROTOBEGIN
428 
429 extern Bool     XIQueryPointer(
430     Display*            display,
431     int                 deviceid,
432     Window              win,
433     Window*             root,
434     Window*             child,
435     double*             root_x,
436     double*             root_y,
437     double*             win_x,
438     double*             win_y,
439     XIButtonState       *buttons,
440     XIModifierState     *mods,
441     XIGroupState        *group
442 );
443 
444 extern Bool     XIWarpPointer(
445     Display*            display,
446     int                 deviceid,
447     Window              src_win,
448     Window              dst_win,
449     double              src_x,
450     double              src_y,
451     unsigned int        src_width,
452     unsigned int        src_height,
453     double              dst_x,
454     double              dst_y
455 );
456 
457 extern Status   XIDefineCursor(
458     Display*            display,
459     int                 deviceid,
460     Window              win,
461     Cursor              cursor
462 );
463 
464 extern Status   XIUndefineCursor(
465     Display*            display,
466     int                 deviceid,
467     Window              win
468 );
469 
470 extern Status   XIChangeHierarchy(
471     Display*            display,
472     XIAnyHierarchyChangeInfo*  changes,
473     int                 num_changes
474 );
475 
476 extern Status   XISetClientPointer(
477     Display*            dpy,
478     Window              win,
479     int                 deviceid
480 );
481 
482 extern Bool     XIGetClientPointer(
483     Display*            dpy,
484     Window              win,
485     int*                deviceid
486 );
487 
488 extern int      XISelectEvents(
489      Display*            dpy,
490      Window              win,
491      XIEventMask         *masks,
492      int                 num_masks
493 );
494 
495 extern XIEventMask *XIGetSelectedEvents(
496      Display*            dpy,
497      Window              win,
498      int                 *num_masks_return
499 );
500 
501 extern Status XIQueryVersion(
502      Display*           dpy,
503      int*               major_version_inout,
504      int*               minor_version_inout
505 );
506 
507 extern XIDeviceInfo* XIQueryDevice(
508      Display*           dpy,
509      int                deviceid,
510      int*               ndevices_return
511 );
512 
513 extern Status XISetFocus(
514      Display*           dpy,
515      int                deviceid,
516      Window             focus,
517      Time               time
518 );
519 
520 extern Status XIGetFocus(
521      Display*           dpy,
522      int                deviceid,
523      Window             *focus_return);
524 
525 extern Status XIGrabDevice(
526      Display*           dpy,
527      int                deviceid,
528      Window             grab_window,
529      Time               time,
530      Cursor             cursor,
531      int                grab_mode,
532      int                paired_device_mode,
533      Bool               owner_events,
534      XIEventMask        *mask
535 );
536 
537 extern Status XIUngrabDevice(
538      Display*           dpy,
539      int                deviceid,
540      Time               time
541 );
542 
543 extern Status XIAllowEvents(
544     Display*            display,
545     int                 deviceid,
546     int                 event_mode,
547     Time                time
548 );
549 
550 extern Status XIAllowTouchEvents(
551     Display*            display,
552     int                 deviceid,
553     unsigned int        touchid,
554     Window              grab_window,
555     int                 event_mode
556 );
557 
558 extern int XIGrabButton(
559     Display*            display,
560     int                 deviceid,
561     int                 button,
562     Window              grab_window,
563     Cursor              cursor,
564     int                 grab_mode,
565     int                 paired_device_mode,
566     int                 owner_events,
567     XIEventMask         *mask,
568     int                 num_modifiers,
569     XIGrabModifiers     *modifiers_inout
570 );
571 
572 extern int XIGrabKeycode(
573     Display*            display,
574     int                 deviceid,
575     int                 keycode,
576     Window              grab_window,
577     int                 grab_mode,
578     int                 paired_device_mode,
579     int                 owner_events,
580     XIEventMask         *mask,
581     int                 num_modifiers,
582     XIGrabModifiers     *modifiers_inout
583 );
584 
585 extern int XIGrabEnter(
586     Display*            display,
587     int                 deviceid,
588     Window              grab_window,
589     Cursor              cursor,
590     int                 grab_mode,
591     int                 paired_device_mode,
592     int                 owner_events,
593     XIEventMask         *mask,
594     int                 num_modifiers,
595     XIGrabModifiers     *modifiers_inout
596 );
597 
598 extern int XIGrabFocusIn(
599     Display*            display,
600     int                 deviceid,
601     Window              grab_window,
602     int                 grab_mode,
603     int                 paired_device_mode,
604     int                 owner_events,
605     XIEventMask         *mask,
606     int                 num_modifiers,
607     XIGrabModifiers     *modifiers_inout
608 );
609 
610 extern int XIGrabTouchBegin(
611     Display*            display,
612     int                 deviceid,
613     Window              grab_window,
614     int                 owner_events,
615     XIEventMask         *mask,
616     int                 num_modifiers,
617     XIGrabModifiers     *modifiers_inout
618 );
619 
620 extern int XIGrabPinchGestureBegin(
621     Display*            display,
622     int                 deviceid,
623     Window              grab_window,
624     int                 grab_mode,
625     int                 paired_device_mode,
626     int                 owner_events,
627     XIEventMask         *mask,
628     int                 num_modifiers,
629     XIGrabModifiers     *modifiers_inout
630 );
631 
632 extern int XIGrabSwipeGestureBegin(
633     Display*            display,
634     int                 deviceid,
635     Window              grab_window,
636     int                 grab_mode,
637     int                 paired_device_mode,
638     int                 owner_events,
639     XIEventMask         *mask,
640     int                 num_modifiers,
641     XIGrabModifiers     *modifiers_inout
642 );
643 
644 extern Status XIUngrabButton(
645     Display*            display,
646     int                 deviceid,
647     int                 button,
648     Window              grab_window,
649     int                 num_modifiers,
650     XIGrabModifiers     *modifiers
651 );
652 
653 extern Status XIUngrabKeycode(
654     Display*            display,
655     int                 deviceid,
656     int                 keycode,
657     Window              grab_window,
658     int                 num_modifiers,
659     XIGrabModifiers     *modifiers
660 );
661 
662 extern Status XIUngrabEnter(
663     Display*            display,
664     int                 deviceid,
665     Window              grab_window,
666     int                 num_modifiers,
667     XIGrabModifiers     *modifiers
668 );
669 
670 extern Status XIUngrabFocusIn(
671     Display*            display,
672     int                 deviceid,
673     Window              grab_window,
674     int                 num_modifiers,
675     XIGrabModifiers     *modifiers
676 );
677 
678 extern Status XIUngrabTouchBegin(
679     Display*            display,
680     int                 deviceid,
681     Window              grab_window,
682     int                 num_modifiers,
683     XIGrabModifiers     *modifiers
684 );
685 
686 extern Status XIUngrabPinchGestureBegin(
687     Display*            display,
688     int                 deviceid,
689     Window              grab_window,
690     int                 num_modifiers,
691     XIGrabModifiers     *modifiers
692 );
693 
694 extern Status XIUngrabSwipeGestureBegin(
695     Display*            display,
696     int                 deviceid,
697     Window              grab_window,
698     int                 num_modifiers,
699     XIGrabModifiers     *modifiers
700 );
701 
702 extern Atom *XIListProperties(
703     Display*            display,
704     int                 deviceid,
705     int                 *num_props_return
706 );
707 
708 extern void XIChangeProperty(
709     Display*            display,
710     int                 deviceid,
711     Atom                property,
712     Atom                type,
713     int                 format,
714     int                 mode,
715     unsigned char       *data,
716     int                 num_items
717 );
718 
719 extern void
720 XIDeleteProperty(
721     Display*            display,
722     int                 deviceid,
723     Atom                property
724 );
725 
726 extern Status
727 XIGetProperty(
728     Display*            display,
729     int                 deviceid,
730     Atom                property,
731     long                offset,
732     long                length,
733     Bool                delete_property,
734     Atom                type,
735     Atom                *type_return,
736     int                 *format_return,
737     unsigned long       *num_items_return,
738     unsigned long       *bytes_after_return,
739     unsigned char       **data
740 );
741 
742 extern void
743 XIBarrierReleasePointers(
744     Display*                    display,
745     XIBarrierReleasePointerInfo *barriers,
746     int                         num_barriers
747 );
748 
749 extern void
750 XIBarrierReleasePointer(
751     Display*                    display,
752     int                         deviceid,
753     PointerBarrier              barrier,
754     BarrierEventID              eventid
755 );
756 
757 extern void XIFreeDeviceInfo(XIDeviceInfo       *info);
758 
759 _XFUNCPROTOEND
760 
761 #endif /* XINPUT2_H */
762