summaryrefslogtreecommitdiff
path: root/specs/encoding.xml
diff options
context:
space:
mode:
Diffstat (limited to 'specs/encoding.xml')
-rw-r--r--specs/encoding.xml2312
1 files changed, 2312 insertions, 0 deletions
diff --git a/specs/encoding.xml b/specs/encoding.xml
new file mode 100644
index 0000000..7b4bceb
--- /dev/null
+++ b/specs/encoding.xml
@@ -0,0 +1,2312 @@
+<appendix id="input_extension_protocol_encoding">
+<title>Input Extension Protocol Encoding</title>
+<para>
+<function>Syntactic Conventions</function>
+</para>
+<para>
+<!-- .LP -->
+All numbers are in decimal,
+unless prefixed with #x, in which case they are in hexadecimal (base 16).
+</para>
+<para>
+<!-- .LP -->
+The general syntax used to describe requests, replies, errors, events, and
+compound types is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<function>NameofThing</function>
+ encode-form
+ ...
+ encode-form
+</literallayout>
+Each encode-form describes a single component.
+</para>
+<para>
+<!-- .LP -->
+For components described in the protocol as:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+name: TYPE
+</literallayout>
+the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+N TYPE name
+</literallayout>
+N is the number of bytes occupied in the data stream,
+and TYPE is the interpretation of those bytes.
+For example,
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i -->
+<!-- .ta 1i 1.5i -->
+depth: CARD8
+</literallayout>
+becomes:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+1 CARD8 depth
+</literallayout>
+For components with a static numeric value the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+N value name
+</literallayout>
+The value is always interpreted as an N-byte unsigned integer.
+For example,
+the first two bytes of a Window error are always zero (indicating an
+error in general) and three (indicating the Window error in particular):
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+1 0 Error
+1 3 code
+</literallayout>
+For components described in the protocol as:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+name: <function>{Name1, ..., NameI}</function>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+N name
+ value1 Name1
+ ...
+ valueI NameI
+</literallayout>
+The value is always interpreted as an N-byte unsigned integer.
+Note that the size of N is sometimes larger than that strictly required
+to encode the values.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+class: <function>{InputOutput, InputOnly, CopyFromParent}</function>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+becomes:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i 3i -->
+<!-- .ta 1i 1.5i 2.5i 3i -->
+2 class
+ 0 CopyFromParent
+ 1 InputOutput
+ 2 InputOnly
+</literallayout>
+For components described in the protocol as:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+NAME: TYPE or <function>Alternative1 ... or AlternativeI</function>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i 3i -->
+<!-- .ta 1i 1.5i 2i 2.5i 3i -->
+N TYPE NAME
+ value1 Alternative1
+ ...
+ valueI AlternativeI
+</literallayout>
+The alternative values are guaranteed not to conflict with the encoding
+of TYPE.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+destination: WINDOW or <function>PointerWindow</function> or <function>InputFocus</function>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+becomes:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2.5i -->
+<!-- .ta 1i 1.5i 2.5i -->
+4 WINDOW destination
+ 0 PointerWindow
+ 1 InputFocus
+</literallayout>
+For components described in the protocol as:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i -->
+<!-- .ta 1i 1.5i -->
+value-mask: BITMASK
+</literallayout>
+the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i -->
+<!-- .ta 1i 1.5i 2i 2.5i -->
+N BITMASK value-mask
+ mask1 mask-name1
+ ...
+ maskI mask-nameI
+</literallayout>
+The individual bits in the mask are specified and named,
+and N is 2 or 4.
+The most-significant bit in a BITMASK is reserved for use in defining
+chained (multiword) bitmasks, as extensions augment existing core requests.
+The precise interpretation of this bit is not yet defined here,
+although a probable mechanism is that a 1-bit indicates that another N bytes
+of bitmask follows, with bits within the overall mask still interpreted
+from least-significant to most-significant with an N-byte unit, with N-byte units
+interpreted in stream order, and with the overall mask being byte-swapped
+in individual N-byte units.
+</para>
+<para>
+<!-- .LP -->
+For LISTofVALUE encodings, the request is followed by a section of the form:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i -->
+<!-- .ta 1i 1.5i -->
+VALUEs
+ encode-form
+ ...
+ encode-form
+</literallayout>
+listing an encode-form for each VALUE.
+The NAME in each encode-form keys to the corresponding BITMASK bit.
+The encoding of a VALUE always occupies four bytes,
+but the number of bytes specified in the encoding-form indicates how
+many of the least-significant bytes are actually used;
+the remaining bytes are unused and their values do not matter.
+</para>
+<para>
+<!-- .LP -->
+In various cases, the number of bytes occupied by a component will be specified
+by a lowercase single-letter variable name instead of a specific numeric
+value, and often some other component will have its value specified as a
+simple numeric expression involving these variables.
+Components specified with such expressions are always interpreted
+as unsigned integers.
+The scope of such variables is always just the enclosing request, reply,
+error, event, or compound type structure.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i -->
+<!-- .ta 1i 1.5i 2i 2.5i -->
+2 3+n request length
+4n LISTofPOINT points
+</literallayout>
+For unused bytes (the values of the bytes are undefined and do not matter),
+the encode-form is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i -->
+<!-- .ta 1i 1.5i 2i 2.5i -->
+N unused
+</literallayout>
+If the number of unused bytes is variable, the encode-form typically is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i -->
+<!-- .ta 1i 1.5i 2i 2.5i -->
+p unused, p=pad(E)
+</literallayout>
+where E is some expression,
+and pad(E) is the number of bytes needed to round E up to a multiple of four.
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 1.5i 2i 2.5i -->
+<!-- .ta 1i 1.5i 2i 2.5i -->
+pad(E) = (4 - (E mod 4)) mod 4
+</literallayout>
+<!-- .ps +2 -->
+<function>Common Types</function>
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+LISTofFOO
+</para>
+<itemizedlist>
+ <listitem>
+ <para>
+In this document the LISTof notation strictly means some number of repetitions
+of the FOO encoding;
+the actual length of the list is encoded elsewhere.
+ </para>
+ </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+SETofFOO
+</para>
+<itemizedlist>
+ <listitem>
+ <para>
+A set is always represented by a bitmask, with a 1-bit indicating presence in
+the set.
+ </para>
+ </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+BITMASK: CARD32
+</para>
+<para>
+<!-- .LP -->
+WINDOW: CARD32
+</para>
+<para>
+<!-- .LP -->
+BYTE: 8-bit value
+</para>
+<para>
+<!-- .LP -->
+INT8: 8-bit signed integer
+</para>
+<para>
+<!-- .LP -->
+INT16: 16-bit signed integer
+</para>
+<para>
+<!-- .LP -->
+INT32: 32-bit signed integer
+</para>
+<para>
+<!-- .LP -->
+CARD8: 8-bit unsigned integer
+</para>
+<para>
+<!-- .LP -->
+CARD16: 16-bit unsigned integer
+</para>
+<para>
+<!-- .LP -->
+CARD32: 32-bit unsigned integer
+</para>
+<para>
+<!-- .LP -->
+TIMESTAMP: CARD32
+</para>
+<para>
+<!-- .LP -->
+EVENTCLASS: CARD32
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+INPUTCLASS
+ 0 KeyClass
+ 1 ButtonClass
+ 2 ValuatorClass
+ 3 FeedbackClass
+ 4 ProximityClass
+ 5 FocusClass
+ 6 OtherClass
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+INPUTCLASS
+ 0 KbdFeedbackClass
+ 1 PtrFeedbackClass
+ 2 StringFeedbackClass
+ 3 IntegerFeedbackClass
+ 4 LedFeedbackClass
+ 5 BellFeedbackClass
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+INPUTINFO
+ 0 KEYINFO
+ 1 BUTTONINFO
+ 2 VALUATORINFO
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+DEVICEMODE
+ 0 Relative
+ 1 Absolute
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+PROXIMITYSTATE
+ 0 InProximity
+ 1 OutOfProximity
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+BOOL
+ 0 False
+ 1 True
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+KEYSYM: CARD32
+</para>
+<para>
+<!-- .LP -->
+KEYCODE: CARD8
+</para>
+<para>
+<!-- .LP -->
+BUTTON: CARD8
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+SETofKEYBUTMASK
+ #x0001 Shift
+ #x0002 Lock
+ #x0004 Control
+ #x0008 Mod1
+ #x0010 Mod2
+ #x0020 Mod3
+ #x0040 Mod4
+ #x0080 Mod5
+ #x0100 Button1
+ #x0200 Button2
+ #x0400 Button3
+ #x0800 Button4
+ #x1000 Button5
+ #xe000 unused but must be zero
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.75i -->
+<!-- .ta .75i 1.75i -->
+SETofKEYMASK
+ encodings are the same as for SETofKEYBUTMASK, except with
+ #xff00 unused but must be zero
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+STRING8: LISTofCARD8
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+STR
+ 1 n length of name in bytes
+ n STRING8 name
+</literallayout>
+<!-- .ps +2 -->
+<function>Errors</function>
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Request
+ 1 0 Error
+ 1 1 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Value
+ 1 0 Error
+ 1 2 code
+ 2 CARD16 sequence number
+ 4 &lt;32-bits&gt; bad value
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Window
+ 1 0 Error
+ 1 3 code
+ 2 CARD16 sequence number
+ 4 CARD32 bad resource id
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Match
+ 1 0 Error
+ 1 8 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Access
+ 1 0 Error
+ 1 10 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Alloc
+ 1 0 Error
+ 1 11 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Name
+ 1 0 Error
+ 1 15 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Device
+ 1 0 Error
+ 1 CARD8 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Event
+ 1 0 Error
+ 1 CARD8 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Mode
+ 1 0 Error
+ 1 CARD8 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+Class
+ 1 0 Error
+ 1 CARD8 code
+ 2 CARD16 sequence number
+ 4 unused
+ 2 CARD16 minor opcode
+ 1 CARD8 major opcode
+ 21 unused
+</literallayout>
+<!-- .ps +2 -->
+Keyboards
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+KEYCODE values are always greater than 7 (and less than 256).
+</para>
+<para>
+<!-- .LP -->
+KEYSYM values with the bit #x10000000 set are reserved as vendor-specific.
+</para>
+<para>
+<!-- .LP -->
+The names and encodings of the standard KEYSYM values are contained in
+<!-- .\"Appendix B, Keysym Encoding. -->
+appendix F.
+</para>
+<para>
+<!-- .LP -->
+<!-- .ps +2 -->
+Pointers
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+BUTTON values are numbered starting with one.
+</para>
+<para>
+<!-- .LP -->
+<!-- .ps +2 -->
+Requests
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetExtensionVersion
+ 1 CARD8 input extension opcode
+ 1 1 GetExtensionVersion opcode
+ 2 2+(n+p)/4 request length
+ 2 n length of name
+ 2 unused
+ n STRING8 name
+ p unused, p=pad(n)
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 1 GetExtensionVersion opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 2 CARD16 major version
+ 2 CARD16 minor version
+ 1 BOOL present
+ 19 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ListInputDevices
+ 1 CARD8 input extension opcode
+ 1 2 ListInputDevices opcode
+ 2 1 request length
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 2 ListInputDevices opcode
+ 2 CARD16 sequence number
+ 4 (n+p)/4 reply length
+ 1 CARD8 number of input devices
+ 23 unused
+ n LISTofDEVICEINFO info for each input device
+ p unused, p=pad(n)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ DEVICEINFO
+ 4 CARD32 device type
+ 1 CARD8 device id
+ 1 CARD8 number of input classes this device reports
+ 1 CARD8 device use
+ 0 IsXPointer
+ 1 IsXKeyboard
+ 2 IsXExtensionDevice
+ 1 unused
+ n LISTofINPUTINFO input info for each input class
+ m STR name
+ p unused, p=pad(m)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ INPUTINFO KEYINFO or BUTTONINFO or VALUATORINFO
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ KEYINFO
+ 1 0 class id
+ 1 8 length
+ 1 KEYCODE minimum keycode
+ 1 KEYCODE maximum keycode
+ 2 CARD16 number of keys
+ 2 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+BUTTONINFO
+ 1 1 class id
+ 1 4 length
+ 2 CARD16 number of buttons
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .75i 2.0i 3.0i -->
+<!-- .ta .2i .75i 2.0i 3.0i -->
+VALUATORINFO
+ 1 2 class id
+ 1 8+12n length
+ 1 n number of axes
+ 1 SETofDEVICEMODE mode
+ 4 CARD32 size of motion buffer
+ 12n LISTofAXISINFO valuator limits
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+AXISINFO
+ 4 CARD32 resolution
+ 4 CARD32 minimum value
+ 4 CARD32 maximum value
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+OpenDevice
+ 1 CARD8 input extension opcode
+ 1 3 OpenDevice opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 3 OpenDevice opcode
+ 2 CARD16 sequence number
+ 4 (n+p)/4 reply length
+ 1 CARD8 number of input classes
+ 23 unused
+ n LISTofINPUTCLASSINFO input class information
+ p unused, p=pad(n)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ INPUTCLASSINFO
+ 1 CARD8 input class id
+ 0 KEY
+ 1 BUTTON
+ 2 VALUATOR
+ 3 FEEDBACK
+ 4 PROXIMITY
+ 5 FOCUS
+ 6 OTHER
+ 1 CARD8 event type base code for this class
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+CloseDevice
+ 1 CARD8 input extension opcode
+ 1 4 CloseDevice opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SetDeviceMode
+ 1 CARD8 input extension opcode
+ 1 5 SetDeviceMode opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 1 CARD8 mode
+ 2 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 5 SetDeviceMode opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 CARD8 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 3 + first_error DeviceBusy
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SelectExtensionEvent
+ 1 CARD8 input extension opcode
+ 1 6 SelectExtensionEvent opcode
+ 2 3+n request length
+ 4 Window event window
+ 2 CARD16 count
+ 2 unused
+ 4n LISTofEVENTCLASS desired events
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetSelectedExtensionEvents
+ 1 CARD8 input extension opcode
+ 1 7 GetSelectedExtensionEvents opcode
+ 2 2 request length
+ 4 Window event window
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 7 GetSelecteExtensionEvents opcode
+ 2 CARD16 sequence number
+ 4 n + m reply length
+ 2 n this client count
+ 2 m all clients count
+ 20 unused
+ 4n LISTofEVENTCLASS this client list
+ 4m LISTofEVENTCLASS all clients list
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangeDeviceDontPropagateList
+ 1 CARD8 input extension opcode
+ 1 8 ChangeDeviceDontPropagateList opcode
+ 2 3+n request length
+ 4 Window event window
+ 2 n count of events
+ 1 mode
+ 0 AddToList
+ 1 DeleteFromList
+ 1 unused
+ 4n LISTofEVENTCLASS desired events
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceDontPropagateList
+ 1 CARD8 input extension opcode
+ 1 9 GetDeviceDontPropagateList opcode
+ 2 2 request length
+ 4 Window event window
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 9 GetDeviceDontPropagateList opcode
+ 2 CARD16 sequence number
+ 4 n reply length
+ 2 n count of events
+ 22 unused
+ 4n LISTofEVENTCLASS don't propagate list
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceMotionEvents
+ 1 CARD8 input extension opcode
+ 1 10 GetDeviceMotionEvents opcode
+ 2 4 request length
+ 4 TIMESTAMP start
+ 0 CurrentTime
+ 4 TIMESTAMP stop
+ 0 CurrentTime
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 10 GetDeviceMotionEvents opcode
+ 2 CARD16 sequence number
+ 4 (m+1)n reply length
+ 4 n number of DEVICETIMECOORDs in events
+ 1 m number of valuators per event
+ 1 CARD8 mode of the device
+ 0 Absolute
+ 1 Relative
+ 18 unused
+ (4m+4)n LISTofDEVICETIMECOORD events
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ DEVICETIMECOORD
+ 4 TIMESTAMP time
+ 4m LISTofINT32 valuators
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangeKeyboardDevice
+ 1 CARD8 input extension opcode
+ 1 11 ChangeKeyboardDevice opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 11 ChangeKeyboardDevice opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 2 DeviceFrozen
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangePointerDevice
+ 1 CARD8 input extension opcode
+ 1 12 ChangePointerDevice opcode
+ 2 2 request length
+ 1 CARD8 x-axis
+ 1 CARD8 y-axis
+ 1 CARD8 device id
+ 1 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 12 ChangePointerDevice opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 2 DeviceFrozen
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GrabDevice
+ 1 CARD8 input extension opcode
+ 1 13 GrabDevice opcode
+ 2 5+n request length
+ 4 WINDOW grab-window
+ 4 TIMESTAMP time
+ 0 CurrentTime
+ 2 n count of events
+ 1 this-device-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 other-devices-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 BOOL owner-events
+ 1 CARD8 device id
+ 2 unused
+ 4n LISTofEVENTCLASS event list
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 13 GrabDevice opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 2 InvalidTime
+ 3 NotViewable
+ 4 Frozen
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+UngrabDevice
+ 1 CARD8 input extension opcode
+ 1 14 UngrabDevice opcode
+ 2 3 request length
+ 4 TIMESTAMP time
+ 0 CurrentTime
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GrabDeviceKey
+ 1 CARD8 input extension opcode
+ 1 15 GrabDeviceKey opcode
+ 2 5+n request length
+ 4 WINDOW grab-window
+ 2 n count of events
+ 2 SETofKEYMASK modifiers
+ #x8000 AnyModifier
+ 1 CARD8 modifier device
+ #x0FF UseXKeyboard
+ 1 CARD8 grabbed device
+ 1 KEYCODE key
+ 0 AnyKey
+ 1 this-device-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 other-devices-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 BOOL owner-events
+ 2 unused
+ 4n LISTofEVENTCLASS event list
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+UngrabDeviceKey
+ 1 CARD8 input extension opcode
+ 1 16 UngrabDeviceKey opcode
+ 2 4 request length
+ 4 WINDOW grab-window
+ 2 SETofKEYMASK modifiers
+ #x8000 AnyModifier
+ 1 CARD8 modifier device
+ #x0FF UseXKeyboard
+ 1 KEYCODE key
+ 0 AnyKey
+ 1 CARD8 grabbed device
+ 3 unused
+
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GrabDeviceButton
+ 1 CARD8 input extension opcode
+ 1 17 GrabDeviceButton opcode
+ 2 5+n request length
+ 4 WINDOW grab-window
+ 1 CARD8 grabbed device
+ 1 CARD8 modifier device
+ #x0FF UseXKeyboard
+ 2 n count of desired events
+ 2 SETofKEYMASK modifiers
+ 1 this-device-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 other-device-mode
+ 0 Synchronous
+ 1 Asynchronous
+ 1 BUTTON button
+ 0 AnyButton
+ 1 BOOL owner-events
+ #x8000 AnyModifier
+ 2 unused
+ 4n LISTofEVENTCLASS event list
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+UngrabDeviceButton
+ 1 CARD8 input extension opcode
+ 1 18 UngrabDeviceButton opcode
+ 2 4 request length
+ 4 WINDOW grab-window
+ 2 SETofKEYMASK modifiers
+ #x8000 AnyModifier
+ 1 CARD8 modifier device
+ #x0FF UseXKeyboard
+ 1 BUTTON button
+ 0 AnyButton
+ 1 CARD8 grabbed device
+ 3 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+AllowDeviceEvents
+ 1 CARD8 input extension opcode
+ 1 19 AllowDeviceEvents opcode
+ 2 3 request length
+ 4 TIMESTAMP time
+ 0 CurrentTime
+ 1 mode
+ 0 AsyncThisDevice
+ 1 SyncThisDevice
+ 2 ReplayThisDevice
+ 3 AsyncOtherDevices
+ 4 AsyncAll
+ 5 SyncAll
+ 1 CARD8 device id
+ 2 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceFocus
+ 1 CARD8 input extension opcode
+ 1 20 GetDeviceFocus opcode
+ 2 2 request length
+ 1 CARD8 device
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 20 GetDeviceFocus opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 4 WINDOW focus
+ 0 None
+ 1 PointerRoot
+ 3 FollowKeyboard
+ 4 TIMESTAMP focus time
+ 1 revert-to
+ 0 None
+ 1 PointerRoot
+ 2 Parent
+ 3 FollowKeyboard
+ 15 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SetDeviceFocus
+ 1 CARD8 input extension opcode
+ 1 21 SetDeviceFocus opcode
+ 2 4 request length
+ 4 WINDOW focus
+ 0 None
+ 1 PointerRoot
+ 3 FollowKeyboard
+ 4 TIMESTAMP time
+ 0 CurrentTime
+ 1 revert-to
+ 0 None
+ 1 PointerRoot
+ 2 Parent
+ 3 FollowKeyboard
+ 1 CARD8 device
+ 2 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetFeedbackControl
+ 1 CARD8 input extension opcode
+ 1 22 GetFeedbackControl opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 22 GetFeedbackControl opcode
+ 2 CARD16 sequence number
+ 4 m/4 reply length
+ 2 n number of feedbacks supported
+ 22 unused
+ m LISTofFEEDBACKSTATE feedbacks
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ FEEDBACKSTATE KBDFEEDBACKSTATE, PTRFEEDBACKSTATE, INTEGERFEEDBACKSTATE,
+ STRINGFEEDBACKSTATE, BELLFEEDBACKSTATE, or LEDFEEDBACKSTATE
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ KBDFEEDBACKSTATE
+ 1 0 feedback class id
+ 1 CARD8 id of this feedback
+ 2 20 length
+ 2 CARD16 pitch
+ 2 CARD16 duration
+ 4 CARD32 led_mask
+ 4 CARD32 led_values
+ 1 global_auto_repeat
+ 0 Off
+ 1 On
+ 1 CARD8 click
+ 1 CARD8 percent
+ 1 unused
+ 32 LISTofCARD8 auto_repeats
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ PTRFEEDBACKSTATE
+ 1 0 feedback class id
+ 1 CARD8 id of this feedback
+ 2 12 length
+ 2 unused
+ 2 CARD16 acceleration-numerator
+ 2 CARD16 acceleration-denominator
+ 2 CARD16 threshold
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ INTEGERFEEDBACKSTATE
+ 1 0 feedback class id
+ 1 CARD8 id of this feedback
+ 2 16 length
+ 4 CARD32 resolution
+ 4 INT32 minimum value
+ 4 INT32 maximum value
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ STRINGFEEDBACKSTATE
+ 1 1 feedback class id
+ 1 CARD8 id of this feedback
+ 2 4n+8 length
+ 2 CARD16 max_symbols
+ 2 n number of keysyms supported
+ 4n LISTofKEYSYM key symbols supported
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ BELLFEEDBACKSTATE
+ 1 1 feedback class id
+ 1 CARD8 id of this feedback
+ 2 12 length
+ 1 CARD8 percent
+ 3 unused
+ 2 CARD16 pitch
+ 2 CARD16 duration
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ LEDFEEDBACKSTATE
+ 1 1 feedback class id
+ 1 CARD8 id of this feedback
+ 2 12 length
+ 4 CARD32 led_mask
+ 4 BITMASK led_values
+ #x0001 On
+ #x0002 Off
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangeFeedbackControl
+ 1 CARD8 input extension opcode
+ 1 23 ChangeFeedbackControl opcode
+ 2 3+n/4 request length
+ 4 BITMASK value-mask (has n bits set to 1)
+ #x0001 keyclick-percent
+ #x0002 bell-percent
+ #x0004 bell-pitch
+ #x0008 bell-duration
+ #x0010 led
+ #x0020 led-mode
+ #x0040 key
+ #x0080 auto-repeat-mode
+ #x0001 string
+ #x0001 integer
+ #x0001 acceleration-numerator
+ #x0002 acceleration-denominator
+ #x0004 acceleration-threshold
+ 1 CARD8 device id
+ 1 CARD8 feedback class id
+ 2 unused
+ n FEEDBACKCLASS
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ FEEDBACKCLASS KBDFEEDBACKCTL, PTRFEEDBACKCTL, INTEGERFEEDBACKCTL,
+ STRINGFEEDBACKCTL, BELLFEEDBACKCTL, or LEDFEEDBACKCTL
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ KBDFEEDBACKCTL
+ 1 0 feedback class id
+ 1 CARD8 id of this feedback
+ 2 20 length
+ 1 KEYCODE key
+ 1 auto-repeat-mode
+ 0 Off
+ 1 On
+ 2 Default
+ 1 INT8 key-click-percent
+ 1 INT8 bell-percent
+ 2 INT16 bell-pitch
+ 2 INT16 bell-duration
+ 4 CARD32 led_mask
+ 4 CARD32 led_values
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ PTRFEEDBACKCTL
+ 1 1 feedback class id
+ 1 CARD8 id of this feedback
+ 2 12 length
+ 2 unused
+ 2 INT16 numerator
+ 2 INT16 denominator
+ 2 INT16 threshold
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ STRINGCTL
+ 1 2 feedback class id
+ 1 CARD8 id of this feedback
+ 2 4n+8 length
+ 2 unused
+ 2 n number of keysyms to display
+ 4n LISTofKEYSYM list of key symbols to display
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ INTEGERCTL
+ 1 3 feedback class id
+ 1 CARD8 id of this feedback
+ 2 8 length
+ 4 INT32 integer to display
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ LEDCTL
+ 1 4 feedback class id
+ 1 CARD8 id of this feedback
+ 2 12 length
+ 4 CARD32 led_mask
+ 4 BITMASK led_values
+ #x0001 On
+ #x0002 Off
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ BELLCTL
+ 1 5 feedback class id
+ 1 CARD8 id of this feedback
+ 2 8 length
+ 1 INT8 percent
+ 3 unused
+ 2 INT16 pitch
+ 2 INT16 duration
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceKeyMapping
+ 1 CARD8 input extension opcode
+ 1 24 GetDeviceKeyMapping opcode
+ 2 2 request length
+ 1 CARD8 device
+ 1 KEYCODE first-keycode
+ 1 CARD8 count
+ 1 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .75i 2.0i 3.0i -->
+<!-- .ta .2i .75i 2.0i 3.0i -->
+ =&gt;
+ 1 1 Reply
+ 1 24 GetDeviceKeyMapping opcode
+ 2 CARD16 sequence number
+ 4 nm reply length (m = count field from the request)
+ 1 n keysyms-per-keycode
+ 23 unused
+ 4nm LISTofKEYSYM keysyms
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .75i 2.0i 3.0i -->
+<!-- .ta .2i .75i 2.0i 3.0i -->
+ChangeDeviceKeyMapping
+ 1 CARD8 input extension opcode
+ 1 25 ChangeDeviceKeyMapping opcode
+ 2 2+nm request length
+ 1 CARD8 device
+ 1 KEYCODE first-keycode
+ 1 m keysyms-per-keycode
+ 1 n keycode-count
+ 4nm LISTofKEYSYM keysyms
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceModifierMapping
+ 1 CARD8 input extension opcode
+ 1 26 GetDeviceModifierMapping opcode
+ 2 2 request length
+ 1 CARD8 device
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 26 GetDeviceModifierMapping opcode
+ 2 CARD16 sequence number
+ 4 2n reply length
+ 1 n keycodes-per-modifier
+ 23 unused
+ 8n LISTofKEYCODE keycodes
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SetDeviceModifierMapping
+ 1 CARD8 input extension opcode
+ 1 27 SetDeviceModifier opcode
+ 2 2+2n request length
+ 1 CARD8 device
+ 1 n keycodes-per-modifier
+ 2 unused
+ 8n LISTofKEYCODE keycodes
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 27 SetDeviceModifierMapping opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 status
+ 0 Success
+ 1 Busy
+ 2 Failed
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceButtonMapping
+ 1 CARD8 input extension opcode
+ 1 28 GetDeviceButtonMapping opcode
+ 2 2 request length
+ 1 CARD8 device
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 28 GetDeviceButtonMapping opcode
+ 2 CARD16 sequence number
+ 4 (n+p)/4 reply length
+ 1 n number of elements in map list
+ 23 unused
+ n LISTofCARD8 map
+ p unused, p=pad(n)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SetDeviceButtonMapping
+ 1 CARD8 input extension opcode
+ 1 29 SetDeviceButtonMapping opcode
+ 2 2+(n+p)/4 request length
+ 1 CARD8 device
+ 1 n length of map
+ 2 unused
+ n LISTofCARD8 map
+ p unused, p=pad(n)
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 29 SetDeviceButtonMapping opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 status
+ 0 Success
+ 1 Busy
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+QueryDeviceState
+ 1 CARD8 input extension opcode
+ 1 30 QueryDeviceState opcode
+ 2 2 request length
+ 1 CARD8 device
+ 3 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 30 QueryDeviceState opcode
+ 2 CARD16 sequence number
+ 4 m/4 reply length
+ 1 n number of input classes
+ 23 unused
+ m LISTofINPUTSTATE
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ INPUTSTATE KEYSTATE or BUTTONSTATE or VALUATORSTATE
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ KEYSTATE
+ 1 CARD8 key input class id
+ 1 36 length
+ 1 CARD8 num_keys
+ 1 unused
+ 32 LISTofCARD8 status of keys
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ BUTTONSTATE
+ 1 CARD8 button input class id
+ 1 36 length
+ 1 CARD8 num_buttons
+ 1 unused
+ 32 LISTofCARD8 status of buttons
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ VALUATORSTATE
+ 1 CARD8 valuator input class id
+ 1 4n + 4 length
+ 1 n number of valuators
+ 1 mode
+ #x01 DeviceMode (0 = Relative, 1 = Absolute)
+ #x02 ProximityState (0 = InProximity, 1 = OutOfProximity)
+ 4n LISTofCARD32 status of valuators
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SendExtensionEvent
+ 1 CARD8 input extension opcode
+ 1 31 SendExtensionEvent opcode
+ 2 4 + 8n + m request length
+ 4 WINDOW destination
+ 1 CARD8 device
+ 1 BOOL propagate
+ 2 CARD16 eventclass count
+ 1 CARD8 num_events
+ 3 unused
+ 32n LISTofEVENTS events to send
+ 4m LISTofEVENTCLASS desired events
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceBell
+ 1 CARD8 input extension opcode
+ 1 32 DeviceBell opcode
+ 2 2 request length
+ 1 CARD8 device id
+ 1 CARD8 feedback id
+ 1 CARD8 feedback class
+ 1 INT8 percent
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+SetDeviceValuators
+ 1 CARD8 input extension opcode
+ 1 33 SetDeviceValuators opcode
+ 2 2 + n request length
+ 1 CARD8 device id
+ 1 CARD8 first valuator
+ 1 n number of valuators
+ 1 unused
+ 4n LISTofINT32 valuator values to set
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 33 SetDeviceValuators opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 CARD8 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 23 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+GetDeviceControl
+ 1 CARD8 input extension opcode
+ 1 34 GetDeviceControl opcode
+ 2 2 request length
+ 2 CARD16 device control type
+ 1 CARD8 device id
+ 1 unused
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 34 GetDeviceControl opcode
+ 2 CARD16 sequence number
+ 4 n/4 reply length
+ 1 CARD8 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 3 + first_error DeviceBusy
+ 23 unused
+ n DEVICESTATE
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DEVICESTATE DEVICERESOLUTIONSTATE
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DEVICERESOLUTIONSTATE
+ 2 0 control type
+ 2 8 + 12n length
+ 4 n num_valuators
+ 4n LISTOfCARD32 resolution values
+ 4n LISTOfCARD32 resolution min_values
+ 4n LISTOfCARD32 resolution max_values
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangeDeviceControl
+ 1 CARD8 input extension opcode
+ 1 35 ChangeDeviceControl opcode
+ 2 2+n/4 request length
+ 2 CARD16 control type
+ 1 CARD8 device id
+ 1 unused
+ n DEVICECONTROL
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DEVICECONTROL DEVICERESOLUTIONCTL
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DEVICERESOLUTIONCTL
+ 2 1 control type
+ 2 8 + 4n length
+ 1 CARD8 first_valuator
+ 1 n num_valuators
+ 2 unused
+ 4n LISTOfCARD32 resolution values
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 3.5i -->
+<!-- .ta .2i .5i 1.5i 3.5i -->
+ =&gt;
+ 1 1 Reply
+ 1 35 ChangeDeviceControl opcode
+ 2 CARD16 sequence number
+ 4 0 reply length
+ 1 CARD8 status
+ 0 Success
+ 1 AlreadyGrabbed
+ 3 + first_error DeviceBusy
+ 23 unused
+</literallayout>
+<!-- .ps +2 -->
+Events
+<!-- .ps -->
+</para>
+<para>
+<!-- .LP -->
+DeviceKeyPress, DeviceKeyRelease, DeviceButtonPress, DeviceButtonRelease,
+ProximityIn, ProximityOut, and DeviceStateNotify events may be followed by
+zero or more DeviceValuator events. DeviceMotionNotify events will be
+followed by one or more DeviceValuator events.
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceValuator
+ 1 CARD8 code
+ 1 CARD8 device id
+ 2 CARD16 sequence number
+ 2 SETofKEYBUTMASK state
+ 1 n number of valuators this device reports
+ 1 m number of first valuator in this event
+ 24 LISTofINT32 valuators
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceKeyPress
+ 1 CARD8 code
+ 1 KEYCODE detail
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceKeyRelease
+ 1 CARD8 code
+ 1 KEYCODE detail
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceButtonPress
+ 1 CARD8 code
+ 1 BUTTON detail
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceButtonRelease
+ 1 CARD8 code
+ 1 BUTTON detail
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceMotionNotify
+ 1 CARD8 code
+ 1 detail
+ 0 Normal
+ 1 Hint
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceFocusIn
+ 1 CARD8 code
+ 1 detail
+ 0 Ancestor
+ 1 Virtual
+ 2 Inferior
+ 3 Nonlinear
+ 4 NonlinearVirtual
+ 5 Pointer
+ 6 PointerRoot
+ 7 None
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW event
+ 1 mode
+ 0 Normal
+ 1 Grab
+ 2 Ungrab
+ 3 WhileGrabbed
+ 1 CARD8 device id
+ 18 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceFocusOut
+ 1 CARD8 code
+ 1 detail
+ 0 Ancestor
+ 1 Virtual
+ 2 Inferior
+ 3 Nonlinear
+ 4 NonlinearVirtual
+ 5 Pointer
+ 6 PointerRoot
+ 7 None
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW event
+ 1 mode
+ 0 Normal
+ 1 Grab
+ 2 Ungrab
+ 3 WhileGrabbed
+ 1 CARD8 device id
+ 18 unused
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ProximityIn
+ 1 CARD8 code
+ 1 unused
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ProximityOut
+ 1 CARD8 code
+ 1 unused
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 4 WINDOW root
+ 4 WINDOW event
+ 4 WINDOW child
+ 0 None
+ 2 INT16 root-x
+ 2 INT16 root-y
+ 2 INT16 event-x
+ 2 INT16 event-y
+ 2 SETofKEYBUTMASK state
+ 1 BOOL same-screen
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+DeviceStateNotify events may be immediately followed by zero or one
+DeviceKeyStateNotify and/ or zero or more DeviceValuator events.
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceStateNotify
+ 1 CARD8 code
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 1 CARD8 num_keys
+ 1 CARD8 num_buttons
+ 1 CARD8 num_valuators
+ 1 CARD8 valuator mode and input classes reported
+ #x01 reporting keys
+ #x02 reporting buttons
+ #x04 reporting valuators
+ #x40 device mode (0 = Relative, 1 = Absolute)
+ #x80 proximity state (0 = InProximity, 1 = OutOfProximity)
+ 4 LISTofCARD8 first 32 keys (if reported)
+ 4 LISTofCARD8 first 32 buttons (if reported)
+ 12 LISTofCARD32 first 3 valuators (if reported)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceKeyStateNotify
+ 1 CARD8 code
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+ 2 CARD16 sequence number
+ 28 LISTofCARD8 state of keys 33-255
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceButtonStateNotify
+ 1 CARD8 code
+ 1 CARD8 device id
+ #x80 MORE_EVENTS follow
+ 2 CARD16 sequence number
+ 28 LISTofCARD8 state of buttons 33-255
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceValuator
+ 1 CARD8 code
+ 1 CARD8 device id
+ 2 CARD16 sequence number
+ 2 SETofKEYBUTMASK state
+ 1 n number of valuators this device reports
+ 1 n number of first valuator in this event
+ 24 LISTofINT32 valuators
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+DeviceMappingNotify
+ 1 CARD8 code
+ 1 CARD8 device id
+ 2 CARD16 sequence number
+ 1 request
+ 0 MappingModifier
+ 1 MappingKeyboard
+ 2 MappingPointer
+ 1 KEYCODE first-keycode
+ 1 CARD8 count
+ 1 unused
+ 4 TIMESTAMP time
+ 20 unused
+</literallayout>
+</para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .2i .5i 1.5i 2.5i -->
+<!-- .ta .2i .5i 1.5i 2.5i -->
+ChangeDeviceNotify
+ 1 CARD8 code
+ 1 CARD8 id of device specified on change request
+ 2 CARD16 sequence number
+ 4 TIMESTAMP time
+ 1 request
+ 0 NewPointer
+ 1 NewKeyboard
+ 23 unused
+</literallayout>
+<!-- .\" print Table of Contents -->
+<!-- .if o .bp \" blank page to make count even -->
+<!-- .bp 1 -->
+<!-- .af PN i -->
+<!-- .PX -->
+
+</appendix>