1678 lines
66 KiB
Plaintext
1678 lines
66 KiB
Plaintext
|
||
The X Input Extension
|
||
Version 2.0
|
||
|
||
Peter Hutterer
|
||
peter.hutterer@redhat.com
|
||
Red Hat, Inc.
|
||
|
||
|
||
|
||
1. Introduction
|
||
|
||
The X Input Extension version 2.0 (XI2) is the second major release of the X
|
||
Input Extension.
|
||
|
||
XI2 provides a number of enhancements over version 1.5, including:
|
||
- use of XGE and GenericEvents. GenericEvents are of flexible length with a
|
||
minimum length of 32 bytes.
|
||
- explicit device hierarchy of master and slave devices. See Section 4.
|
||
- use of multiple independent master devices (Multi-Poiner X or MPX).
|
||
- the ability for devices to change capabilities at runtime.
|
||
- raw device events
|
||
|
||
XI2's intent is to replace both core input processing and prior versions of
|
||
the X Input Extension. Historically, the majority of applications employed the
|
||
core protocol requests and events to handle user input. The core protocol does
|
||
not provide information about which device generated the event. The X Input
|
||
Extension version up to 1.5 requires the differentiation between core and
|
||
extended devices. Extended devices may not be core devices and thus cannot be
|
||
used on applications employing the core protocol. XI2 addresses both of these
|
||
issues by enabling devices to be both extended and core devices and providing
|
||
device information in each event (with the exception of core events).
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
||
2. Notations used in this document
|
||
|
||
Notation for requests:
|
||
┌───
|
||
Name of request
|
||
name of request field: type of request field
|
||
name of request field: type of request field
|
||
▶
|
||
name of reply field: type of reply field
|
||
└───
|
||
|
||
Notation for events:
|
||
┌───
|
||
Name of event
|
||
name of field: type of field
|
||
name of field: type of field
|
||
└───
|
||
|
||
Complex fields are specified in the following notation:
|
||
name of field: COMPLEXFIELDTYPE
|
||
or, if multiple of these fields exist:
|
||
name of field: LISTofCOMPLEXFIELDTYPE
|
||
|
||
COMPLEXFIELDTYPE: { name of subfield: type of subfield,
|
||
name of subfield: type of subfield }
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
||
3. Interoperability between version 1.x and 2.0
|
||
|
||
There is little interaction between 1.x and 2.x versions of the X Input
|
||
Extension. Clients are requested to avoid mixing XI1.x and XI2 code as much as
|
||
possible. Several direct incompatibilities are observable:
|
||
|
||
3.1 Limitations resulting from different variable ranges
|
||
|
||
XI2 provides a larger range for some fields than XI1. As a result, XI1 clients
|
||
may not receive data an XI2 client receives.
|
||
These fields include:
|
||
- devices with a deviceid of greater than 127 are invisible to XI1 clients.
|
||
- key events and key grabs featuring larger than 255 can only be sent to XI2
|
||
clients.
|
||
- no subpixel information is avialable to XI1 clients. If motion events are in
|
||
a subpixel range only, the server may omit these events and an XI 1.x client
|
||
will not receive events until the pixel boundary is crossed.
|
||
|
||
|
||
3.2 Blocking of grabs
|
||
|
||
XI1 grabs are different to XI2 grab and a device may not be grabbed through an
|
||
XI2 grab if an XI1 grab is currently active on this device or vice versa.
|
||
Likewise, a keycode or button already grabbed by an XI 1.x or XI2 client may
|
||
not be grabbed with the same modifier combination by an XI2 or XI 1.x client,
|
||
respectively.
|
||
|
||
3.3 Invisibility of Master Devices
|
||
|
||
XI 1.x was not designed with support for multiple master devices (see Section
|
||
4). As a result, only the first master pointer and master keyboard are visible
|
||
to XI 1.x clients, all other master devices are invisible and cannot be
|
||
accessed from XI 1.x calls.
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
|
||
4. The Master/Slave device hierarchy
|
||
|
||
XI2 introduces a device hierarchy split up into so-called Master Devices (MD)
|
||
and Slave Devices (SD).
|
||
|
||
4.1 Master devices
|
||
An MD is a virtual device created and managed by the server. MDs may send core
|
||
events and XI events. However, an MD does not represent a physical device and
|
||
relies on SDs for event generation. MDs come in two forms: as master pointers
|
||
or as master keyboards. A master pointer is represented by a visible cursor on
|
||
the screen. A master keyboard is represented by a keyboard focus.
|
||
|
||
Each master pointer is paired with the respective master keyboard and vice
|
||
versa, and this pairing is constant for the lifetime of both input devices.
|
||
Clients can use this pairing behaviour to implement input paradigms that
|
||
require pointer and keyboard interation (e.g. SHIFT + Click).
|
||
|
||
4.2 Slave devices
|
||
An SD is usually a physical device configured in the server. SDs are not
|
||
represented by a cursor or keyboard focus and may be attached to a master
|
||
pointer or master keyboard. SDs can only be attached to any master of the same
|
||
type (e.g. a physical pointer device can be attached to any master pointer).
|
||
|
||
If an event is generated by an SD
|
||
- if the SD is attached to a master pointer, it changes the position and/or
|
||
button state of the master pointer.
|
||
- if the SD is attached to a master keyboard, it sends events to this
|
||
keyboard's focus window (if applicable) and/or changes the modifier state of
|
||
this keyboard.
|
||
- if the SD is not attached to an MD ("floating"), it does not change
|
||
any master device. The SD has its own (invisible) sprite and its own focus.
|
||
Both the sprite and the focus must be managed explicitly by the client
|
||
program.
|
||
|
||
4.3 Event processing for attached slave devices
|
||
|
||
Whenever an SD changes its logical state,
|
||
- the event is delivered as an XI event to any interested clients. If the
|
||
device is floating, event processing stops.
|
||
Otherwise, if the device is attached,
|
||
- the master device changes its classes to reflect the SD's capabilities. All
|
||
interested clients are notified of this device change.
|
||
- then, the event is delivered as an XI event from the MD to any interested
|
||
clients. If the event has been delivered, event processing stops.
|
||
Otherwise,
|
||
- the event is delivered as a core event to any interested clients.
|
||
|
||
Given that W is the event window, and P the parent window of W, event delivery
|
||
to P is only attempted if neither the XI event, nor the core event has been
|
||
delivered on W. Once an event has been delivered as either XI or core event,
|
||
event processing stops.
|
||
|
||
4.4. The ClientPointer principle
|
||
|
||
Many core protocol and some extension requests are ambiguous when multiple
|
||
master devices are available (e.g. QueryPointer does not specfy which pointer).
|
||
The X server does not have the knowledge to chose the contextually correct
|
||
master device. For each client, one master pointer is designated as this
|
||
clients's "ClientPointer". Whenever a client sends an ambiguous request (e.g.
|
||
QueryPointer), the ClientPointer or the keyboard paired with the ClientPointer
|
||
is chosen to provide the data for this request.
|
||
|
||
This ClientPointer may be explicitly assigned to a client with the
|
||
SetClientPointer call. If no ClientPointer is set when a client issues an
|
||
ambiguous request, the server choses one device as the ClientPointer. The
|
||
method of chosing a ClientPointer from the available master pointers is
|
||
implementation-specific.
|
||
|
||
If the master pointer currently set as ClientPointer for one or more clients is
|
||
removed, the server may either unset the ClientPointer setting or change the
|
||
ClientPointer to a different master pointer.
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
5. Data types
|
||
|
||
BUTTONMASK
|
||
A binary mask defined as (1 << button number).
|
||
A SETofBUTTONMASK is a binary OR of zero or more BUTTONMASK.
|
||
|
||
DEVICE { DEVICEID, AllDevices, AllMasterDevices }
|
||
A DEVICE specifies either a DEVICEID or AllDevices or
|
||
AllMasterDevices.
|
||
|
||
DEVICEID { CARD16 }
|
||
A DEVICEID is a numerical ID for a device currently available in the
|
||
server. The server may re-use a device ID after a device's removal.
|
||
The device IDs 0 and 1 are reserved.
|
||
AllDevices ........ 0
|
||
AllMasterDevices .. 1
|
||
|
||
DEVICEUSE { MasterPointer, MasterKeyboard, SlavePointer,
|
||
SlaveKeyboard, FloatingSlave }
|
||
A DEVICEUSE field specifies the current use of a device in the MD/SD
|
||
device hierarchy. See Section 4 for more information.
|
||
|
||
EVENTMASK
|
||
An EVENTMASK is a binary mask defined as (1 << event type).
|
||
A SETofEVENTMASK is a binary OR of zero or more EVENTMASK.
|
||
|
||
FP1616
|
||
Fixed point decimal in 16.16 format as one INT16 and one CARD16.
|
||
The INT16 contains the integral part, the CARD32 the decimal fraction
|
||
shifted by 16.
|
||
|
||
FP3232
|
||
Fixed point decimal in 32.32 format as one INT32 and one CARD32.
|
||
The INT32 contains the integral part, the CARD32 the decimal fraction
|
||
shifted by 32.
|
||
|
||
VALUATORMASK
|
||
A binary mask defined as (1 << valuator number).
|
||
A SETofVALUATORMASK is a binary OR of zero or more VALUATORMASK.
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
6. Errors
|
||
|
||
Errors are sent using core X error reports.
|
||
|
||
Device
|
||
A value for a DEVICE argument does not specify a valid DEVICE.
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|
||
7. Requests:
|
||
|
||
The server does not guarantee that the length of a reply remains constant in
|
||
future revisions of XI2. A client must always retrieve the exact length of the
|
||
protocol reply from the connection, even if the reply is longer than defined
|
||
for the XI2 version supported by the client.
|
||
Additional bytes in a request may include data supported in later versions of
|
||
XI2. Clients should ignore this data. Padding bytes in XI2 protocol requests
|
||
are required to be 0.
|
||
|
||
7.1 Requests introduced in version 2.0
|
||
|
||
┌───
|
||
XIQueryVersion
|
||
major_version: CARD16
|
||
minor_version: CARD16
|
||
▶
|
||
major_version: CARD16
|
||
minor_version: CARD16
|
||
└───
|
||
|
||
The client sends the highest supported version to the server and the
|
||
server sends the highest version it supports, but no higher than the
|
||
requested version. Major versions changes can introduce incompatibilities
|
||
in existing functionality, minor version changes introduce only backward
|
||
compatible changes. It is the client's responsibility to ensure that the
|
||
server supports a version which is compatible with its expectations.
|
||
|
||
major_version
|
||
Major XI2 version.
|
||
minor_version
|
||
Minor XI2 version.
|
||
|
||
If major_version is less than 2, a BadValue error occurs.
|
||
|
||
┌───
|
||
XIQueryDevice
|
||
DEVICE deviceid
|
||
▶
|
||
num_devices: CARD16
|
||
deviceinfo: LISTofDEVICEINFO
|
||
└───
|
||
|
||
DEVICEINFO { deviceid: DEVICEID
|
||
use: DEVICEUSE
|
||
attachment: DEVICEID
|
||
enabled: BOOL
|
||
num_classes: CARD16
|
||
name_len: CARD16
|
||
name: LISTofCHAR8
|
||
classes: LISTofCLASS }
|
||
|
||
CLASS { BUTTONCLASS, KEYCLASS, AXISCLASS }
|
||
|
||
BUTTONCLASS { type: ButtonClass
|
||
length: CARD16
|
||
sourceid: CARD16
|
||
buttons_len: CARD16
|
||
state: SETofBUTTONMASK
|
||
labels: LISTofATOM }
|
||
|
||
KEYCLASS { type: KeyClass
|
||
length: CARD16
|
||
sourceid: CARD16
|
||
num_keys: CARD16
|
||
keys: LISTofCARD32 }
|
||
|
||
AXISCLASS { type: AxisClass
|
||
length: CARD16
|
||
sourceid: CARD16
|
||
axisnumber: CARD16
|
||
label: ATOM
|
||
min: FP3232
|
||
max: FP3232
|
||
value: FP3232
|
||
resolution: CARD32 }
|
||
|
||
XIQueryDevices details information about the requested input devices.
|
||
|
||
devices
|
||
The device to list. If devices is AllDevices, all enabled and
|
||
disabled devices are listed. If devices is AllMasterDevices, all
|
||
enabled and disabled master devices are listed. If devices is a
|
||
valid DEVICE, only this DEVICE is listed and num_devices is 1.
|
||
num_devices
|
||
The number of deviceinfos returned.
|
||
|
||
Each deviceinfo is detailed as follows:
|
||
deviceid
|
||
The unique ID of the device. Device IDs may get re-used when a device
|
||
is removed.
|
||
use
|
||
If the device is a master pointer, use is MasterPointer.
|
||
If the device is a master keyboard, use is MasterKeyboard.
|
||
If the device is a slave pointer, use is SlavePointer.
|
||
If the device is a slave keyboard, use is SlaveKeyboard.
|
||
If the device is a floating slave, use is FloatingSlave.
|
||
attachment
|
||
If the device is a master pointer or a master keyboard, attachment
|
||
specifies the paired master keyboard, or the paired master pointer,
|
||
respectively. If the device is a non-floating slave device
|
||
attachment specifies the master device this device is attached to.
|
||
If the device is a floating slave, attachment is undefined.
|
||
enabled
|
||
Zero if the device is disabled, non-zero otherwise.
|
||
num_classes
|
||
Number of classes provided.
|
||
name_len
|
||
Length of the name in bytes not including padding.
|
||
classes
|
||
Details the available classes provided by the device in an undefined
|
||
order.
|
||
name
|
||
The device's name. padded to a multiple of 4 bytes.
|
||
|
||
For all classes, type specifies the device class. Clients are required
|
||
to ignore unknown device classes. The length field specifies the length
|
||
of the class in 4 byte units.
|
||
The following classes may occur only once: ButtonClass, KeyClass
|
||
|
||
ButtonClass:
|
||
type
|
||
Always ButtonClass.
|
||
length
|
||
Length in 4 byte units.
|
||
sourceid
|
||
The device this class originates from.
|
||
num_buttons
|
||
Number of buttons provided by the device.
|
||
labels
|
||
List of Atoms specifying the label for each button. An Atom of None
|
||
specifies an unlabeled button. Buttons are listed in the device-native
|
||
order regardless of the current button mapping.
|
||
state
|
||
The current button mask for this device after button mapping is
|
||
applied. Each bit representing a button is 1 if this button is
|
||
logically down, or 0 otherwise. State is a multiple of 4-byte units
|
||
and always contains at least num_buttons bits.
|
||
|
||
KeyClass:
|
||
type
|
||
Always KeyClass.
|
||
length
|
||
Length in 4 byte units.
|
||
sourceid
|
||
The device this class originates from.
|
||
num_keys
|
||
Number of keycodes provided by the device.
|
||
keys
|
||
List of keycodes provided.
|
||
|
||
AxisClass:
|
||
type
|
||
Always AxisClass.
|
||
length
|
||
Length in 4 byte units.
|
||
sourceid
|
||
The device this class originates from.
|
||
axisnumber
|
||
Axis number of this axis. The axis number is in device-native
|
||
order and potential axis mappings are ignored.
|
||
label
|
||
Atom specifying the axis name. An Atom of None specifies an unlabeled
|
||
axis.
|
||
min
|
||
Minimum value.
|
||
max
|
||
Minimum value.
|
||
resolution
|
||
Resolution in counts/meter.
|
||
mode
|
||
Relative or Absolute.
|
||
value
|
||
Last published axis value (if mode is absolute).
|
||
|
||
An axis in Relative mode may specify min and max as a hint to the
|
||
client. If no min and max information is available, both must be 0.
|
||
|
||
┌───
|
||
XISelectEvents
|
||
window: Window
|
||
num_masks: CARD16
|
||
masks: LISTofEVENTMASK
|
||
|
||
└───
|
||
|
||
EVENTMASK { deviceid: DEVICE,
|
||
mask_len: CARD16,
|
||
mask: SETofEVENTMASK
|
||
|
||
window
|
||
The window to select the events on.
|
||
num_masks
|
||
Number of items in masks.
|
||
deviceid
|
||
Numerical deviceid, or AllDevices, or AllMasterDevices.
|
||
mask_len
|
||
Length of mask in 4 byte units.
|
||
mask
|
||
Event mask. An event mask for an event type T is defined as (1 << T).
|
||
|
||
XISelectEvents selects for XI2 events on window.
|
||
|
||
If num_masks is 0, a BadValue error occurs.
|
||
|
||
Each mask sets the (and overwrites a previous) event mask for the DEVICE
|
||
specified through deviceid. The device AllDevices or
|
||
AllMasterDevices is treated as a separate device by server. A client's
|
||
event mask is the union of AllDevices, AllMasterDevices and the
|
||
per-device event mask.
|
||
The removal of device from the server unsets the event masks for the
|
||
device. If an event mask is set for AllDevices or AllMasterDevices, the
|
||
event mask is not cleared on device removal and affects all future
|
||
devices.
|
||
|
||
If mask_len is 0, the event mask for the given device is cleared.
|
||
|
||
The mask for XIHierarchyEvents may only be selected for XIAllDevices.
|
||
Setting it for any other device results in a BadValue error.
|
||
|
||
┌───
|
||
XIGetSelectedEvents
|
||
window: Window
|
||
▶
|
||
num_masks: CARD16
|
||
masks: LISTofEVENTMASK
|
||
└───
|
||
|
||
window
|
||
The window to select the events on.
|
||
num_masks
|
||
Number of items in masks.
|
||
masks
|
||
Selected event masks by this client.
|
||
|
||
Masks are returned on a per-device basis, with masks for AllDevices and
|
||
AllMasterDevices returned separately. A client can calculate the
|
||
effective mask for a device with a bitwise OR of the AllDevices, the
|
||
AllMasterDevices and the device-specific mask.
|
||
|
||
If num_masks is 0, no events have been selected by this client on the
|
||
given window.
|
||
|
||
┌───
|
||
XIQueryPointer
|
||
window: Window
|
||
deviceid: DEVICEID
|
||
▶
|
||
root: Window
|
||
child: Window
|
||
root_x: FP1616
|
||
root_y: FP1616
|
||
win_x: FP1616
|
||
win_y: FP1616
|
||
same_screen: BOOL
|
||
mods: MODIFIERINFO
|
||
group: GROUPINFO
|
||
buttons_len: CARD16
|
||
buttons: SETofBUTTONMASK
|
||
└───
|
||
|
||
Query a master pointer device for its current position.
|
||
|
||
root
|
||
The root window the pointer is logically on.
|
||
child
|
||
The child window of window that contains the pointer or None.
|
||
root_x
|
||
root_y
|
||
Pointer position relative to the root window's origin.
|
||
win_x
|
||
win_y
|
||
Pointer position relative to window or 0 if same_screen is false.
|
||
same_screen
|
||
True if window is on the same screen as the pointer.
|
||
mods
|
||
XKB modifier state on the paired device.
|
||
group
|
||
XKB group state on the paired device.
|
||
buttons_len
|
||
The length of buttons in 4 byte units.
|
||
buttons
|
||
Button state.
|
||
|
||
If the device is not a master pointer device or not a floating slave
|
||
pointer, a BadDevice error results.
|
||
|
||
┌───
|
||
XIWarpPointer
|
||
src_win: Window
|
||
dst_win: Window
|
||
src_x: FP1616
|
||
src_y: FP1616
|
||
src_width: INT16
|
||
src_height: INT16
|
||
dst_x: FP1616
|
||
dst_y: FP1616
|
||
deviceid: DEVICEID
|
||
└───
|
||
|
||
WarpPointer moves the pointer of deviceid as if the user had moved
|
||
the pointer. WarpPointer can only be called for MasterPointer and
|
||
FloatingSlave devices.
|
||
|
||
src_win
|
||
If src_window is not None, the move only takes place if src_window
|
||
contains the pointer and the pointer is contained in the specified
|
||
rectangle of src_window.
|
||
dst_win
|
||
If dst_win is None, this request moves the pointer by offsets
|
||
dst_x/dst_y relative to the current position of the pointer. If
|
||
dst_window is a window, this request moves the pointer to
|
||
dst_x/dst_y relative to dst_win's origin.
|
||
src_x
|
||
src_y
|
||
src_width
|
||
src_height
|
||
Specifies the source window rectangle.
|
||
dst_x
|
||
dst_y
|
||
The relative coordinates to move the pointer if dst_win is None, or
|
||
the absolute coordinates if dst_win is a window.
|
||
deviceid
|
||
The device to warp.
|
||
|
||
This request cannot be used to move the pointer outside the confine-to
|
||
window of an active pointer grab. An attempt will only move the pointer as
|
||
far as the closest edge of the confine-to window.
|
||
|
||
This request will generate events just as if the user had instantaneously
|
||
moved the pointer.
|
||
|
||
┌───
|
||
XIChangeCursor
|
||
win: Window
|
||
cursor: Cursor
|
||
deviceid: DEVICEID
|
||
└───
|
||
|
||
Change a master pointer's cursor on the specified window.
|
||
|
||
window
|
||
The window.
|
||
cursor
|
||
The new cursor or None.
|
||
deviceid
|
||
The master pointer device.
|
||
|
||
Whenever device enters a window W, the cursor shape is selected in the
|
||
following order:
|
||
- if the current window has a device cursor C(d) defined for device,
|
||
display this cursor C(d).
|
||
- otherwise, if the current window has a cursor C(w) defined in the core
|
||
protocol's window attributes, display cursor C(w).
|
||
- repeat on parent window until a cursor has been found.
|
||
|
||
The device cursor for a given window is reset once the window is destroyed
|
||
or the device is removed, whichever comes earlier.
|
||
|
||
If deviceid does not specify a master pointer, a BadDevice error
|
||
is returned.
|
||
|
||
┌───
|
||
XIChangeHierarchy
|
||
num_changes: CARD8
|
||
changes: LISTofHIERARCHYCHANGES
|
||
└───
|
||
|
||
HIERARCHYCHANGE { ADDMASTER, REMOVEMASTER, ATTACHSLAVE, DETACHSLAVE }
|
||
|
||
HIERARCHYCHANGETYPE { AddMaster, RemoveMaster, AttachSlave, DetachSlave }
|
||
|
||
CHANGEMODE { Float, Attach }
|
||
|
||
ADDMASTER { type: HIERARCHYCHANGETYPE
|
||
length: CARD16
|
||
name_len: CARD16
|
||
send_core: BOOL
|
||
enable: BOOL
|
||
name: LISTofCHAR8 }
|
||
|
||
REMOVEMASTER { type: HIERARCHYCHANGETYPE
|
||
length: CARD16
|
||
deviceid: DEVICEID
|
||
return_mode: CHANGEMODE
|
||
return_pointer: DEVICEID
|
||
return_keyboard: DEVICEID }
|
||
|
||
ATTACHSLAVE { type: HIERARCHYCHANGETYPE
|
||
length: CARD16
|
||
deviceid: DEVICEID
|
||
master: DEVICEID }
|
||
|
||
DETACHSLAVE { type: HIERARCHYCHANGETYPE
|
||
length: CARD16
|
||
deviceid: DEVICEID }
|
||
|
||
XIChangeHierarchy allows a client to modify the MD/SD device
|
||
hierarchy (see Section 4).
|
||
|
||
num_changes
|
||
The number of changes to apply to the current hierarchy.
|
||
changes
|
||
The list of changes.
|
||
|
||
The server processes the changes in the order received from the client and
|
||
applies each requested change immediately. If an error occurs, processing
|
||
stops at the current change and returns the number of successfully applied
|
||
changes in the error.
|
||
|
||
ADDMASTER creates a pair of master devices.
|
||
type
|
||
Always AddMaster.
|
||
length
|
||
Length in 4 byte units.
|
||
name_len
|
||
Length of name in bytes.
|
||
send_core
|
||
True if the device should send core events.
|
||
enable
|
||
True if the device is to be enabled immediately.
|
||
name
|
||
The name for the new master devices. The master pointer's name is
|
||
automatically appended with " pointer", the master keyboard's name is
|
||
automatically appended with " keyboard".
|
||
|
||
REMOVEMASTER removes an existing master device.
|
||
type
|
||
Always RemoveMaster.
|
||
length
|
||
Length in 4 byte units.
|
||
deviceid
|
||
The device to remove.
|
||
return_mode
|
||
Return mode for attached slave devices.
|
||
If return_mode is Float, all slave devices are set to floating.
|
||
If return_mode is Attach, slave pointers are attached to
|
||
return_pointer and slave keyboards are attached to
|
||
return_keyboard.
|
||
return_pointer
|
||
return_keyboard
|
||
The master pointer and master keyboard to attach slave devices to, if
|
||
return_mode is Attach. If return_mode is Float, return_pointer
|
||
and return_keyboard are undefined.
|
||
|
||
Removing a master pointer removes the paired master keyboard and vice
|
||
versa.
|
||
|
||
ATTACHSLAVE attaches a slave device to a given master device.
|
||
type
|
||
Always ChangeAttachment.
|
||
length
|
||
Length in 4 byte units.
|
||
deviceid
|
||
Deviceid of the slave device.
|
||
master
|
||
The new master device to attach this slave device to.
|
||
|
||
DETACHSLAVE detaches a slave device from its current master device.
|
||
type
|
||
Always ChangeAttachment.
|
||
length
|
||
Length in 4 byte units.
|
||
deviceid
|
||
Deviceid of the slave device.
|
||
|
||
┌───
|
||
XISetClientPointer
|
||
win: Window
|
||
deviceid: DEVICEID
|
||
└───
|
||
|
||
Set the ClientPointer for the client owning win to the given device.
|
||
|
||
win
|
||
Window or client ID.
|
||
deviceid
|
||
The master pointer or master keyboard that acts as ClientPointer.
|
||
|
||
Some protocol requests are ambiguous and the server has to choose a device
|
||
to provide data for a request or a reply. By default, the server will
|
||
choose a client's ClientPointer device to provide the data, unless the
|
||
client currently has a grab on another device. See section 4.4 for more
|
||
details.
|
||
|
||
If win is None, the ClientPointer for this client is set to the given
|
||
device. Otherwise, if win is a valid window, the ClientPointer for the
|
||
client owning this window is set to the given device. Otherwise, if win is
|
||
not a valid window but a client with the client mask equal to win exists,
|
||
this client's ClientPointer is set to the given device.
|
||
|
||
If deviceid does not specify a master pointer or master keyboard, a
|
||
BadDevice error is returned.
|
||
|
||
If window does not specify a valid window or client ID and is not None, a
|
||
BadWindow error is returned.
|
||
|
||
┌───
|
||
XIGetClientPointer
|
||
win: Window
|
||
▶
|
||
set: BOOL
|
||
deviceid: DEVICEID
|
||
└───
|
||
|
||
Query the ClientPointer for the client owning win.
|
||
|
||
win
|
||
The window or client ID.
|
||
set
|
||
True if the client has a ClientPointer set.
|
||
deviceid
|
||
The master pointer that acts as a ClientPointer if set is True.
|
||
|
||
No difference is made between a ClientPointer set explicitly through
|
||
XISetClientPointer and a ClientPointer implicitly assigned by the server
|
||
in response to an ambiguous request.
|
||
|
||
┌───
|
||
XISetFocus
|
||
focus: Window
|
||
deviceid: DEVICEID
|
||
time: Time
|
||
└───
|
||
|
||
Set the focus for the given device to the given window. Future key events
|
||
from this device are sent to this window.
|
||
This request generates FocusIn and FocusOut events.
|
||
|
||
focus
|
||
A viewable window or None.
|
||
deviceid
|
||
The device to modify the focus window for.
|
||
time
|
||
Specifies the time to change the focus or CurrentTime.
|
||
|
||
If focus is None, key events from this device are discarded until a new
|
||
focus window is set. If focus is a viewable window, key events from this
|
||
device are sent to this window. If the window becomes unviewable, the
|
||
window's first viewable ancestor automatically becomes the focus window
|
||
and FocusIn and FocusOut events are sent as if a client had changed the
|
||
focus window.
|
||
This is equivalent to RevertToParent in the core XSetInputFocus window.
|
||
|
||
This request has no effect if the specified time is earlier than the
|
||
current last-focus-change time or is later than the current X server time.
|
||
Otherwise, the last-focus-change time is set to the specified time.
|
||
|
||
┌───
|
||
XIGetFocus
|
||
deviceid: DEVICEID
|
||
▶
|
||
focus: Window
|
||
└───
|
||
|
||
Return the current focus window for the given device.
|
||
|
||
┌───
|
||
XIGrabDevice
|
||
deviceid: DEVICEID
|
||
grab_window: Window
|
||
owner_events: BOOL
|
||
grab_mode: { Synchronous, Asynchronous }
|
||
paired_device_mode: { Synchronous, Asynchronous }
|
||
time: TIMESTAMP or CurrentTime
|
||
cursor: Cursor
|
||
mask_len: CARD16
|
||
masks: SETofEVENTMASK
|
||
▶
|
||
status: Success, AlreadyGrabbed, Frozen, InvalidTime, NotViewable
|
||
└───
|
||
|
||
This request actively grabs control of the specified input device. Further
|
||
input events from this device are reported only to the grabbing client.
|
||
This request overides any previous active grab by this client for this
|
||
device.
|
||
|
||
deviceid
|
||
The device to grab.
|
||
grab_window
|
||
Events are reported relative to the grab window.
|
||
owner_events
|
||
Specifies whether event will be reported normally or relative to the
|
||
grab window.
|
||
grab_mode
|
||
Specifies if this device will be frozen as a result of the grab.
|
||
paired_device_mode
|
||
Specifies if the master device paired with this device will be frozen
|
||
as a result of the grab.
|
||
time
|
||
A valid server time or CurrentTime.
|
||
cursor
|
||
The cursor to display for the duration of the grab or None.
|
||
mask_len
|
||
Length of mask in 4 byte units.
|
||
mask
|
||
Event mask. An event mask for an event type T is defined as (1 << T).
|
||
status
|
||
Success or the reason why the grab could not be established.
|
||
|
||
The masks parameter specifies which events the client wishes to receive
|
||
while the device is grabbed.
|
||
|
||
If owner-events is False, input events generated from this device are
|
||
reported with respect to grab-window, and are only reported if selected by
|
||
being included in the event-list. If owner-events is True, then if a
|
||
generated event would normally be reported to this client, it is reported
|
||
normally, otherwise the event is reported with respect to the grab-window,
|
||
and is only reported if selected by being included in the event-list. For
|
||
either value of owner-events, unreported events are discarded.
|
||
|
||
If grab-mode is Asynchronous, device event processing continues normally.
|
||
If the device is currently frozen by this client, then processing of
|
||
device events is resumed. If grab-mode is Synchronous, the state of the
|
||
grabbed device (as seen by means of the protocol) appears to freeze,
|
||
and no further device events are generated by the server until the
|
||
grabbing client issues a releasing XIAllowEvents request or until the
|
||
device grab is released. Actual device input events are not lost while the
|
||
device is frozen; they are simply queued for later processing.
|
||
|
||
If the device is a slave device, the paired-device-mode is ignored.
|
||
Otherwise, if this device is a master device and paired-device-mode is
|
||
Asynchronous, event processing is unaffected by activation of the grab. If
|
||
this device is a master device and paired-device-mode is Synchronous, the
|
||
state of the master device paired with this device (as seen by means of the
|
||
protocol) appears to freeze, and no further events are generated by the
|
||
server until the grabbing client issues a releasing XIAllowEvents request
|
||
or until the device grab is released. Actual events are not lost while the
|
||
devices are frozen; they are simply queued for later processing.
|
||
|
||
If the cursor is not None and the device is a master pointer device, the
|
||
cursor will be displayed until the device is ungrabbed.
|
||
|
||
This request fails and returns:
|
||
AlreadyGrabbed: If the device is actively grabbed by some other client.
|
||
NotViewable: If grab-window is not viewable.
|
||
InvalidTime: If the specified time is earlier than the last-grab-time for
|
||
the specified device or later than the current X server time.
|
||
Otherwise, the last-grab-time for the specified device is set
|
||
to the specified time and CurrentTime is replaced by the
|
||
current X server time.
|
||
Frozen: If the device is frozen by an active grab of another client.
|
||
|
||
To release a grab of a device, use XIUngrabDevice.
|
||
|
||
┌───
|
||
XIUngrabDevice
|
||
deviceid: DEVICEID
|
||
time: TIMESTAMP or CurrentTime
|
||
└───
|
||
|
||
This request releases the device if this client has it actively grabbed
|
||
(from either XIGrabDevice, XIGrabDeviceKey or XIGrabDeviceButton) and
|
||
releases any queued events. If any devices were frozen by the grab,
|
||
XIUngrabDevice thaws them.
|
||
|
||
deviceid
|
||
The device to grab.
|
||
time
|
||
A valid server time or CurrentTime.
|
||
|
||
The request has no effect if the specified time is earlier than the
|
||
last-device-grab time or is later than the current server time.
|
||
This request generates FocusIn and FocusOut events.
|
||
An XIUngrabDevice is performed automatically if the event window for an
|
||
active device grab becomes not viewable.
|
||
|
||
┌───
|
||
XIAllowEvents:
|
||
deviceid: DEVICEID
|
||
time: TIMESTAMP or CurrentTime
|
||
event_mode: { AsyncDevice, SyncDevice,
|
||
AsyncPairedDevice, SyncPairedDevice,
|
||
ReplayDevice, AsyncPair, SyncPair }
|
||
└───
|
||
|
||
The XIAllowEvents request releases some queued events if the client
|
||
has caused a device to freeze.
|
||
|
||
deviceid
|
||
The device to grab.
|
||
time
|
||
A valid server time or CurrentTime.
|
||
event_mode
|
||
Specifies whether a device is to be thawed and events are to be
|
||
replayed.
|
||
|
||
The request has no effect if the specified time is earlier than the
|
||
last-grab time of the most recent active grab for the client, or if the
|
||
specified time is later than the current X server time.
|
||
|
||
The following describes the processing that occurs depending on what constant
|
||
you pass to the event-mode argument:
|
||
AsyncDevice:
|
||
If the specified device is frozen by the client, event processing for that
|
||
device continues as usual. If the device is frozen multiple times by the
|
||
client on behalf of multiple separate grabs, AsyncDevice thaws for
|
||
all.
|
||
AsyncDevice has no effect if the specified device is not frozen by the
|
||
client, but the device need not be grabbed by the client.
|
||
SyncDevice:
|
||
If the specified device is frozen and actively grabbed by the client,
|
||
event processing for that device continues normally until the next
|
||
event is reported to the client. At this time, the specified device
|
||
again appears to freeze. However, if the reported event causes the
|
||
grab to be released, the specified device does not freeze.
|
||
SyncDevice has no effect if the specified device is not frozen by the
|
||
client or is not grabbed by the client.
|
||
ReplayDevice:
|
||
If the specified device is actively grabbed by the client and is frozen
|
||
as the result of an event having been sent to the client (either from
|
||
the activation of a XIGrabButton or from a previous XIAllowEvents with
|
||
mode SyncDevice, but not from a Grab), the grab is released and
|
||
that event is completely reprocessed. This time, however, the request
|
||
ignores any passive grabs at or above (towards the root) the
|
||
grab-window of the grab just released.
|
||
The request has no effect if the specified device is not grabbed by
|
||
the client or if it is not frozen as the result of an event.
|
||
AsyncPairedDevice
|
||
If the paired master device is frozen by the client, event processing
|
||
for it continues as usual. If the paired device is frozen multiple
|
||
times by the client on behalf of multiple separate grabs,
|
||
AsyncPairedDevice thaws for all.
|
||
AsyncPairedDevice has no effect if the device is not frozen by the
|
||
client, but those devices need not be grabbed by the client.
|
||
AsyncPairedDevice has no effect if deviceid specifies a slave device.
|
||
SyncPairedDevice
|
||
If the paired master device is frozen by the client, event processing (for
|
||
the paired master device) continues normally until the next button or key
|
||
event is reported to the client for the grabbed device (button event for
|
||
the grabbed device, key or motion event for the device), at which time
|
||
the device again appears to freeze. However, if the reported event causes
|
||
the grab to be released, then the device does not freeze.
|
||
SyncPairedDevice has no effect if the specified device is not grabbed
|
||
by the client or if it is no frozen as the result of an event.
|
||
SyncPairedDevice has no effect if deviceid specifies a slave device.
|
||
SyncPair
|
||
If both the device and the paired master device are frozen by the
|
||
client, event processing (for both devices) continues normally until
|
||
the next XIButtonPress, XIButtonRelease, XIKeyPress, or XIKeyRelease
|
||
event is reported to the client for a grabbed device (button event for
|
||
a pointer, key event for a keyboard), at which time the devices again
|
||
appear to freeze. However, if the reported event causes the grab to be
|
||
released, then the devices do not freeze (but if the other device is
|
||
still grabbed, then a subsequent event for it will still cause both
|
||
devices to freeze).
|
||
SyncPair has no effect unless both the device and the paired master
|
||
device are frozen by the client. If the device or paired master device
|
||
is frozen twice by the client on behalf of two separate grabs,
|
||
SyncPair thaws for both (but a subsequent freeze for SyncPair will
|
||
only freeze each device once).
|
||
SyncPair has no effect if deviceid specifies a slave device.
|
||
AsyncPair
|
||
If the device and the paired master device are frozen by the client,
|
||
event processing for both devices continues normally. If a device is
|
||
frozen twice by the client on behalf of two separate grabs, AsyncBoth
|
||
thaws for both. AsyncPair has no effect unless both the device and the
|
||
paired master device frozen by the client.
|
||
AsyncPair has no effect if deviceid specifies a slave device.
|
||
|
||
┌───
|
||
XIPassiveGrabDevice
|
||
deviceid: DEVICE
|
||
detail: CARD32
|
||
grab_type: GRABTYPE
|
||
grab_window: Window
|
||
cursor: Cursor
|
||
owner_events: Bool
|
||
grab_mode: { Synchronous, Asynchronous }
|
||
paired_device_mode: { Synchronous, Asynchronous }
|
||
num_modifiers: INT16
|
||
mask_len: CARD16
|
||
masks: SETofEVENTMASK
|
||
modifiers: CARD32 or GrabAnyModifier
|
||
▶
|
||
num_modifiers_return: INT16
|
||
modifiers_return: GRABMODIFIERINFO
|
||
└───
|
||
|
||
GRABTYPE { GrabtypeButton, GrabtypeKeycode, GrabtypeEnter,
|
||
GrabTypeFocusIn}
|
||
|
||
GRABMODIFIERINFO { status: Access
|
||
modifiers: CARD32 }
|
||
|
||
Establish an explicit passive grab for a button or keycode
|
||
on the specified input device.
|
||
|
||
cursor
|
||
The cursor to display for the duration of the grab. If grab_type
|
||
is not GrabtypeButton, this argument is ignored.
|
||
deviceid
|
||
The device to establish the passive grab on or AllDevices or
|
||
AllMasterDevices.
|
||
detail
|
||
The button number, or key symbol to grab for.
|
||
Must be 0 for GrabtypeEnter and GrabtypeFocusIn.
|
||
grab_type
|
||
The type of grab to establish.
|
||
grab_window
|
||
Events are reported relative to the grab window.
|
||
grab_mode
|
||
If grab-mode is Asynchronous, device event processing continues
|
||
normally. If the device is currently frozen by this client, then
|
||
processing of device events is resumed. If grab-mode is
|
||
Synchronous, the state of the grabbed device (as seen by means of
|
||
the protocol) appears to freeze, and no further device events are
|
||
generated by the server until the grabbing client issues a
|
||
releasing XIAllowEvents request or until the device grab is
|
||
released. Actual device input events are not lost while the device
|
||
is frozen; they are simply queued for later processing.
|
||
mask_len
|
||
Length of mask in 4 byte units.
|
||
mask
|
||
Event mask. An event mask for an event type T is defined as (1 << T).
|
||
modifiers
|
||
XKB modifier state to activate this passive grab.
|
||
num_modifiers
|
||
Number of elements in modifiers.
|
||
owner_events
|
||
Specifies whether event will be reported normally or relative to the
|
||
grab window.
|
||
num_modifiers_return
|
||
Number of elements in modifiers_return
|
||
modifiers_return
|
||
XKB modifier state that could not be grabbed.
|
||
|
||
If owner-events is False, input events generated from this device are
|
||
reported with respect to grab-window, and are only reported if
|
||
selected by being included in the event-list. If owner-events is
|
||
True, then if a generated event would normally be reported to this
|
||
client, it is reported normally, otherwise the event is reported
|
||
with respect to the grab-window, and is only reported if selected
|
||
by being included in the event-list. For either value of
|
||
owner-events, unreported events are discarded.
|
||
|
||
If deviceid specifies a master pointer, the modifiers of the paired
|
||
master keyboard are used. If deviceid specifies a slave pointer
|
||
the modifiers of the master keyboard paired with the attached master
|
||
pointers are used. If deviceid specifies a slave keyboard, the
|
||
modifiers of the attached master keyboard are used. Note that
|
||
activating a grab on a slave device detaches the device from its
|
||
master. In this case, the modifiers after activation of the grab are
|
||
from the slave device only and may be different to the modifier state
|
||
when the grab was triggered.
|
||
|
||
In the future, if grab_type is GrabtypeButton or GrabtypeKeyboard, the
|
||
device is actively grabbed if:
|
||
- the device is not grabbed, and
|
||
- the specified modifier keys are down, and
|
||
- the grab_type is GrabtypeButton and the button specified in detail
|
||
is logically pressed or the grab_type is GrabtypeKeycode and the
|
||
keycode specified in detail is logically pressed, and
|
||
- the grab_window contains the pointer, and
|
||
- a passive grab on the same button/keycode + modifier
|
||
combination does not exist on an ancestor of grab_window.
|
||
|
||
Otherwise, if grab_type is GrabtypeEnter or GrabtypeFocusIn, the
|
||
device is actively grabbed if:
|
||
- the device is not actively grabbed, and
|
||
- the specified modifier keys are down, and
|
||
- the grab_type is GrabtypeEnter and the device's pointer has moved
|
||
into grab_window or a descendant of grab_window, or the grab_type is
|
||
GrabtypeFocusIn and the device's focus has been set to the
|
||
grab_window or a descendant of grab_window,
|
||
- a passive grab of the same grab_type + modifier combination does not
|
||
does not exist on an ancestor of grab_window.
|
||
|
||
A modifier of GrabAnyModifier is equivalent to issuing the request for
|
||
all possible modifier combinations (including no modifiers). A client
|
||
may request a grab for GrabAnyModifier and explicit modifier
|
||
combinations in the same request.
|
||
|
||
A GrabtypeButton or GrabtypeKeyboard grab is released when all buttons
|
||
or keycode are released, independent of the state of modifier keys.
|
||
A GrabtypeEnter or GrabtypeFocusIn grab is released when the
|
||
pointer or focus leaves the window and all of its descendants,
|
||
independent of the state of modifier keys.
|
||
Note that the logical state of a device (as seen by means of the
|
||
protocol) may lag the physical state if device event processing is
|
||
frozen.
|
||
|
||
This request overrides all previous passive grabs by the same
|
||
client on the same button/key/enter/focus in + modifier combinations
|
||
on the same window.
|
||
|
||
If some other client already has issued a XIPassiveGrabDevice request
|
||
with the same button or keycode and modifier combination, the
|
||
failed modifier combinations is returned in modifiers_return. If some
|
||
other client already has issued an XIPassiveGrabDevice request of
|
||
grab_type XIGrabtypeEnter or XIGrabtypeFocusIn with the same
|
||
grab_window and the same modifier combination, the failed modifier
|
||
combinations are returned in modifiers_return. If num_modifiers_return
|
||
is zero, all passive grabs have been successful.
|
||
|
||
If a button grab or enter grab activates, EnterNotify and LeaveNotify
|
||
events with mode Grab are generated as if the pointer were to suddenly
|
||
warp from its current position some position in the grab_window.
|
||
However, the pointer does not warp, and the pointer position is used
|
||
as both the initial and final positions for the events.
|
||
|
||
If a keycode grab or focus grab activates, FocusIn and FocusOut events
|
||
with mode Grab are generated as if the focus were to change from the
|
||
current window to the grab_window.
|
||
|
||
If an enter or focus in grab activates, additional EnterNotify events
|
||
with mode XIPassiveGrabNotify are generated as if the pointer or focus
|
||
were to suddenly warp from its current position to some position in
|
||
the grab window. These events are sent to the grabbing client only
|
||
and only if the grab event mask has selected for it. If such a passive
|
||
grab deactivates, addional LeaveNotify events with mode
|
||
XIPassiveUngrabNotify are generated and sent to the grabbing client
|
||
before the grab deactivates.
|
||
|
||
┌───
|
||
XIPassiveUngrabDevice
|
||
deviceid: DEVICEID
|
||
detail: CARD32
|
||
grab_type: GRABTYPE
|
||
grab_window: Window
|
||
num_modifiers: INT16
|
||
modifiers: MODIFIERINFO
|
||
└───
|
||
|
||
Release an explicit passive grab on the specified input device.
|
||
|
||
deviceid
|
||
The device to establish the passive grab on.
|
||
detail
|
||
The button number or key symbol to ungrab.
|
||
Must be 0 for GrabtypeEnter and GrabtypeFocusIn.
|
||
grab_type
|
||
The type of grab to establish.
|
||
grab_window
|
||
Events are reported relative to the grab window.
|
||
modifiers
|
||
XKB modifier state to activate this passive grab.
|
||
num_modifiers
|
||
Number of elements in modifiers.
|
||
|
||
This request has no effect if the client does not have a passive grab
|
||
of the same type, same button or keycode (if applicable) and modifier
|
||
combination on the grab_window.
|
||
|
||
┌───
|
||
XIListProperties
|
||
deviceid: DEVICEID
|
||
▶
|
||
num_properties: INT16
|
||
properties: LISTofATOM
|
||
└───
|
||
|
||
List the properties associated with the given device.
|
||
|
||
deviceid
|
||
The device to list the properties for.
|
||
num_atoms
|
||
Number of atoms in the reply
|
||
atoms
|
||
All properties on the device.
|
||
|
||
┌───
|
||
XIChangeProperty
|
||
deviceid: DEVICEID
|
||
property: ATOM
|
||
type: ATOM
|
||
format: { 8, 16, 32 }
|
||
mode: { Append, Prepend, Replace }
|
||
num_items: CARD32
|
||
data: LISTofINT8, or LISTofINT16, or LISTofINT32
|
||
└───
|
||
|
||
Change the given property on the given device.
|
||
|
||
deviceid
|
||
The device to change the property on.
|
||
property
|
||
The property to modify.
|
||
type
|
||
The property's type.
|
||
mode
|
||
One of Append, Prepend, or Replace
|
||
num_items
|
||
Number of items following this request.
|
||
data
|
||
Property data (nitems * format/8 bytes)
|
||
|
||
The type is uninterpreted by the server. The format specifies whether
|
||
the data should be viewed as a list of 8-bit, 16-bit, or 32-bit
|
||
quantities so that the server can correctly byte-swap as necessary.
|
||
|
||
If the mode is Replace, the previous propert y value is discarded. If
|
||
the mode is Prepend or Append, then the type and format must match the
|
||
existing property value (or a Match error results). If the property is
|
||
undefined, it is treated as defined with the correct type and format
|
||
with zero-length data. For Prepend, the data is tacked on to the
|
||
beginning of the existing data, and for Append, it is tacked on to the
|
||
end of the existing data.
|
||
|
||
The lifetime of a property is not tied to the storing client. Properties
|
||
remain until explicitly deleted, until the device is removed, or
|
||
until server reset.
|
||
|
||
A property cannot be deleted by setting nitems to zero. To delete a
|
||
property, use XIDeleteDeviceProperty.
|
||
|
||
This request generates an XIPropertyEvent.
|
||
|
||
┌───
|
||
XIDeleteProperty
|
||
deviceid: DEVICEID
|
||
property: ATOM
|
||
└───
|
||
|
||
Deletes the given property on the given device.
|
||
|
||
deviceid
|
||
The device to delete the property on.
|
||
property
|
||
The property to delete.
|
||
|
||
If the property is deleted, an XIPropertyEvent is generated on the device.
|
||
If the property does not exist, this request does nothing.
|
||
|
||
┌───
|
||
XIGetProperty
|
||
deviceid: DEVICEID
|
||
property: ATOM
|
||
type: Atom or AnyPropertyType
|
||
offset: CARD32
|
||
len: CARD32
|
||
delete: BOOL
|
||
▶
|
||
type: Atom
|
||
bytes_after: CARD32
|
||
num_items: CARD32
|
||
format: { 8, 16, 32 }
|
||
data: LISTofINT8, or LISTofINT16, or LISTofINT32
|
||
└───
|
||
|
||
Get the data for the given property on the given device.
|
||
|
||
deviceid
|
||
The device to retrieve the property data from.
|
||
property
|
||
The property to retrieve the data from..
|
||
type
|
||
The property type to retrieve or AnyPropertyType
|
||
offset
|
||
The offset in 4-byte units.
|
||
len
|
||
Number of bytes to receive in 4-byte units.
|
||
delete
|
||
Delete the property after retrieving the data.
|
||
bytes_after
|
||
Number of unread bytes in the stored property
|
||
num_items
|
||
Number of items in data
|
||
format
|
||
8, 16, or 32
|
||
data
|
||
Property data (nitems * format/8 bytes)
|
||
|
||
If the specified property does not exist for the specified device, then
|
||
the return type is None, the format and bytes-after are zero, and the value is
|
||
empty. The delete argument is ignored in this case. If the specified property
|
||
exists but its type does not match the specified type, then the return
|
||
type is the actual type of the property, the format is the actual format of the
|
||
property (never zero), the bytes-after is the length of the property in bytes
|
||
(even if the format is 16 or 32), and the value is empty. The delete
|
||
argument is ignored in this case. If the specified property exists and
|
||
either AnyPropertyType is specified or the specified type matches the actual
|
||
type of the property, then the return type is the actual type of the property,
|
||
the format is the actual format of the property
|
||
(never zero), and the bytes-after and value are as follows, given:
|
||
N = actual length of the stored property in bytes
|
||
(even if the format is 16 or 32)
|
||
I = 4 * long-offset
|
||
T = N−I
|
||
L = MINIMUM(T, 4 * long-length)
|
||
A = N − (I + L)
|
||
The returned value starts at byte index I in the property (indexing
|
||
from 0), and its length in bytes is L. However, it is a Value error if
|
||
offset is given such that L is negative. The value of bytes_after is A,
|
||
giving the number of trailing unread bytes in the stored property. If
|
||
delete is True and the bytes_after is zero, the property is also
|
||
deleted from the device, and a XIPropertyNotify event is generated on
|
||
the device.
|
||
|
||
|
||
8. Events:
|
||
|
||
An event specifies its length in 4-byte units after the initial 32 bytes.
|
||
Future versions of the protocol may provide additional information
|
||
in the same event, thus increasing the event size. Clients are required to
|
||
always read the number of bytes specified by the event, not the size of the
|
||
event they may have been compiled against.
|
||
|
||
|
||
The following event types are available in XI2.
|
||
|
||
Version 2.0:
|
||
HierarchyChanged
|
||
DeviceChanged
|
||
KeyPress
|
||
KeyRelease
|
||
ButtonPress
|
||
ButtonRelease
|
||
Motion
|
||
RawKeyPress
|
||
RawKeyRelease
|
||
RawButtonPress
|
||
RawButtonRelease
|
||
RawMotion
|
||
Enter
|
||
Leave
|
||
FocusIn
|
||
FocusOut
|
||
PropertyEvent
|
||
|
||
All events have a set of common fields specified as EVENTHEADER.
|
||
|
||
|
||
EVENTHEADER { type: BYTE
|
||
extension: BYTE
|
||
sequenceNumber: CARD16
|
||
length: CARD32
|
||
evtype: CARD16
|
||
deviceid: DEVICEID
|
||
time: Time }
|
||
|
||
type
|
||
Always GenericEvent.
|
||
extension
|
||
Always the X Input extension offset.
|
||
sequenceNumber
|
||
Sequence number of last request processed by the server.
|
||
length
|
||
Length in 4-byte units after the initial 32 bytes.
|
||
evtype
|
||
XI-specific event type.
|
||
deviceid
|
||
Numerical device id for a device.
|
||
time
|
||
Time in ms.
|
||
|
||
|
||
┌───
|
||
HierarchyEvent:
|
||
EVENTHEADER
|
||
flags: SETofHIERARCHYMASK
|
||
num_info: CARD16
|
||
info: LISTofHIERARCHYINFO
|
||
└───
|
||
|
||
|
||
HIERARCHYMASK { MasterAdded, MasterRemoved, SlaveAttached, SlaveDetached,
|
||
SlaveAdded, SlaveRemoved, DeviceEnabled, DeviceDisabled }
|
||
|
||
HIERARCHYINFO { deviceid: DEVICEID,
|
||
attachment: DEVICEID,
|
||
type: DEVICEUSE
|
||
enabled: BOOL
|
||
flags: SETofHIERARCHYMASK}
|
||
|
||
flags
|
||
Set of the changes that have occured, causing this event.
|
||
num_info
|
||
The number of device info structs following the request.
|
||
info:
|
||
The current hierarchy information.
|
||
|
||
An XIHierarchyEvent is sent whenever the device hierarchy been
|
||
changed. The flags specify all types of hierarchy modifiations that have
|
||
occured.
|
||
For all devices, info details the hierarchy information after the
|
||
modification of the hierarchy has occured. For each device specified with
|
||
deviceid:
|
||
- if type is MasterPointer or MasterKeyboard, attachment decribes the
|
||
pairing of this device.
|
||
- if type is SlavePointer or SlaveKeyboard, attachment describes the
|
||
master device this device is attached to.
|
||
- if type is FloatingSlave device, attachment is undefined.
|
||
|
||
enabled
|
||
True if the device is enabled and can send events. A disabled master
|
||
device will not forward events from an attached, enabled slave
|
||
device.
|
||
|
||
Note: Multiple devices may be affected in one hierarchy change,
|
||
deviceid in an XIHierarchyEvent is always the first affected
|
||
device. Clients should ignore deviceid and instead use the devices list.
|
||
|
||
┌───
|
||
DeviceChangedEvent:
|
||
EVENTHEADER
|
||
reason: CHANGEREASON
|
||
source: DEVICEID
|
||
num_classes: CARD16
|
||
classes: LISTofCLASS
|
||
└───
|
||
|
||
CHANGEREASON { SlaveSwitch, DeviceChange }
|
||
|
||
A DeviceChangeEvent is sent whenever a device changes it's capabilities.
|
||
This can happen either by a new slave device sending events through a
|
||
master device, or by a physical device changing capabilities at runtime.
|
||
|
||
reason
|
||
The reason for generating this event.
|
||
If reason is SlaveSwitch, the slave device sending events through
|
||
this device has changed and source specifies the new slave device.
|
||
A SlaveSwitch reason can only occur on a master device.
|
||
If reason is DeviceChange, the device itself has changed through
|
||
other means (e.g. a physical device change) and source is
|
||
the device itself.
|
||
source
|
||
The source of the new classes.
|
||
num_classes
|
||
Number of classes provided.
|
||
classes
|
||
Details the available classes provided by the device. The order the
|
||
classes are provided in is undefined.
|
||
|
||
For a detailed description of classes, see the XQueryInputDevice
|
||
request.
|
||
|
||
┌───
|
||
DeviceEvent:
|
||
EVENTHEADER
|
||
detail: CARD32
|
||
root: Window
|
||
event: Window
|
||
child: Window
|
||
root_x: FP1616
|
||
root_y: FP1616
|
||
event_x: FP1616
|
||
event_y: FP1616
|
||
buttons_len: CARD16
|
||
valuators_len: CARD16
|
||
sourceid: DEVICEID
|
||
mods: MODIFIERINFO
|
||
group: GROUPINFO
|
||
flags: DEVICEEEVENTFLAGS
|
||
buttons: SETofBUTTONMASK
|
||
valuators: SETofVALUATORMASK
|
||
axisvalues: LISTofFP3232
|
||
└───
|
||
|
||
BUTTONBIT { (1 << Button1), (1 << Button2), ... , (1 << ButtonN) }
|
||
VALUATORBIT { (1 << 1), ( 1 << 2), ... ( 1 << n) }
|
||
|
||
MODIFIERINFO { base_mods: CARD32,
|
||
latched_mods: CARD32,
|
||
locked_mods: CARD32,
|
||
effective_mods: CARD32}
|
||
GROUPINFO { base_group: CARD8,
|
||
latched_group: CARD8,
|
||
locked_group: CARD8,
|
||
effective_group: CARD8}
|
||
|
||
DEVICEEVENTFLAGS (all events): none
|
||
DEVICEEVENTFLAGS (key events only): { KeyRepeat }
|
||
DEVICEEVENTFLAGS (pointer events only): none
|
||
|
||
An XIDeviceEvent is generated whenever the logical state of a device
|
||
changes in response to a button press, a button release, a motion, a key
|
||
press or a key release.
|
||
|
||
detail
|
||
The button number or key code, or 0.
|
||
root
|
||
event
|
||
child
|
||
The root window, event window or subwindow, respectively. See core
|
||
protocol specification for more detail.
|
||
root_x
|
||
root_y
|
||
The position of the pointer in screen coordinates (16.16 fixed point).
|
||
event_x
|
||
event_y
|
||
The position of the pointer in screen coordinates relative to the
|
||
event window (16.16 fixed point).
|
||
|
||
buttons_len
|
||
The length of buttons in 4 byte units.
|
||
valuators_len
|
||
The length of valuators in 4 byte units.
|
||
sourceid
|
||
The source device that originally generated the event.
|
||
mods
|
||
XKB modifier state before the event occured.
|
||
group
|
||
XKB group state before the event.
|
||
buttons
|
||
Button state before the event.
|
||
valuators
|
||
Bitmask of valuators provided in axisvalues.
|
||
axisvalues
|
||
Valuator data in device-native resolution.
|
||
flags
|
||
Miscellaneous information about this event; the union of the
|
||
common flag set and either the key or pointer flag set,
|
||
depending on the event type.
|
||
KeyRepeat means that this event is for repeating purposes, and
|
||
the physical state of the key has not changed. This is only
|
||
valid for KeyPress events.
|
||
|
||
Modifier state in mods is detailed as follows:
|
||
base_mods
|
||
XKB base modifier state.
|
||
latched_mods
|
||
XKB latched modifier state.
|
||
locked_mods
|
||
XKB locked modifier state.
|
||
|
||
Group state in group is detailed as follows:
|
||
base_group
|
||
XKB base group state.
|
||
latched_group
|
||
XKB latched group state.
|
||
locked_group
|
||
XKB locked group state.
|
||
|
||
┌───
|
||
RawEvent
|
||
EVENTHEADER
|
||
detail: CARD32
|
||
flags: DEVICEEVENTFLAGS
|
||
valuators_len: CARD16
|
||
valuators: SETofVALUATORMASK
|
||
axisvalues: LISTofFP3232
|
||
axisvalues_raw: LISTofFP3232
|
||
└───
|
||
|
||
A RawDevice event provides the information provided by the driver to the
|
||
client. RawDevice provide both the raw data as supplied by the driver and
|
||
transformed data as used in the server. Transformations include, but are
|
||
not limited to, axis clipping and acceleration.
|
||
Transformed valuator data may be equivalent to raw data. In this case,
|
||
both raw and transformed valuator data is provided.
|
||
RawEvents are sent exclusively to all root windows or to the client
|
||
that grabbed the device only.
|
||
|
||
eventtype
|
||
The type of event that occured on the device.
|
||
detail
|
||
The button number or keycode.
|
||
flags
|
||
Flags as described in DeviceEvent.
|
||
valuators_len
|
||
The length of valuators in 4 byte units.
|
||
valuators
|
||
Bitmask of valuators provided in axisvalues and axisvalues_raw.
|
||
axisvalues
|
||
Valuator data in device-native resolution.
|
||
axisvalues_raw
|
||
Untransformed valuator data in device-native resolution.
|
||
|
||
┌───
|
||
Enter or Leave or FocusIn or FocusOut
|
||
EVENTHEADER
|
||
root: Window
|
||
event: Window
|
||
child: Window
|
||
sourceid: DEVICEID
|
||
root_x: FP1616
|
||
root_y: FP1616
|
||
event_x FP1616
|
||
event_y: FP1616
|
||
mode: NOTIFYMODE
|
||
detail: NOTIFYDETAIL
|
||
same_screen: BOOL
|
||
focus: BOOL
|
||
mods: MODIFIERINFO
|
||
group: GROUPINFO
|
||
buttons_len: CARD16
|
||
buttons: SETofBUTTONMASK
|
||
└───
|
||
|
||
NOTIFYMODE { Normal, Grab, Ungrab }
|
||
NOTIFYDETAIL { Ancestor, Virtual, Inferior, Nonlinear, NonlinearVirtual,
|
||
Pointer, PointerRoot, None }
|
||
|
||
Enter or Leave events are sent whenever a device's pointer enters or
|
||
leaves a window.
|
||
FocusIn or FocusOut events are sent whenever a device's focus is set to or
|
||
away from a window.
|
||
The enter/leave and focus in/out model is described in the core protocol
|
||
specification, Section 11. (EnterNotify, LeaveNotify events).
|
||
|
||
For enter and leave events, the modifier and group state is the state of
|
||
the paired master device if the device is a master device, or the state of
|
||
the attached master keyboard if the device is an attached slave device, or
|
||
zero if the device is a floating slave device.
|
||
|
||
For focus in and out events, the button state is the state of the paired
|
||
master device if the device is a master device, or the state of the
|
||
attached master keyboard if the device is an attached slave device, or
|
||
zero if the device is a floating slave device.
|
||
|
||
root
|
||
event
|
||
child
|
||
The root window, event window, and child window, respectively. See the
|
||
core protocol specification for more detail.
|
||
sourceid
|
||
The device that caused the pointer to move.
|
||
root_x
|
||
root_y
|
||
The pointer coordinates relative to the root window.
|
||
event_x
|
||
event_y
|
||
The pointer coordinates relative to the event window.
|
||
mode
|
||
Normal pointer motion events have mode Normal. Pseudo-motion events
|
||
when a grab activates have mode Grab, and pseudo-motion events when a
|
||
grab deactivates have mode Ungrab. Pseudo-motion events caused by the
|
||
activation or deactivation of a passive enter or focus in grab have mode
|
||
XIPassiveGrabNotify or XIPassiveUngrabNotify.
|
||
detail
|
||
Specifies the relation of the event window to the window the pointer
|
||
entered or left. See the core protocol spec for details.
|
||
same_screen
|
||
True if the event window is on the same screen as the pointer's root
|
||
window.
|
||
focus
|
||
If the event window is the focus window or an inferior of the focus
|
||
window, then focus is True. Otherwise, focus is False. This field is
|
||
unspecified for focus in/out events.
|
||
mods
|
||
XKB modifier state before the event occured.
|
||
group
|
||
XKB group state before the event.
|
||
buttons_len
|
||
The length of buttons in 4 byte units.
|
||
buttons
|
||
Button state before the event.
|
||
|
||
┌───
|
||
XIPropertyEvent
|
||
EVENTHEADER
|
||
property: ATOM
|
||
what: { PropertyCreated, PropertyDeleted, PropertyModified }
|
||
└───
|
||
|
||
XIPropertyEvents are sent whenever a device property is created, deleted or
|
||
modified by a client.
|
||
|
||
property
|
||
The property that has been created, deleted, or modified
|
||
what
|
||
Specifies what has been changed.
|
||
|
||
|
||
❧❧❧❧❧❧❧❧❧❧❧
|