github.com/rajveermalviya/gamen@v0.1.2-0.20220930195403-9be15877c1aa/internal/xkbcommon/include/X11/extensions/XI2proto.h (about)

     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 */
   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 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   */
   156  typedef 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   */
   168  typedef 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   */
   179  typedef 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   */
   199  typedef 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   */
   213  typedef 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   */
   224  typedef 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   */
   238  typedef 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   */
   248  typedef 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   */
   261  typedef 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  
   280  typedef 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  
   289  typedef 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   */
   308  typedef 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  
   317  typedef 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   */
   335  typedef 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   */
   348  typedef 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  
   356  typedef 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  
   376  typedef 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  
   387  typedef 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  
   410  typedef 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  
   431  typedef 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  
   446  typedef 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   */
   459  typedef 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   */
   468  typedef 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   */
   480  typedef 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   */
   494  typedef 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   */
   504  typedef 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   */
   515  typedef 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   */
   528  typedef 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  
   536  typedef 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   */
   555  typedef 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   */
   569  typedef 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  
   578  typedef 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   */
   596  typedef 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   */
   615  typedef 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  
   622  typedef 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   */
   642  typedef 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   */
   656  typedef 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   */
   671  typedef 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   */
   688  typedef 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  
   707  typedef 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   */
   725  typedef 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   */
   742  typedef 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  
   751  typedef 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   */
   769  typedef 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   */
   785  typedef 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   */
   798  typedef 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  
   816  typedef 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  
   832  typedef struct {
   833      uint16_t    deviceid;
   834      uint16_t    pad;
   835      Barrier     barrier;
   836      uint32_t    eventid;
   837  } xXIBarrierReleasePointerInfo;
   838  
   839  typedef 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   */
   857  typedef 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   */
   871  typedef 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   */
   892  typedef 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   */
   914  typedef 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   */
   935  typedef 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   */
   959  typedef 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   */
   992  typedef 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   */
  1013  typedef 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  
  1041  typedef xXIEnterEvent xXILeaveEvent;
  1042  typedef xXIEnterEvent xXIFocusInEvent;
  1043  typedef 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   */
  1049  typedef 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  
  1068  typedef 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  
  1093  typedef xXIBarrierEvent xXIBarrierHitEvent;
  1094  typedef xXIBarrierEvent xXIBarrierPointerReleasedEvent;
  1095  typedef xXIBarrierEvent xXIBarrierLeaveEvent;
  1096  
  1097  /**
  1098   * Event for touchpad gesture pinch input events
  1099   */
  1100  typedef 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   */
  1134  typedef 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_ */