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 */
38typedef struct {
39    int                 type;
40    char*               name;
41    Bool                send_core;
42    Bool                enable;
43} XIAddMasterInfo;
44
45typedef struct {
46    int                 type;
47    int                 deviceid;
48    int                 return_mode; /* AttachToMaster, Floating */
49    int                 return_pointer;
50    int                 return_keyboard;
51} XIRemoveMasterInfo;
52
53typedef struct {
54    int                 type;
55    int                 deviceid;
56    int                 new_master;
57} XIAttachSlaveInfo;
58
59typedef struct {
60    int                 type;
61    int                 deviceid;
62} XIDetachSlaveInfo;
63
64typedef union {
65    int                   type; /* must be first element */
66    XIAddMasterInfo       add;
67    XIRemoveMasterInfo    remove;
68    XIAttachSlaveInfo     attach;
69    XIDetachSlaveInfo     detach;
70} XIAnyHierarchyChangeInfo;
71
72typedef struct
73{
74    int    base;
75    int    latched;
76    int    locked;
77    int    effective;
78} XIModifierState;
79
80typedef XIModifierState XIGroupState;
81
82typedef struct {
83    int           mask_len;
84    unsigned char *mask;
85} XIButtonState;
86
87typedef struct {
88    int           mask_len;
89    unsigned char *mask;
90    double        *values;
91} XIValuatorState;
92
93
94typedef struct
95{
96    int                 deviceid;
97    int                 mask_len;
98    unsigned char*      mask;
99} XIEventMask;
100
101typedef struct
102{
103    int         type;
104    int         sourceid;
105} XIAnyClassInfo;
106
107typedef struct
108{
109    int         type;
110    int         sourceid;
111    int         num_buttons;
112    Atom        *labels;
113    XIButtonState state;
114} XIButtonClassInfo;
115
116typedef struct
117{
118    int         type;
119    int         sourceid;
120    int         num_keycodes;
121    int         *keycodes;
122} XIKeyClassInfo;
123
124typedef 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 */
138typedef struct
139{
140    int         type;
141    int         sourceid;
142    int         number;
143    int         scroll_type;
144    double      increment;
145    int         flags;
146} XIScrollClassInfo;
147
148typedef struct
149{
150    int         type;
151    int         sourceid;
152    int         mode;
153    int         num_touches;
154} XITouchClassInfo;
155
156/* new in XI 2.4 */
157typedef struct
158{
159    int         type;
160    int         sourceid;
161    int         num_touches;
162} XIGestureClassInfo;
163
164typedef 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
175typedef struct
176{
177    int                 modifiers;
178    int                 status;
179} XIGrabModifiers;
180
181typedef unsigned int BarrierEventID;
182
183typedef 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 */
193typedef 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
204typedef 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 */
216typedef 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 */
233typedef 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
248typedef 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
273typedef 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
289typedef 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
315typedef XIEnterEvent XILeaveEvent;
316typedef XIEnterEvent XIFocusInEvent;
317typedef XIEnterEvent XIFocusOutEvent;
318
319typedef 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
332typedef 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
349typedef 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
371typedef 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
400typedef 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
429extern 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
444extern 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
457extern Status   XIDefineCursor(
458    Display*            display,
459    int                 deviceid,
460    Window              win,
461    Cursor              cursor
462);
463
464extern Status   XIUndefineCursor(
465    Display*            display,
466    int                 deviceid,
467    Window              win
468);
469
470extern Status   XIChangeHierarchy(
471    Display*            display,
472    XIAnyHierarchyChangeInfo*  changes,
473    int                 num_changes
474);
475
476extern Status   XISetClientPointer(
477    Display*            dpy,
478    Window              win,
479    int                 deviceid
480);
481
482extern Bool     XIGetClientPointer(
483    Display*            dpy,
484    Window              win,
485    int*                deviceid
486);
487
488extern int      XISelectEvents(
489     Display*            dpy,
490     Window              win,
491     XIEventMask         *masks,
492     int                 num_masks
493);
494
495extern XIEventMask *XIGetSelectedEvents(
496     Display*            dpy,
497     Window              win,
498     int                 *num_masks_return
499);
500
501extern Status XIQueryVersion(
502     Display*           dpy,
503     int*               major_version_inout,
504     int*               minor_version_inout
505);
506
507extern XIDeviceInfo* XIQueryDevice(
508     Display*           dpy,
509     int                deviceid,
510     int*               ndevices_return
511);
512
513extern Status XISetFocus(
514     Display*           dpy,
515     int                deviceid,
516     Window             focus,
517     Time               time
518);
519
520extern Status XIGetFocus(
521     Display*           dpy,
522     int                deviceid,
523     Window             *focus_return);
524
525extern 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
537extern Status XIUngrabDevice(
538     Display*           dpy,
539     int                deviceid,
540     Time               time
541);
542
543extern Status XIAllowEvents(
544    Display*            display,
545    int                 deviceid,
546    int                 event_mode,
547    Time                time
548);
549
550extern Status XIAllowTouchEvents(
551    Display*            display,
552    int                 deviceid,
553    unsigned int        touchid,
554    Window              grab_window,
555    int                 event_mode
556);
557
558extern 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
572extern 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
585extern 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
598extern 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
610extern 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
620extern 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
632extern 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
644extern Status XIUngrabButton(
645    Display*            display,
646    int                 deviceid,
647    int                 button,
648    Window              grab_window,
649    int                 num_modifiers,
650    XIGrabModifiers     *modifiers
651);
652
653extern Status XIUngrabKeycode(
654    Display*            display,
655    int                 deviceid,
656    int                 keycode,
657    Window              grab_window,
658    int                 num_modifiers,
659    XIGrabModifiers     *modifiers
660);
661
662extern Status XIUngrabEnter(
663    Display*            display,
664    int                 deviceid,
665    Window              grab_window,
666    int                 num_modifiers,
667    XIGrabModifiers     *modifiers
668);
669
670extern Status XIUngrabFocusIn(
671    Display*            display,
672    int                 deviceid,
673    Window              grab_window,
674    int                 num_modifiers,
675    XIGrabModifiers     *modifiers
676);
677
678extern Status XIUngrabTouchBegin(
679    Display*            display,
680    int                 deviceid,
681    Window              grab_window,
682    int                 num_modifiers,
683    XIGrabModifiers     *modifiers
684);
685
686extern Status XIUngrabPinchGestureBegin(
687    Display*            display,
688    int                 deviceid,
689    Window              grab_window,
690    int                 num_modifiers,
691    XIGrabModifiers     *modifiers
692);
693
694extern Status XIUngrabSwipeGestureBegin(
695    Display*            display,
696    int                 deviceid,
697    Window              grab_window,
698    int                 num_modifiers,
699    XIGrabModifiers     *modifiers
700);
701
702extern Atom *XIListProperties(
703    Display*            display,
704    int                 deviceid,
705    int                 *num_props_return
706);
707
708extern 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
719extern void
720XIDeleteProperty(
721    Display*            display,
722    int                 deviceid,
723    Atom                property
724);
725
726extern Status
727XIGetProperty(
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
742extern void
743XIBarrierReleasePointers(
744    Display*                    display,
745    XIBarrierReleasePointerInfo *barriers,
746    int                         num_barriers
747);
748
749extern void
750XIBarrierReleasePointer(
751    Display*                    display,
752    int                         deviceid,
753    PointerBarrier              barrier,
754    BarrierEventID              eventid
755);
756
757extern void XIFreeDeviceInfo(XIDeviceInfo       *info);
758
759_XFUNCPROTOEND
760
761#endif /* XINPUT2_H */
762