| /* |
| * Copyright © 2009 Red Hat, Inc. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the next |
| * paragraph) shall be included in all copies or substantial portions of the |
| * Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| * DEALINGS IN THE SOFTWARE. |
| * |
| */ |
| |
| /* Conventions for this file: |
| * Names: |
| * structs: always typedef'd, prefixed with xXI, CamelCase |
| * struct members: lower_case_with_underscores |
| * Exceptions: reqType, ReqType, repType, RepType, sequenceNumber are |
| * named as such for historical reasons. |
| * request opcodes: X_XIRequestName as CamelCase |
| * defines: defines used in client applications must go in XI2.h |
| * defines used only in protocol handling: XISOMENAME |
| * |
| * Data types: unless there is a historical name for a datatype (e.g. |
| * Window), use stdint types specifying the size of the datatype. |
| * historical data type names must be defined and undefined at the top and |
| * end of the file. |
| * |
| * General: |
| * spaces, not tabs. |
| * structs specific to a request or reply added before the request |
| * definition. structs used in more than one request, reply or event |
| * appended to the common structs section before the definition of the |
| * first request. |
| * members of structs vertically aligned on column 16 if datatypes permit. |
| * otherwise alingned on next available 8n column. |
| */ |
| |
| /** |
| * Protocol definitions for the XI2 protocol. |
| * This file should not be included by clients that merely use XI2, but do not |
| * need the wire protocol. Such clients should include XI2.h, or the matching |
| * header from the library. |
| * |
| */ |
| #ifndef _XI2PROTO_H_ |
| #define _XI2PROTO_H_ |
| |
| #include <X11/Xproto.h> |
| #include <X11/X.h> |
| #include <X11/extensions/XI2.h> |
| #include <stdint.h> |
| |
| /* make sure types have right sizes for protocol structures. */ |
| #define Window uint32_t |
| #define Time uint32_t |
| #define Atom uint32_t |
| #define Cursor uint32_t |
| #define Barrier uint32_t |
| |
| /** |
| * XI2 Request opcodes |
| */ |
| #define X_XIQueryPointer 40 |
| #define X_XIWarpPointer 41 |
| #define X_XIChangeCursor 42 |
| #define X_XIChangeHierarchy 43 |
| #define X_XISetClientPointer 44 |
| #define X_XIGetClientPointer 45 |
| #define X_XISelectEvents 46 |
| #define X_XIQueryVersion 47 |
| #define X_XIQueryDevice 48 |
| #define X_XISetFocus 49 |
| #define X_XIGetFocus 50 |
| #define X_XIGrabDevice 51 |
| #define X_XIUngrabDevice 52 |
| #define X_XIAllowEvents 53 |
| #define X_XIPassiveGrabDevice 54 |
| #define X_XIPassiveUngrabDevice 55 |
| #define X_XIListProperties 56 |
| #define X_XIChangeProperty 57 |
| #define X_XIDeleteProperty 58 |
| #define X_XIGetProperty 59 |
| #define X_XIGetSelectedEvents 60 |
| #define X_XIBarrierReleasePointer 61 |
| |
| /** Number of XI requests */ |
| #define XI2REQUESTS (X_XIBarrierReleasePointer - X_XIQueryPointer + 1) |
| /** Number of XI2 events */ |
| #define XI2EVENTS (XI_LASTEVENT + 1) |
| |
| /************************************************************************************* |
| * * |
| * COMMON STRUCTS * |
| * * |
| *************************************************************************************/ |
| /** Fixed point 16.16 */ |
| typedef int32_t FP1616; |
| |
| /** Fixed point 32.32 */ |
| typedef struct { |
| int32_t integral; |
| uint32_t frac; |
| } FP3232; |
| |
| /** |
| * Struct to describe a device. |
| * |
| * For a MasterPointer or a MasterKeyboard, 'attachment' specifies the |
| * paired master device. |
| * For a SlaveKeyboard or SlavePointer, 'attachment' specifies the master |
| * device this device is attached to. |
| * For a FloatingSlave, 'attachment' is undefined. |
| */ |
| typedef struct { |
| uint16_t deviceid; |
| uint16_t use; /**< ::XIMasterPointer, ::XIMasterKeyboard, |
| ::XISlavePointer, ::XISlaveKeyboard, |
| ::XIFloatingSlave */ |
| uint16_t attachment; /**< Current attachment or pairing.*/ |
| uint16_t num_classes; /**< Number of classes following this struct. */ |
| uint16_t name_len; /**< Length of name in bytes. */ |
| uint8_t enabled; /**< TRUE if device is enabled. */ |
| uint8_t pad; |
| } xXIDeviceInfo; |
| |
| /** |
| * Default template for a device class. |
| * A device class is equivalent to a device's capabilities. Multiple classes |
| * are supported per device. |
| */ |
| typedef struct { |
| uint16_t type; /**< One of *class */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint16_t pad; |
| } xXIAnyInfo; |
| |
| /** |
| * Denotes button capability on a device. |
| * Struct is followed by num_buttons * Atom that names the buttons in the |
| * device-native setup (i.e. ignoring button mappings). |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ButtonClass */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint16_t num_buttons; /**< Number of buttons provided */ |
| } xXIButtonInfo; |
| |
| /** |
| * Denotes key capability on a device. |
| * Struct is followed by num_keys * CARD32 that lists the keycodes available |
| * on the device. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always KeyClass */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint16_t num_keycodes; /**< Number of keys provided */ |
| } xXIKeyInfo; |
| |
| /** |
| * Denotes an valuator capability on a device. |
| * One XIValuatorInfo describes exactly one valuator (axis) on the device. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ValuatorClass */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint16_t number; /**< Valuator number */ |
| Atom label; /**< Axis label */ |
| FP3232 min; /**< Min value */ |
| FP3232 max; /**< Max value */ |
| FP3232 value; /**< Last published value */ |
| uint32_t resolution; /**< Resolutions in units/m */ |
| uint8_t mode; /**< ModeRelative or ModeAbsolute */ |
| uint8_t pad1; |
| uint16_t pad2; |
| } xXIValuatorInfo; |
| |
| /*** |
| * Denotes a scroll valuator on a device. |
| * One XIScrollInfo describes exactly one scroll valuator that must have a |
| * XIValuatorInfo struct. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ValuatorClass */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint16_t number; /**< Valuator number */ |
| uint16_t scroll_type; /**< ::XIScrollTypeVertical, ::XIScrollTypeHorizontal */ |
| uint16_t pad0; |
| uint32_t flags; /**< ::XIScrollFlagEmulate, ::XIScrollFlagPreferred */ |
| FP3232 increment; /**< Increment for one unit of scrolling */ |
| } xXIScrollInfo; |
| |
| /** |
| * Denotes multitouch capability on a device. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always TouchClass */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t sourceid; /**< source device for this class */ |
| uint8_t mode; /**< DirectTouch or DependentTouch */ |
| uint8_t num_touches; /**< Maximum number of touches (0==unlimited) */ |
| } xXITouchInfo; |
| |
| /** |
| * Used to select for events on a given window. |
| * Struct is followed by (mask_len * CARD8), with each bit set representing |
| * the event mask for the given type. A mask bit represents an event type if |
| * (mask == (1 << type)). |
| */ |
| typedef struct { |
| uint16_t deviceid; /**< Device id to select for */ |
| uint16_t mask_len; /**< Length of mask in 4 byte units */ |
| } xXIEventMask; |
| |
| /** |
| * XKB modifier information. |
| * The effective modifier is a binary mask of base, latched, and locked |
| * modifiers. |
| */ |
| typedef struct |
| { |
| uint32_t base_mods; /**< Logically pressed modifiers */ |
| uint32_t latched_mods; /**< Logically latched modifiers */ |
| uint32_t locked_mods; /**< Logically locked modifiers */ |
| uint32_t effective_mods; /**< Effective modifiers */ |
| } xXIModifierInfo; |
| |
| /** |
| * XKB group information. |
| * The effective group is the mathematical sum of base, latched, and locked |
| * group after group wrapping is taken into account. |
| */ |
| typedef struct |
| { |
| uint8_t base_group; /**< Logically "pressed" group */ |
| uint8_t latched_group; /**< Logically latched group */ |
| uint8_t locked_group; /**< Logically locked group */ |
| uint8_t effective_group; /**< Effective group */ |
| } xXIGroupInfo; |
| |
| |
| /************************************************************************************* |
| * * |
| * REQUESTS * |
| * * |
| *************************************************************************************/ |
| |
| /** |
| * Query the server for the supported X Input extension version. |
| */ |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIQueryVersion */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t major_version; |
| uint16_t minor_version; |
| } xXIQueryVersionReq; |
| #define sz_xXIQueryVersionReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< ::X_Reply */ |
| uint8_t RepType; /**< Always ::X_XIQueryVersion */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t major_version; |
| uint16_t minor_version; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIQueryVersionReply; |
| #define sz_xXIQueryVersionReply 32 |
| |
| /** |
| * Query the server for information about a specific device or all input |
| * devices. |
| */ |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIQueryDevice */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| uint16_t pad; |
| } xXIQueryDeviceReq; |
| #define sz_xXIQueryDeviceReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< ::X_Reply */ |
| uint8_t RepType; /**< Always ::X_XIQueryDevice */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t num_devices; |
| uint16_t pad0; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIQueryDeviceReply; |
| #define sz_xXIQueryDeviceReply 32 |
| |
| /** |
| * Select for events on a given window. |
| */ |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XISelectEvents */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| uint16_t num_masks; |
| uint16_t pad; |
| } xXISelectEventsReq; |
| #define sz_xXISelectEventsReq 12 |
| |
| /** |
| * Query for selected events on a given window. |
| */ |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIGetSelectedEvents */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| } xXIGetSelectedEventsReq; |
| #define sz_xXIGetSelectedEventsReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIGetSelectedEvents */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t num_masks; /**< Number of xXIEventMask structs |
| trailing the reply */ |
| uint16_t pad0; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIGetSelectedEventsReply; |
| #define sz_xXIGetSelectedEventsReply 32 |
| |
| /** |
| * Query the given device's screen/window coordinates. |
| */ |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIQueryPointer */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| uint16_t deviceid; |
| uint16_t pad1; |
| } xXIQueryPointerReq; |
| #define sz_xXIQueryPointerReq 12 |
| |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIQueryPointer */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| Window root; |
| Window child; |
| FP1616 root_x; |
| FP1616 root_y; |
| FP1616 win_x; |
| FP1616 win_y; |
| uint8_t same_screen; |
| uint8_t pad0; |
| uint16_t buttons_len; |
| xXIModifierInfo mods; |
| xXIGroupInfo group; |
| } xXIQueryPointerReply; |
| #define sz_xXIQueryPointerReply 56 |
| |
| /** |
| * Warp the given device's pointer to the specified position. |
| */ |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIWarpPointer */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window src_win; |
| Window dst_win; |
| FP1616 src_x; |
| FP1616 src_y; |
| uint16_t src_width; |
| uint16_t src_height; |
| FP1616 dst_x; |
| FP1616 dst_y; |
| uint16_t deviceid; |
| uint16_t pad1; |
| } xXIWarpPointerReq; |
| #define sz_xXIWarpPointerReq 36 |
| |
| /** |
| * Change the given device's sprite to the given cursor. |
| */ |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIChangeCursor */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| Cursor cursor; |
| uint16_t deviceid; |
| uint16_t pad1; |
| } xXIChangeCursorReq; |
| #define sz_xXIChangeCursorReq 16 |
| |
| /** |
| * Modify the device hierarchy. |
| */ |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major code */ |
| uint8_t ReqType; /**< Always ::X_XIChangeHierarchy */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint8_t num_changes; |
| uint8_t pad0; |
| uint16_t pad1; |
| } xXIChangeHierarchyReq; |
| #define sz_xXIChangeHierarchyReq 8 |
| |
| /** |
| * Generic header for any hierarchy change. |
| */ |
| typedef struct { |
| uint16_t type; |
| uint16_t length; /**< Length in 4 byte units */ |
| } xXIAnyHierarchyChangeInfo; |
| |
| /** |
| * Create a new master device. |
| * Name of new master follows struct (4-byte padded) |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ::XIAddMaster */ |
| uint16_t length; /**< 2 + (namelen + padding)/4 */ |
| uint16_t name_len; |
| uint8_t send_core; |
| uint8_t enable; |
| } xXIAddMasterInfo; |
| |
| /** |
| * Delete a master device. Will automatically delete the master device paired |
| * with the given master device. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ::XIRemoveMaster */ |
| uint16_t length; /**< 3 */ |
| uint16_t deviceid; |
| uint8_t return_mode; /**< ::XIAttachToMaster, ::XIFloating */ |
| uint8_t pad; |
| uint16_t return_pointer; /**< Pointer to attach slave ptr devices to */ |
| uint16_t return_keyboard; /**< keyboard to attach slave keybd devices to*/ |
| } xXIRemoveMasterInfo; |
| |
| /** |
| * Attach an SD to a new device. |
| * NewMaster has to be of same type (pointer->pointer, keyboard->keyboard); |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ::XIAttachSlave */ |
| uint16_t length; /**< 2 */ |
| uint16_t deviceid; |
| uint16_t new_master; /**< id of new master device */ |
| } xXIAttachSlaveInfo; |
| |
| /** |
| * Detach an SD from its current master device. |
| */ |
| typedef struct { |
| uint16_t type; /**< Always ::XIDetachSlave */ |
| uint16_t length; /**< 2 */ |
| uint16_t deviceid; |
| uint16_t pad; |
| } xXIDetachSlaveInfo; |
| |
| |
| /** |
| * Set the window/client's ClientPointer. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XISetClientPointer */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| uint16_t deviceid; |
| uint16_t pad1; |
| } xXISetClientPointerReq; |
| #define sz_xXISetClientPointerReq 12 |
| |
| /** |
| * Query the given window/client's ClientPointer setting. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_GetClientPointer */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window win; |
| } xXIGetClientPointerReq; |
| #define sz_xXIGetClientPointerReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_GetClientPointer */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| BOOL set; /**< client pointer is set? */ |
| uint8_t pad0; |
| uint16_t deviceid; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIGetClientPointerReply; |
| #define sz_xXIGetClientPointerReply 32 |
| |
| /** |
| * Set the input focus to the specified window. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XISetFocus */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window focus; |
| Time time; |
| uint16_t deviceid; |
| uint16_t pad0; |
| } xXISetFocusReq; |
| #define sz_xXISetFocusReq 16 |
| |
| /** |
| * Query the current input focus. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIGetDeviceFocus */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| uint16_t pad0; |
| } xXIGetFocusReq; |
| #define sz_xXIGetFocusReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIGetFocus */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| Window focus; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIGetFocusReply; |
| #define sz_xXIGetFocusReply 32 |
| |
| |
| /** |
| * Grab the given device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIGrabDevice */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window grab_window; |
| Time time; |
| Cursor cursor; |
| uint16_t deviceid; |
| uint8_t grab_mode; |
| uint8_t paired_device_mode; |
| uint8_t owner_events; |
| uint8_t pad; |
| uint16_t mask_len; |
| } xXIGrabDeviceReq; |
| #define sz_xXIGrabDeviceReq 24 |
| |
| /** |
| * Return codes from a XIPassiveGrabDevice request. |
| */ |
| typedef struct { |
| uint32_t modifiers; /**< Modifier state */ |
| uint8_t status; /**< Grab status code */ |
| uint8_t pad0; |
| uint16_t pad1; |
| } xXIGrabModifierInfo; |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIGrabDevice */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint8_t status; |
| uint8_t pad0; |
| uint16_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| uint32_t pad6; |
| } xXIGrabDeviceReply; |
| #define sz_xXIGrabDeviceReply 32 |
| |
| /** |
| * Ungrab the specified device. |
| * |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIUngrabDevice */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Time time; |
| uint16_t deviceid; |
| uint16_t pad; |
| } xXIUngrabDeviceReq; |
| #define sz_xXIUngrabDeviceReq 12 |
| |
| |
| /** |
| * Allow or replay events on the specified grabbed device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIAllowEvents */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Time time; |
| uint16_t deviceid; |
| uint8_t mode; |
| uint8_t pad; |
| } xXIAllowEventsReq; |
| #define sz_xXIAllowEventsReq 12 |
| |
| /** |
| * Allow or replay events on the specified grabbed device. |
| * Since XI 2.2 |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIAllowEvents */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Time time; |
| uint16_t deviceid; |
| uint8_t mode; |
| uint8_t pad; |
| uint32_t touchid; /**< Since XI 2.2 */ |
| Window grab_window; /**< Since XI 2.2 */ |
| } xXI2_2AllowEventsReq; |
| #define sz_xXI2_2AllowEventsReq 20 |
| |
| |
| /** |
| * Passively grab the device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIPassiveGrabDevice */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Time time; |
| Window grab_window; |
| Cursor cursor; |
| uint32_t detail; |
| uint16_t deviceid; |
| uint16_t num_modifiers; |
| uint16_t mask_len; |
| uint8_t grab_type; |
| uint8_t grab_mode; |
| uint8_t paired_device_mode; |
| uint8_t owner_events; |
| uint16_t pad1; |
| } xXIPassiveGrabDeviceReq; |
| #define sz_xXIPassiveGrabDeviceReq 32 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIPassiveGrabDevice */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t num_modifiers; |
| uint16_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| uint32_t pad6; |
| } xXIPassiveGrabDeviceReply; |
| #define sz_xXIPassiveGrabDeviceReply 32 |
| |
| /** |
| * Delete a passive grab for the given device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIPassiveUngrabDevice */ |
| uint16_t length; /**< Length in 4 byte units */ |
| Window grab_window; |
| uint32_t detail; |
| uint16_t deviceid; |
| uint16_t num_modifiers; |
| uint8_t grab_type; |
| uint8_t pad0; |
| uint16_t pad1; |
| } xXIPassiveUngrabDeviceReq; |
| #define sz_xXIPassiveUngrabDeviceReq 20 |
| |
| /** |
| * List all device properties on the specified device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIListProperties */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| uint16_t pad; |
| } xXIListPropertiesReq; |
| #define sz_xXIListPropertiesReq 8 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always ::X_XIListProperties */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t num_properties; |
| uint16_t pad0; |
| uint32_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| uint32_t pad4; |
| uint32_t pad5; |
| } xXIListPropertiesReply; |
| #define sz_xXIListPropertiesReply 32 |
| |
| /** |
| * Change a property on the specified device. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always ::X_XIChangeProperty */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| uint8_t mode; |
| uint8_t format; |
| Atom property; |
| Atom type; |
| uint32_t num_items; |
| } xXIChangePropertyReq; |
| #define sz_xXIChangePropertyReq 20 |
| |
| /** |
| * Delete the specified property. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always X_XIDeleteProperty */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| uint16_t pad0; |
| Atom property; |
| } xXIDeletePropertyReq; |
| #define sz_xXIDeletePropertyReq 12 |
| |
| /** |
| * Query the specified property's values. |
| */ |
| typedef struct { |
| uint8_t reqType; |
| uint8_t ReqType; /**< Always X_XIGetProperty */ |
| uint16_t length; /**< Length in 4 byte units */ |
| uint16_t deviceid; |
| #if defined(__cplusplus) || defined(c_plusplus) |
| uint8_t c_delete; |
| #else |
| uint8_t delete; |
| #endif |
| uint8_t pad0; |
| Atom property; |
| Atom type; |
| uint32_t offset; |
| uint32_t len; |
| } xXIGetPropertyReq; |
| #define sz_xXIGetPropertyReq 24 |
| |
| typedef struct { |
| uint8_t repType; /**< Input extension major opcode */ |
| uint8_t RepType; /**< Always X_XIGetProperty */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| Atom type; |
| uint32_t bytes_after; |
| uint32_t num_items; |
| uint8_t format; |
| uint8_t pad0; |
| uint16_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| } xXIGetPropertyReply; |
| #define sz_xXIGetPropertyReply 32 |
| |
| typedef struct { |
| uint16_t deviceid; |
| uint16_t pad; |
| Barrier barrier; |
| uint32_t eventid; |
| } xXIBarrierReleasePointerInfo; |
| |
| typedef struct { |
| uint8_t reqType; /**< Input extension major opcode */ |
| uint8_t ReqType; /**< Always X_XIBarrierReleasePointer */ |
| uint16_t length; |
| uint32_t num_barriers; |
| /* array of xXIBarrierReleasePointerInfo */ |
| } xXIBarrierReleasePointerReq; |
| #define sz_xXIBarrierReleasePointerReq 8 |
| |
| /************************************************************************************* |
| * * |
| * EVENTS * |
| * * |
| *************************************************************************************/ |
| |
| /** |
| * Generic XI2 event header. All XI2 events use the same header. |
| */ |
| typedef struct |
| { |
| uint8_t type; |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; |
| uint16_t evtype; |
| uint16_t deviceid; |
| Time time; |
| } xXIGenericDeviceEvent; |
| |
| /** |
| * Device hierarchy information. |
| */ |
| typedef struct |
| { |
| uint16_t deviceid; |
| uint16_t attachment; /**< ID of master or paired device */ |
| uint8_t use; /**< ::XIMasterKeyboard, |
| ::XIMasterPointer, |
| ::XISlaveKeyboard, |
| ::XISlavePointer, |
| ::XIFloatingSlave */ |
| BOOL enabled; /**< TRUE if the device is enabled */ |
| uint16_t pad; |
| uint32_t flags; /**< ::XIMasterAdded, ::XIMasterRemoved, |
| ::XISlaveAttached, ::XISlaveDetached, |
| ::XISlaveAdded, ::XISlaveRemoved, |
| ::XIDeviceEnabled, ::XIDeviceDisabled */ |
| } xXIHierarchyInfo; |
| |
| /** |
| * The device hierarchy has been modified. This event includes the device |
| * hierarchy after the modification has been applied. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte units */ |
| uint16_t evtype; /**< ::XI_Hierarchy */ |
| uint16_t deviceid; |
| Time time; |
| uint32_t flags; /**< ::XIMasterAdded, ::XIMasterDeleted, |
| ::XISlaveAttached, ::XISlaveDetached, |
| ::XISlaveAdded, ::XISlaveRemoved, |
| ::XIDeviceEnabled, ::XIDeviceDisabled */ |
| uint16_t num_info; |
| uint16_t pad0; |
| uint32_t pad1; |
| uint32_t pad2; |
| } xXIHierarchyEvent; |
| |
| /** |
| * A device has changed capabilities. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte units */ |
| uint16_t evtype; /**< XI_DeviceChanged */ |
| uint16_t deviceid; /**< Device that has changed */ |
| Time time; |
| uint16_t num_classes; /**< Number of classes that have changed */ |
| uint16_t sourceid; /**< Source of the new classes */ |
| uint8_t reason; /**< ::XISlaveSwitch, ::XIDeviceChange */ |
| uint8_t pad0; |
| uint16_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| } xXIDeviceChangedEvent; |
| |
| /** |
| * The owner of a touch stream has passed on ownership to another client. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte units */ |
| uint16_t evtype; /**< XI_TouchOwnership */ |
| uint16_t deviceid; /**< Device that has changed */ |
| Time time; |
| uint32_t touchid; |
| Window root; |
| Window event; |
| Window child; |
| /* └──────── 32 byte boundary ────────┘ */ |
| uint16_t sourceid; |
| uint16_t pad0; |
| uint32_t flags; |
| uint32_t pad1; |
| uint32_t pad2; |
| } xXITouchOwnershipEvent; |
| |
| /** |
| * Default input event for pointer, keyboard or touch input. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte uints */ |
| uint16_t evtype; |
| uint16_t deviceid; |
| Time time; |
| uint32_t detail; /**< Keycode or button */ |
| Window root; |
| Window event; |
| Window child; |
| /* └──────── 32 byte boundary ────────┘ */ |
| FP1616 root_x; /**< Always screen coords, 16.16 fixed point */ |
| FP1616 root_y; |
| FP1616 event_x; /**< Always screen coords, 16.16 fixed point */ |
| FP1616 event_y; |
| uint16_t buttons_len; /**< Len of button flags in 4 b units */ |
| uint16_t valuators_len; /**< Len of val. flags in 4 b units */ |
| uint16_t sourceid; /**< The source device */ |
| uint16_t pad0; |
| uint32_t flags; /**< ::XIKeyRepeat */ |
| xXIModifierInfo mods; |
| xXIGroupInfo group; |
| } xXIDeviceEvent; |
| |
| |
| /** |
| * Sent when an input event is generated. RawEvents include valuator |
| * information in both device-specific data (i.e. unaccelerated) and |
| * processed data (i.e. accelerated, if applicable). |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte uints */ |
| uint16_t evtype; /**< ::XI_RawEvent */ |
| uint16_t deviceid; |
| Time time; |
| uint32_t detail; |
| uint16_t sourceid; /**< The source device (XI 2.1) */ |
| uint16_t valuators_len; /**< Length of trailing valuator |
| mask in 4 byte units */ |
| uint32_t flags; /**< ::XIKeyRepeat */ |
| uint32_t pad2; |
| } xXIRawEvent; |
| |
| /** |
| * Note that the layout of root, event, child, root_x, root_y, event_x, |
| * event_y must be identical to the xXIDeviceEvent. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte uints */ |
| uint16_t evtype; /**< ::XI_Enter */ |
| uint16_t deviceid; |
| Time time; |
| uint16_t sourceid; |
| uint8_t mode; |
| uint8_t detail; |
| Window root; |
| Window event; |
| Window child; |
| /* └──────── 32 byte boundary ────────┘ */ |
| FP1616 root_x; |
| FP1616 root_y; |
| FP1616 event_x; |
| FP1616 event_y; |
| BOOL same_screen; |
| BOOL focus; |
| uint16_t buttons_len; /**< Length of trailing button mask |
| in 4 byte units */ |
| xXIModifierInfo mods; |
| xXIGroupInfo group; |
| } xXIEnterEvent; |
| |
| typedef xXIEnterEvent xXILeaveEvent; |
| typedef xXIEnterEvent xXIFocusInEvent; |
| typedef xXIEnterEvent xXIFocusOutEvent; |
| |
| /** |
| * Sent when a device property is created, modified or deleted. Does not |
| * include property data, the client is required to query the data. |
| */ |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte units */ |
| uint16_t evtype; /**< ::XI_PropertyEvent */ |
| uint16_t deviceid; |
| Time time; |
| Atom property; |
| uint8_t what; /**< ::XIPropertyDeleted, |
| ::XIPropertyCreated, |
| ::XIPropertyMotified */ |
| uint8_t pad0; |
| uint16_t pad1; |
| uint32_t pad2; |
| uint32_t pad3; |
| } xXIPropertyEvent; |
| |
| typedef struct |
| { |
| uint8_t type; /**< Always GenericEvent */ |
| uint8_t extension; /**< XI extension offset */ |
| uint16_t sequenceNumber; |
| uint32_t length; /**< Length in 4 byte units */ |
| uint16_t evtype; /**< ::XI_BarrierHit or ::XI_BarrierLeave */ |
| uint16_t deviceid; |
| Time time; |
| uint32_t eventid; |
| Window root; |
| Window event; |
| Barrier barrier; |
| /* └──────── 32 byte boundary ────────┘ */ |
| uint32_t dtime; |
| uint32_t flags; /**< ::XIBarrierPointerReleased |
| ::XIBarrierDeviceIsGrabbed */ |
| uint16_t sourceid; |
| int16_t pad; |
| FP1616 root_x; |
| FP1616 root_y; |
| FP3232 dx; |
| FP3232 dy; |
| } xXIBarrierEvent; |
| |
| typedef xXIBarrierEvent xXIBarrierHitEvent; |
| typedef xXIBarrierEvent xXIBarrierPointerReleasedEvent; |
| typedef xXIBarrierEvent xXIBarrierLeaveEvent; |
| |
| #undef Window |
| #undef Time |
| #undef Atom |
| #undef Cursor |
| #undef Barrier |
| |
| #endif /* _XI2PROTO_H_ */ |