1<?xml version="1.0" encoding="utf-8"?>
2<!--
3Copyright (C) 2006 Peter Hutterer
4Copyright (C) 2013 Daniel Martin
5All Rights Reserved.
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
24Except as contained in this notice, the names of the authors or their
25institutions shall not be used in advertising or otherwise to promote the
26sale, use or other dealings in this Software without prior written
27authorization from the authors.
28-->
29
30<!-- Specifications:
31     http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt
32     http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt
33-->
34
35<xcb header="xinput" extension-xname="XInputExtension" extension-name="Input"
36     major-version="2" minor-version="4">
37    <import>xfixes</import>
38    <import>xproto</import>
39
40    <!-- ⋅⋅⋅ Types (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
41
42    <typedef oldname="CARD32" newname="EventClass" />
43    <typedef oldname="CARD8"  newname="KeyCode" />
44
45    <!-- ⋅⋅⋅ Types (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
46
47    <typedef oldname="CARD16" newname="DeviceId" />
48    <typedef oldname="INT32"  newname="FP1616" />
49
50    <struct name="FP3232">
51        <field type="INT32"  name="integral" />
52        <field type="CARD32" name="frac" />
53    </struct>
54
55    <!-- ⋅⋅⋅ Requests (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
56
57    <!-- GetExtensionVersion -->
58
59    <request name="GetExtensionVersion" opcode="1">
60        <field type="CARD16" name="name_len" />
61        <pad bytes="2" />
62        <list type="char" name="name">
63            <fieldref>name_len</fieldref>
64        </list>
65        <reply>
66            <field type="CARD8"  name="xi_reply_type" />
67            <field type="CARD16" name="server_major" />
68            <field type="CARD16" name="server_minor" />
69            <field type="BOOL"   name="present" />
70            <pad bytes="19" />
71        </reply>
72    </request>
73
74    <!-- ListInputDevices -->
75
76    <enum name="DeviceUse">
77        <item name="IsXPointer">           <value>0</value> </item>
78        <item name="IsXKeyboard">          <value>1</value> </item>
79        <item name="IsXExtensionDevice">   <value>2</value> </item>
80        <item name="IsXExtensionKeyboard"> <value>3</value> </item>
81        <item name="IsXExtensionPointer">  <value>4</value> </item>
82    </enum>
83
84    <enum name="InputClass">
85        <item name="Key">       <value>0</value> </item>
86        <item name="Button">    <value>1</value> </item>
87        <item name="Valuator">  <value>2</value> </item>
88        <item name="Feedback">  <value>3</value> </item>
89        <item name="Proximity"> <value>4</value> </item>
90        <item name="Focus">     <value>5</value> </item>
91        <item name="Other">     <value>6</value> </item>
92        <!--
93               value Attach=7 is still contained in XI.h as "#define AttachClass"
94               but it was never transmitted over the protocol.
95               (It was used to tag a fake class created by libXi).
96
97               Even the creation of that fake class has been dropped
98               from libXi in 2009 by the following change:
99               http://cgit.freedesktop.org/xorg/lib/libXi/commit/?id=62858c426e6de1b99df660251737233afd335302
100
101               <item name="Attach">    <value>7</value> </item>
102        -->
103    </enum>
104
105    <enum name="ValuatorMode">
106        <item name="Relative"> <value>0</value> </item>
107        <item name="Absolute"> <value>1</value> </item>
108    </enum>
109
110    <struct name="DeviceInfo">
111        <field type="ATOM"  name="device_type" />
112        <field type="CARD8" name="device_id" />
113        <field type="CARD8" name="num_class_info" />
114        <field type="CARD8" name="device_use" enum="DeviceUse" />
115        <pad bytes="1" />
116    </struct>
117
118    <struct name="KeyInfo">
119        <field type="CARD8"   name="class_id" enum="InputClass" />
120        <field type="CARD8"   name="len" />
121        <field type="KeyCode" name="min_keycode" />
122        <field type="KeyCode" name="max_keycode" />
123        <field type="CARD16"  name="num_keys" />
124        <pad bytes="2" />
125    </struct>
126
127    <struct name="ButtonInfo">
128        <field type="CARD8"  name="class_id" enum="InputClass" />
129        <field type="CARD8"  name="len" />
130        <field type="CARD16" name="num_buttons" />
131    </struct>
132
133    <struct name="AxisInfo">
134        <field type="CARD32" name="resolution" />
135        <field type="INT32"  name="minimum" />
136        <field type="INT32"  name="maximum" />
137    </struct>
138
139    <struct name="ValuatorInfo">
140        <field type="CARD8"   name="class_id" enum="InputClass" />
141        <field type="CARD8"   name="len" />
142        <field type="CARD8"   name="axes_len" />
143        <field type="CARD8"   name="mode" enum="ValuatorMode" />
144        <field type="CARD32"  name="motion_size" />
145        <list type="AxisInfo" name="axes">
146            <fieldref>axes_len</fieldref>
147        </list>
148    </struct>
149
150    <struct name="InputInfo">
151        <field type="CARD8" name="class_id" enum="InputClass" />
152        <field type="CARD8" name="len" />
153        <switch name="info">
154            <fieldref>class_id</fieldref>
155            <required_start_align align="4" offset="2" />
156            <case name="key">
157                <enumref ref="InputClass">Key</enumref>
158                <field type="KeyCode" name="min_keycode" />
159                <field type="KeyCode" name="max_keycode" />
160                <field type="CARD16"  name="num_keys" />
161                <pad bytes="2" />
162            </case>
163            <case name="button">
164                <enumref ref="InputClass">Button</enumref>
165                <field type="CARD16"    name="num_buttons" />
166            </case>
167            <case name="valuator">
168                <enumref ref="InputClass">Valuator</enumref>
169                <required_start_align align="4" offset="2" />
170                <field type="CARD8"   name="axes_len" />
171                <field type="CARD8"   name="mode" enum="ValuatorMode" />
172                <field type="CARD32"  name="motion_size" />
173                <list type="AxisInfo" name="axes">
174                    <fieldref>axes_len</fieldref>
175                </list>
176            </case>
177	</switch>
178    </struct>
179
180    <struct name="DeviceName">
181        <field type="CARD8" name="len" />
182        <list type="char"  name="string">
183            <fieldref>len</fieldref>
184        </list>
185    </struct>
186
187    <request name="ListInputDevices" opcode="2">
188        <reply>
189            <field type="CARD8" name="xi_reply_type" />
190            <field type="CARD8" name="devices_len" />
191            <pad bytes="23" />
192            <list type="DeviceInfo" name="devices">
193                <fieldref>devices_len</fieldref>
194            </list>
195            <list type="InputInfo" name="infos">
196                <sumof ref="devices">
197			<fieldref>num_class_info</fieldref>
198		</sumof>
199            </list>
200            <list type="STR" name="names">
201                <fieldref>devices_len</fieldref>
202            </list>
203            <pad align="4" />
204        </reply>
205    </request>
206
207    <!-- OpenDevice -->
208    <typedef oldname="CARD8" newname="EventTypeBase" />
209
210    <struct name="InputClassInfo">
211        <field type="CARD8" name="class_id" enum="InputClass" />
212        <field type="EventTypeBase" name="event_type_base" />
213    </struct>
214
215    <request name="OpenDevice" opcode="3">
216        <field type="CARD8" name="device_id" />
217        <pad bytes="3" />
218        <reply>
219            <field type="CARD8" name="xi_reply_type" />
220            <field type="CARD8" name="num_classes" />
221            <pad bytes="23" />
222            <list type="InputClassInfo" name="class_info">
223                <fieldref>num_classes</fieldref>
224            </list>
225            <pad align="4" />
226        </reply>
227    </request>
228
229    <!-- CloseDevice -->
230
231    <request name="CloseDevice" opcode="4">
232        <field type="CARD8" name="device_id" />
233        <pad bytes="3" />
234    </request>
235
236    <!-- SetDeviceMode -->
237
238    <request name="SetDeviceMode" opcode="5">
239        <field type="CARD8" name="device_id" />
240        <field type="CARD8" name="mode" enum="ValuatorMode" />
241        <pad bytes="2" />
242        <reply>
243            <field type="CARD8" name="xi_reply_type" />
244            <!-- values for status: 0: Success, 1: AlreadyGrabbed -->
245            <field type="CARD8" name="status" enum="GrabStatus" />
246            <pad bytes="23" />
247        </reply>
248    </request>
249
250    <!-- SelectExtensionEvent -->
251
252    <request name="SelectExtensionEvent" opcode="6">
253        <field type="WINDOW" name="window" />
254        <field type="CARD16" name="num_classes" />
255        <pad bytes="2" />
256        <list type="EventClass" name="classes">
257            <fieldref>num_classes</fieldref>
258        </list>
259    </request>
260
261    <!-- GetSelectedExtensionEvents -->
262
263    <request name="GetSelectedExtensionEvents" opcode="7">
264        <field type="WINDOW" name="window" />
265        <reply>
266            <field type="CARD8"  name="xi_reply_type" />
267            <field type="CARD16" name="num_this_classes" />
268            <field type="CARD16" name="num_all_classes" />
269            <pad bytes="20" />
270            <list type="EventClass" name="this_classes">
271                <fieldref>num_this_classes</fieldref>
272            </list>
273            <list type="EventClass" name="all_classes">
274                <fieldref>num_all_classes</fieldref>
275            </list>
276        </reply>
277    </request>
278
279    <!-- ChangeDeviceDontPropagateList -->
280
281    <enum name="PropagateMode">
282        <item name="AddToList">      <value>0</value> </item>
283        <item name="DeleteFromList"> <value>1</value> </item>
284    </enum>
285
286    <request name="ChangeDeviceDontPropagateList" opcode="8">
287        <field type="WINDOW" name="window" />
288        <field type="CARD16" name="num_classes" />
289        <field type="CARD8"  name="mode" enum="PropagateMode" />
290        <pad bytes="1" />
291        <list type="EventClass" name="classes">
292            <fieldref>num_classes</fieldref>
293        </list>
294    </request>
295
296    <!-- GetDeviceDontPropagateList -->
297
298    <request name="GetDeviceDontPropagateList" opcode="9">
299        <field type="WINDOW" name="window" />
300        <reply>
301            <field type="CARD8"  name="xi_reply_type" />
302            <field type="CARD16" name="num_classes" />
303            <pad bytes="22" />
304            <list type="EventClass" name="classes">
305                <fieldref>num_classes</fieldref>
306            </list>
307        </reply>
308    </request>
309
310    <!-- GetDeviceMotionEvents -->
311
312    <struct name="DeviceTimeCoord">
313        <field type="TIMESTAMP" name="time" />
314        <list type="INT32" name="axisvalues">
315            <paramref type="CARD8">num_axes</paramref>
316        </list>
317    </struct>
318
319    <request name="GetDeviceMotionEvents" opcode="10">
320        <field type="TIMESTAMP" name="start" />
321        <field type="TIMESTAMP" name="stop" altenum="Time" />
322        <field type="CARD8"     name="device_id" />
323        <pad bytes="3"/>
324        <reply>
325            <field type="CARD8"  name="xi_reply_type" />
326            <field type="CARD32" name="num_events" />
327            <field type="CARD8"  name="num_axes" />
328            <field type="CARD8"  name="device_mode" enum="ValuatorMode" />
329            <pad bytes="18" />
330            <list type="DeviceTimeCoord" name="events">
331                <fieldref>num_events</fieldref>
332            </list>
333        </reply>
334    </request>
335
336    <!-- ChangeKeyboardDevice -->
337
338    <request name="ChangeKeyboardDevice" opcode="11">
339        <field type="CARD8" name="device_id" />
340        <pad bytes="3" />
341        <reply>
342            <field type="CARD8" name="xi_reply_type" />
343            <!-- only the following GrabStatus-values are valid here:
344                 "Success", "AlreadyGrabbed", and "Frozen"
345            -->
346            <field type="CARD8" name="status" enum="GrabStatus" />
347            <pad bytes="23" />
348        </reply>
349    </request>
350
351    <!-- ChangePointerDevice -->
352
353    <request name="ChangePointerDevice" opcode="12">
354        <field type="CARD8" name="x_axis" />
355        <field type="CARD8" name="y_axis" />
356        <field type="CARD8" name="device_id" />
357        <pad bytes="1" />
358        <reply>
359            <field type="CARD8" name="xi_reply_type" />
360            <!-- only the following GrabStatus-values are valid here:
361                 "Success", "AlreadyGrabbed", and "Frozen"
362            -->
363            <field type="CARD8" name="status" enum="GrabStatus" />
364            <pad bytes="23" />
365        </reply>
366    </request>
367
368    <!-- GrabDevice -->
369
370    <request name="GrabDevice" opcode="13">
371        <field type="WINDOW"    name="grab_window" />
372        <field type="TIMESTAMP" name="time" altenum="Time" />
373        <field type="CARD16"    name="num_classes" />
374        <field type="CARD8"     name="this_device_mode" enum="GrabMode" />
375        <field type="CARD8"     name="other_device_mode" enum="GrabMode" />
376        <field type="BOOL"      name="owner_events" />
377        <field type="CARD8"     name="device_id" />
378        <pad bytes="2" />
379        <list type="EventClass" name="classes">
380            <fieldref>num_classes</fieldref>
381        </list>
382        <reply>
383            <field type="CARD8" name="xi_reply_type" />
384            <field type="CARD8" name="status" enum="GrabStatus" />
385            <pad bytes="23" />
386        </reply>
387    </request>
388
389    <!-- UngrabDevice -->
390
391    <request name="UngrabDevice" opcode="14">
392        <field type="TIMESTAMP" name="time" altenum="Time" />
393        <field type="CARD8"     name="device_id" />
394        <pad bytes="3" />
395    </request>
396
397    <!-- GrabDeviceKey -->
398
399    <enum name="ModifierDevice">
400	<item name="UseXKeyboard"><value>255</value></item> <!-- 0xff -->
401    </enum>
402
403    <request name="GrabDeviceKey" opcode="15">
404        <field type="WINDOW" name="grab_window" />
405        <field type="CARD16" name="num_classes" />
406        <field type="CARD16" name="modifiers" mask="ModMask" />
407        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
408        <field type="CARD8"  name="grabbed_device" />
409        <field type="CARD8"  name="key" altenum="Grab" />
410        <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
411        <field type="CARD8"  name="other_device_mode" enum="GrabMode" />
412        <field type="BOOL"   name="owner_events" />
413        <pad bytes="2" />
414        <list type="EventClass" name="classes">
415            <fieldref>num_classes</fieldref>
416        </list>
417    </request>
418
419    <!-- UngrabDeviceKey -->
420
421    <request name="UngrabDeviceKey" opcode="16">
422        <field type="WINDOW" name="grabWindow" />
423        <field type="CARD16" name="modifiers" mask="ModMask" />
424        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
425        <field type="CARD8"  name="key" altenum="Grab" />
426        <field type="CARD8"  name="grabbed_device" />
427    </request>
428
429    <!-- GrabDeviceButton -->
430
431    <request name="GrabDeviceButton" opcode="17">
432        <field type="WINDOW" name="grab_window" />
433        <field type="CARD8"  name="grabbed_device" />
434        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
435        <field type="CARD16" name="num_classes" />
436        <field type="CARD16" name="modifiers" mask="ModMask" />
437        <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
438        <field type="CARD8"  name="other_device_mode" enum="GrabMode" />
439        <field type="CARD8"  name="button" altenum="Grab" />
440        <field type="BOOL"   name="owner_events" />
441        <pad bytes="2" />
442        <list type="EventClass" name="classes">
443            <fieldref>num_classes</fieldref>
444        </list>
445    </request>
446
447    <!-- UngrabDeviceButton -->
448
449    <request name="UngrabDeviceButton" opcode="18">
450        <field type="WINDOW" name="grab_window" />
451        <field type="CARD16" name="modifiers" mask="ModMask" />
452        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
453        <field type="CARD8"  name="button" altenum="Grab" />
454        <field type="CARD8"  name="grabbed_device" />
455        <pad bytes="3" />
456    </request>
457
458    <!-- AllowDeviceEvents -->
459
460    <enum name="DeviceInputMode">
461        <item name="AsyncThisDevice">   <value>0</value> </item>
462        <item name="SyncThisDevice">    <value>1</value> </item>
463        <item name="ReplayThisDevice">  <value>2</value> </item>
464        <item name="AsyncOtherDevices"> <value>3</value> </item>
465        <item name="AsyncAll">          <value>4</value> </item>
466        <item name="SyncAll">           <value>5</value> </item>
467    </enum>
468
469    <request name="AllowDeviceEvents" opcode="19">
470        <field type="TIMESTAMP" name="time" altenum="Time" />
471        <field type="CARD8"     name="mode" enum="DeviceInputMode" />
472        <field type="CARD8"     name="device_id" />
473        <pad bytes="2" />
474    </request>
475
476    <!-- GetDeviceFocus -->
477
478    <request name="GetDeviceFocus" opcode="20">
479        <field type="CARD8" name="device_id" />
480        <pad bytes="3" />
481        <reply>
482            <field type="CARD8"     name="xi_reply_type" />
483            <field type="WINDOW"    name="focus" altenum="InputFocus" />
484            <field type="TIMESTAMP" name="time" />
485            <field type="CARD8"     name="revert_to" enum="InputFocus" />
486            <pad bytes="15" />
487        </reply>
488    </request>
489
490    <!-- SetDeviceFocus -->
491
492    <request name="SetDeviceFocus" opcode="21">
493        <field type="WINDOW"    name="focus" altenum="InputFocus" />
494        <field type="TIMESTAMP" name="time" altenum="Time" />
495        <field type="CARD8"     name="revert_to" enum="InputFocus" />
496        <field type="CARD8"     name="device_id" />
497        <pad bytes="2" />
498    </request>
499
500    <!-- GetFeedbackControl -->
501
502    <enum name="FeedbackClass">
503        <item name="Keyboard"> <value>0</value> </item>
504        <item name="Pointer">  <value>1</value> </item>
505        <item name="String">   <value>2</value> </item>
506        <item name="Integer">  <value>3</value> </item>
507        <item name="Led">      <value>4</value> </item>
508        <item name="Bell">     <value>5</value> </item>
509    </enum>
510
511    <struct name="KbdFeedbackState">
512        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
513        <field type="CARD8"  name="feedback_id" />
514        <field type="CARD16" name="len" />
515        <field type="CARD16" name="pitch" />
516        <field type="CARD16" name="duration" />
517        <field type="CARD32" name="led_mask" />
518        <field type="CARD32" name="led_values" />
519        <field type="BOOL"   name="global_auto_repeat" />
520        <field type="CARD8"  name="click" />
521        <field type="CARD8"  name="percent" />
522        <pad bytes="1" />
523        <list type="CARD8" name="auto_repeats">
524            <value>32</value>
525        </list>
526    </struct>
527
528    <struct name="PtrFeedbackState">
529        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
530        <field type="CARD8"  name="feedback_id" />
531        <field type="CARD16" name="len" />
532        <pad bytes="2" />
533        <field type="CARD16" name="accel_num" />
534        <field type="CARD16" name="accel_denom" />
535        <field type="CARD16" name="threshold" />
536    </struct>
537
538    <struct name="IntegerFeedbackState">
539        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
540        <field type="CARD8"  name="feedback_id" />
541        <field type="CARD16" name="len" />
542        <field type="CARD32" name="resolution" />
543        <field type="INT32"  name="min_value" />
544        <field type="INT32"  name="max_value" />
545    </struct>
546
547    <struct name="StringFeedbackState">
548        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
549        <field type="CARD8"  name="feedback_id" />
550        <field type="CARD16" name="len" />
551        <field type="CARD16" name="max_symbols" />
552        <field type="CARD16" name="num_keysyms" />
553        <list type="KEYSYM"  name="keysyms">
554            <fieldref>num_keysyms</fieldref>
555        </list>
556    </struct>
557
558    <struct name="BellFeedbackState">
559        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
560        <field type="CARD8"  name="feedback_id" />
561        <field type="CARD16" name="len" />
562        <field type="CARD8"  name="percent" />
563        <pad bytes="3" />
564        <field type="CARD16" name="pitch" />
565        <field type="CARD16" name="duration" />
566    </struct>
567
568    <struct name="LedFeedbackState">
569        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
570        <field type="CARD8"  name="feedback_id" />
571        <field type="CARD16" name="len" />
572        <field type="CARD32" name="led_mask" />
573        <field type="CARD32" name="led_values" />
574    </struct>
575
576    <struct name="FeedbackState">
577        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
578        <field type="CARD8"  name="feedback_id" />
579        <field type="CARD16" name="len" />
580        <switch name="data">
581            <fieldref>class_id</fieldref>
582            <case name="keyboard">
583                <enumref ref="FeedbackClass">Keyboard</enumref>
584                <field type="CARD16" name="pitch" />
585                <field type="CARD16" name="duration" />
586                <field type="CARD32" name="led_mask" />
587                <field type="CARD32" name="led_values" />
588                <field type="BOOL"   name="global_auto_repeat" />
589                <field type="CARD8"  name="click" />
590                <field type="CARD8"  name="percent" />
591                <pad bytes="1" />
592                <list type="CARD8" name="auto_repeats">
593                    <value>32</value>
594                </list>
595            </case>
596            <case name="pointer">
597                <enumref ref="FeedbackClass">Pointer</enumref>
598                <pad bytes="2" />
599                <field type="CARD16" name="accel_num" />
600                <field type="CARD16" name="accel_denom" />
601                <field type="CARD16" name="threshold" />
602            </case>
603            <case name="string">
604                <enumref ref="FeedbackClass">String</enumref>
605                <field type="CARD16" name="max_symbols" />
606                <field type="CARD16" name="num_keysyms" />
607                <list type="KEYSYM"  name="keysyms">
608	            <fieldref>num_keysyms</fieldref>
609	        </list>
610            </case>
611            <case name="integer">
612                <enumref ref="FeedbackClass">Integer</enumref>
613                <field type="CARD32" name="resolution" />
614                <field type="INT32"  name="min_value" />
615                <field type="INT32"  name="max_value" />
616            </case>
617            <case name="led">
618                <enumref ref="FeedbackClass">Led</enumref>
619                <field type="CARD32" name="led_mask" />
620                <field type="CARD32" name="led_values" />
621            </case>
622            <case name="bell">
623                <enumref ref="FeedbackClass">Bell</enumref>
624                <field type="CARD8"  name="percent" />
625                <pad bytes="3" />
626                <field type="CARD16" name="pitch" />
627                <field type="CARD16" name="duration" />
628            </case>
629        </switch>
630    </struct>
631
632    <request name="GetFeedbackControl" opcode="22">
633        <field type="CARD8" name="device_id" />
634        <pad bytes="3" />
635        <reply>
636            <field type="CARD8"  name="xi_reply_type" />
637            <field type="CARD16" name="num_feedbacks" />
638            <pad bytes="22" />
639            <list type="FeedbackState" name="feedbacks">
640                <fieldref>num_feedbacks</fieldref>
641            </list>
642        </reply>
643    </request>
644
645    <!-- ChangeFeedbackControl -->
646
647    <struct name="KbdFeedbackCtl">
648        <field type="CARD8"   name="class_id" enum="FeedbackClass" />
649        <field type="CARD8"   name="feedback_id" />
650        <field type="CARD16"  name="len" />
651        <field type="KeyCode" name="key" />
652        <field type="CARD8"   name="auto_repeat_mode" />
653        <field type="INT8"    name="key_click_percent" />
654        <field type="INT8"    name="bell_percent" />
655        <field type="INT16"   name="bell_pitch" />
656        <field type="INT16"   name="bell_duration" />
657        <field type="CARD32"  name="led_mask" />
658        <field type="CARD32"  name="led_values" />
659    </struct>
660
661    <struct name="PtrFeedbackCtl">
662        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
663        <field type="CARD8"  name="feedback_id" />
664        <field type="CARD16" name="len" />
665        <pad bytes="2" />
666        <field type="INT16"  name="num" />
667        <field type="INT16"  name="denom" />
668        <field type="INT16"  name="threshold" />
669    </struct>
670
671    <struct name="IntegerFeedbackCtl">
672        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
673        <field type="CARD8"  name="feedback_id" />
674        <field type="CARD16" name="len" />
675        <field type="INT32"  name="int_to_display" />
676    </struct>
677
678    <struct name="StringFeedbackCtl">
679        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
680        <field type="CARD8"  name="feedback_id" />
681        <field type="CARD16" name="len" />
682        <pad bytes="2" />
683        <field type="CARD16" name="num_keysyms" />
684        <list type="KEYSYM"  name="keysyms">
685            <fieldref>num_keysyms</fieldref>
686        </list>
687    </struct>
688
689    <struct name="BellFeedbackCtl">
690        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
691        <field type="CARD8"  name="feedback_id" />
692        <field type="CARD16" name="len" />
693        <field type="INT8"   name="percent" />
694        <pad bytes="3" />
695        <field type="INT16"  name="pitch" />
696        <field type="INT16"  name="duration" />
697    </struct>
698
699    <struct name="LedFeedbackCtl">
700        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
701        <field type="CARD8"  name="feedback_id" />
702        <field type="CARD16" name="len" />
703        <field type="CARD32" name="led_mask" />
704        <field type="CARD32" name="led_values" />
705    </struct>
706
707    <struct name="FeedbackCtl">
708        <field type="CARD8"  name="class_id" enum="FeedbackClass" />
709        <field type="CARD8"  name="feedback_id" />
710        <field type="CARD16" name="len" />
711        <switch name="data">
712	    <fieldref>class_id</fieldref>
713            <case name="keyboard">
714                <enumref ref="FeedbackClass">Keyboard</enumref>
715		<field type="KeyCode" name="key" />
716		<field type="CARD8"   name="auto_repeat_mode" />
717		<field type="INT8"    name="key_click_percent" />
718		<field type="INT8"    name="bell_percent" />
719		<field type="INT16"   name="bell_pitch" />
720		<field type="INT16"   name="bell_duration" />
721		<field type="CARD32"  name="led_mask" />
722		<field type="CARD32"  name="led_values" />
723            </case>
724            <case name="pointer">
725                <enumref ref="FeedbackClass">Pointer</enumref>
726		<pad bytes="2" />
727		<field type="INT16"  name="num" />
728		<field type="INT16"  name="denom" />
729		<field type="INT16"  name="threshold" />
730            </case>
731            <case name="string">
732                <enumref ref="FeedbackClass">String</enumref>
733		<pad bytes="2" />
734		<field type="CARD16" name="num_keysyms" />
735		<list type="KEYSYM"  name="keysyms">
736		    <fieldref>num_keysyms</fieldref>
737		</list>
738            </case>
739            <case name="integer">
740                <enumref ref="FeedbackClass">Integer</enumref>
741	        <field type="INT32"  name="int_to_display" />
742            </case>
743            <case name="led">
744                <enumref ref="FeedbackClass">Led</enumref>
745		<field type="CARD32" name="led_mask" />
746		<field type="CARD32" name="led_values" />
747            </case>
748            <case name="bell">
749                <enumref ref="FeedbackClass">Bell</enumref>
750		<field type="INT8"   name="percent" />
751		<pad bytes="3" />
752		<field type="INT16"  name="pitch" />
753		<field type="INT16"  name="duration" />
754            </case>
755	</switch>
756    </struct>
757
758    <enum name="ChangeFeedbackControlMask">
759        <item name="KeyClickPercent">  <bit>0</bit> </item> <!-- 0x01 -->
760        <item name="Percent">          <bit>1</bit> </item> <!-- 0x02 -->
761        <item name="Pitch">            <bit>2</bit> </item> <!-- 0x04 -->
762        <item name="Duration">         <bit>3</bit> </item> <!-- 0x08 -->
763        <item name="Led">              <bit>4</bit> </item> <!-- 0x10 -->
764        <item name="LedMode">          <bit>5</bit> </item> <!-- 0x20 -->
765        <item name="Key">              <bit>6</bit> </item> <!-- 0x40 -->
766        <item name="AutoRepeatMode">   <bit>7</bit> </item> <!-- 0x80 -->
767        <item name="String">           <bit>0</bit> </item> <!-- 0x01 -->
768        <item name="Integer">          <bit>0</bit> </item> <!-- 0x01 -->
769        <item name="AccelNum">         <bit>0</bit> </item> <!-- 0x01 -->
770        <item name="AccelDenom">       <bit>1</bit> </item> <!-- 0x02 -->
771        <item name="Threshold">        <bit>2</bit> </item> <!-- 0x04 -->
772    </enum>
773
774    <request name="ChangeFeedbackControl" opcode="23">
775        <field type="CARD32"      name="mask" mask="ChangeFeedbackControlMask" />
776        <field type="CARD8"       name="device_id" />
777        <field type="CARD8"       name="feedback_id" />
778        <pad bytes="2" />
779        <field type="FeedbackCtl" name="feedback" />
780    </request>
781
782    <!-- GetDeviceKeyMapping -->
783
784    <request name="GetDeviceKeyMapping" opcode="24">
785        <field type="CARD8"   name="device_id" />
786        <field type="KeyCode" name="first_keycode" />
787        <field type="CARD8"   name="count" />
788        <pad bytes="1" />
789        <reply>
790            <field type="CARD8" name="xi_reply_type" />
791            <field type="CARD8" name="keysyms_per_keycode" />
792            <pad bytes="23" />
793            <list type="KEYSYM" name="keysyms">
794                <!-- 'length' is a field in the header -->
795                <fieldref>length</fieldref>
796            </list>
797        </reply>
798    </request>
799
800    <!-- ChangeDeviceKeyMapping -->
801
802    <request name="ChangeDeviceKeyMapping" opcode="25">
803        <field type="CARD8"   name="device_id" />
804        <field type="KeyCode" name="first_keycode" />
805        <field type="CARD8"   name="keysyms_per_keycode" />
806        <field type="CARD8"   name="keycode_count" />
807        <list type="KEYSYM"   name="keysyms">
808            <op op="*">
809                <fieldref>keycode_count</fieldref>
810                <fieldref>keysyms_per_keycode</fieldref>
811            </op>
812        </list>
813    </request>
814
815    <!-- GetDeviceModifierMapping -->
816
817    <request name="GetDeviceModifierMapping" opcode="26">
818        <field type="CARD8" name="device_id" />
819        <pad bytes="3" />
820        <reply>
821            <field type="CARD8" name="xi_reply_type" />
822            <field type="CARD8" name="keycodes_per_modifier" />
823            <pad bytes="23" />
824            <list type="CARD8"  name="keymaps">
825                <op op="*">
826                    <fieldref>keycodes_per_modifier</fieldref>
827                    <value>8</value>
828                </op>
829            </list>
830        </reply>
831    </request>
832
833    <!-- SetDeviceModifierMapping -->
834
835    <request name="SetDeviceModifierMapping" opcode="27">
836        <field type="CARD8" name="device_id" />
837        <field type="CARD8" name="keycodes_per_modifier" />
838        <pad bytes="2" />
839        <list type="CARD8" name="keymaps">
840            <op op="*">
841                <fieldref>keycodes_per_modifier</fieldref>
842                <value>8</value>
843            </op>
844        </list>
845        <reply>
846            <field type="CARD8" name="xi_reply_type" />
847            <field type="CARD8" name="status" enum="MappingStatus" />
848            <pad bytes="23" />
849        </reply>
850    </request>
851
852    <!-- GetDeviceButtonMapping -->
853
854    <request name="GetDeviceButtonMapping" opcode="28">
855        <field type="CARD8" name="device_id" />
856        <pad bytes="3" />
857        <reply>
858            <field type="CARD8" name="xi_reply_type" />
859            <field type="CARD8" name="map_size" />
860            <pad bytes="23" />
861            <list type="CARD8" name="map">
862                <fieldref>map_size</fieldref>
863            </list>
864            <pad align="4" />
865        </reply>
866    </request>
867
868    <!-- SetDeviceButtonMapping -->
869
870    <request name="SetDeviceButtonMapping" opcode="29">
871        <field type="CARD8" name="device_id" />
872        <field type="CARD8" name="map_size" />
873        <pad bytes="2" />
874        <list type="CARD8" name="map">
875            <fieldref>map_size</fieldref>
876        </list>
877        <reply>
878            <field type="CARD8" name="xi_reply_type" />
879            <field type="CARD8" name="status" enum="MappingStatus" />
880            <pad bytes="23" />
881        </reply>
882    </request>
883
884    <!-- QueryDeviceState -->
885
886    <struct name="KeyState">
887        <field type="CARD8" name="class_id" enum="InputClass" />
888        <field type="CARD8" name="len" />
889        <field type="CARD8" name="num_keys" />
890        <pad bytes="1" />
891        <list type="CARD8" name="keys">
892            <value>32</value>
893        </list>
894    </struct>
895
896    <struct name="ButtonState">
897        <field type="CARD8" name="class_id" enum="InputClass" />
898        <field type="CARD8" name="len" />
899        <field type="CARD8" name="num_buttons" />
900        <pad bytes="1" />
901        <list type="CARD8" name="buttons">
902            <value>32</value>
903        </list>
904    </struct>
905
906    <enum name="ValuatorStateModeMask">
907        <item name="DeviceModeAbsolute"> <bit>0</bit> </item>
908        <item name="OutOfProximity">     <bit>1</bit> </item>
909    </enum>
910
911    <struct name="ValuatorState">
912        <field type="CARD8" name="class_id" enum="InputClass" />
913        <field type="CARD8" name="len" />
914        <field type="CARD8" name="num_valuators" />
915        <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
916        <list type="INT32" name="valuators">
917            <fieldref>num_valuators</fieldref>
918        </list>
919    </struct>
920
921    <struct name="InputState">
922        <field type="CARD8" name="class_id" enum="InputClass" />
923        <field type="CARD8" name="len" />
924        <switch name="data">
925            <fieldref>class_id</fieldref>
926            <required_start_align align="4" offset="2" />
927            <case name="key">
928                <enumref ref="InputClass">Key</enumref>
929                <required_start_align align="4" offset="2" />
930                <field type="CARD8" name="num_keys" />
931                <pad bytes="1" />
932                <list type="CARD8" name="keys">
933                    <value>32</value>
934                </list>
935            </case>
936            <case name="button">
937                <enumref ref="InputClass">Button</enumref>
938                <field type="CARD8" name="num_buttons" />
939                <pad bytes="1" />
940                <list type="CARD8" name="buttons">
941                    <value>32</value>
942                </list>
943            </case>
944            <case name="valuator">
945                <enumref ref="InputClass">Valuator</enumref>
946                <required_start_align align="4" offset="2" />
947                <field type="CARD8" name="num_valuators" />
948                <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
949                <list type="INT32" name="valuators">
950                    <fieldref>num_valuators</fieldref>
951                </list>
952            </case>
953        </switch>
954    </struct>
955
956    <request name="QueryDeviceState" opcode="30">
957        <field type="CARD8" name="device_id" />
958        <pad bytes="3" />
959        <reply>
960            <field type="CARD8" name="xi_reply_type" />
961            <field type="CARD8" name="num_classes" />
962            <pad bytes="23" />
963            <list type="InputState" name="classes">
964                <fieldref>num_classes</fieldref>
965            </list>
966        </reply>
967    </request>
968
969    <!-- SendExtensionEvent (opcode 16) has to be defined after the events
970         because we do not support backward references -->
971
972    <!-- DeviceBell -->
973
974    <request name="DeviceBell" opcode="32">
975        <field type="CARD8" name="device_id" />
976        <field type="CARD8" name="feedback_id" />
977        <field type="CARD8" name="feedback_class" />
978        <field type="INT8"  name="percent" />
979    </request>
980
981    <!-- SetDeviceValuators -->
982
983    <request name="SetDeviceValuators" opcode="33">
984        <field type="CARD8" name="device_id" />
985        <field type="CARD8" name="first_valuator" />
986        <field type="CARD8" name="num_valuators" />
987        <pad bytes="1" />
988        <list type="INT32" name="valuators">
989            <fieldref>num_valuators</fieldref>
990        </list>
991        <reply>
992            <field type="CARD8" name="xi_reply_type" />
993            <field type="CARD8" name="status" enum="GrabStatus" />
994            <pad bytes="23" />
995        </reply>
996    </request>
997
998    <!-- GetDeviceControl -->
999
1000    <enum name="DeviceControl">
1001        <item name="resolution"> <value>1</value> </item>
1002        <item name="abs_calib">  <value>2</value> </item>
1003        <item name="core">       <value>3</value> </item>
1004        <item name="enable">     <value>4</value> </item>
1005        <item name="abs_area">   <value>5</value> </item>
1006    </enum>
1007
1008    <struct name="DeviceResolutionState">
1009        <field type="CARD16" name="control_id" enum="DeviceControl" />
1010        <field type="CARD16" name="len" />
1011        <field type="CARD32" name="num_valuators" />
1012        <list type="CARD32"  name="resolution_values">
1013            <fieldref>num_valuators</fieldref>
1014        </list>
1015        <list type="CARD32" name="resolution_min">
1016            <fieldref>num_valuators</fieldref>
1017        </list>
1018        <list type="CARD32" name="resolution_max">
1019            <fieldref>num_valuators</fieldref>
1020        </list>
1021    </struct>
1022
1023    <struct name="DeviceAbsCalibState">
1024        <field type="CARD16" name="control_id" enum="DeviceControl" />
1025        <field type="CARD16" name="len" />
1026        <field type="INT32"  name="min_x" />
1027        <field type="INT32"  name="max_x" />
1028        <field type="INT32"  name="min_y" />
1029        <field type="INT32"  name="max_y" />
1030        <field type="CARD32" name="flip_x" />
1031        <field type="CARD32" name="flip_y" />
1032        <field type="CARD32" name="rotation" />
1033        <field type="CARD32" name="button_threshold" />
1034    </struct>
1035
1036    <struct name="DeviceAbsAreaState">
1037        <field type="CARD16" name="control_id" enum="DeviceControl" />
1038        <field type="CARD16" name="len" />
1039        <field type="CARD32" name="offset_x" />
1040        <field type="CARD32" name="offset_y" />
1041        <field type="CARD32" name="width" />
1042        <field type="CARD32" name="height" />
1043        <field type="CARD32" name="screen" />
1044        <field type="CARD32" name="following" />
1045    </struct>
1046
1047    <struct name="DeviceCoreState">
1048        <field type="CARD16" name="control_id" enum="DeviceControl" />
1049        <field type="CARD16" name="len" />
1050        <field type="CARD8"  name="status" />
1051        <field type="CARD8"  name="iscore" />
1052        <pad bytes="2" />
1053    </struct>
1054
1055    <struct name="DeviceEnableState">
1056        <field type="CARD16" name="control_id" enum="DeviceControl" />
1057        <field type="CARD16" name="len" />
1058        <field type="CARD8"  name="enable" />
1059        <pad bytes="3" />
1060    </struct>
1061
1062    <struct name="DeviceState">
1063        <field type="CARD16" name="control_id" enum="DeviceControl" />
1064        <field type="CARD16" name="len" />
1065        <switch name="data">
1066            <fieldref>control_id</fieldref>
1067            <case name="resolution">
1068                <enumref ref="DeviceControl">resolution</enumref>
1069                <field type="CARD32" name="num_valuators" />
1070                <list type="CARD32"  name="resolution_values">
1071                    <fieldref>num_valuators</fieldref>
1072                </list>
1073                <list type="CARD32" name="resolution_min">
1074                    <fieldref>num_valuators</fieldref>
1075                </list>
1076                <list type="CARD32" name="resolution_max">
1077                    <fieldref>num_valuators</fieldref>
1078                </list>
1079            </case>
1080            <case name="abs_calib">
1081                <enumref ref="DeviceControl">abs_calib</enumref>
1082                <field type="INT32"  name="min_x" />
1083                <field type="INT32"  name="max_x" />
1084                <field type="INT32"  name="min_y" />
1085                <field type="INT32"  name="max_y" />
1086                <field type="CARD32" name="flip_x" />
1087                <field type="CARD32" name="flip_y" />
1088                <field type="CARD32" name="rotation" />
1089                <field type="CARD32" name="button_threshold" />
1090            </case>
1091            <case name="core">
1092                <enumref ref="DeviceControl">core</enumref>
1093                <field type="CARD8"  name="status" />
1094                <field type="CARD8"  name="iscore" />
1095                <pad bytes="2" />
1096            </case>
1097            <case name="enable">
1098                <enumref ref="DeviceControl">enable</enumref>
1099                <field type="CARD8"  name="enable" />
1100                <pad bytes="3" />
1101            </case>
1102            <case name="abs_area">
1103                <enumref ref="DeviceControl">abs_area</enumref>
1104                <field type="CARD32" name="offset_x" />
1105                <field type="CARD32" name="offset_y" />
1106                <field type="CARD32" name="width" />
1107                <field type="CARD32" name="height" />
1108                <field type="CARD32" name="screen" />
1109                <field type="CARD32" name="following" />
1110            </case>
1111        </switch>
1112    </struct>
1113
1114    <request name="GetDeviceControl" opcode="34">
1115        <field type="CARD16" name="control_id" enum="DeviceControl" />
1116        <field type="CARD8"  name="device_id" />
1117        <pad bytes="1" />
1118        <reply>
1119            <field type="CARD8" name="xi_reply_type" />
1120            <field type="CARD8" name="status" altenum="GrabStatus" />
1121            <pad bytes="23" />
1122            <field type="DeviceState" name="control" />
1123        </reply>
1124    </request>
1125
1126    <!-- ChangeDeviceControl -->
1127
1128    <struct name="DeviceResolutionCtl">
1129        <field type="CARD16" name="control_id" enum="DeviceControl" />
1130        <field type="CARD16" name="len" />
1131        <field type="CARD8"  name="first_valuator" />
1132        <field type="CARD8"  name="num_valuators" />
1133        <pad bytes="2" />
1134        <list type="CARD32"  name="resolution_values">
1135            <fieldref>num_valuators</fieldref>
1136        </list>
1137    </struct>
1138
1139    <struct name="DeviceAbsCalibCtl">
1140        <field type="CARD16" name="control_id" enum="DeviceControl" />
1141        <field type="CARD16" name="len" />
1142        <field type="INT32"  name="min_x" />
1143        <field type="INT32"  name="max_x" />
1144        <field type="INT32"  name="min_y" />
1145        <field type="INT32"  name="max_y" />
1146        <field type="CARD32" name="flip_x" />
1147        <field type="CARD32" name="flip_y" />
1148        <field type="CARD32" name="rotation" />
1149        <field type="CARD32" name="button_threshold" />
1150    </struct>
1151
1152    <struct name="DeviceAbsAreaCtrl">
1153        <field type="CARD16" name="control_id" enum="DeviceControl" />
1154        <field type="CARD16" name="len" />
1155        <field type="CARD32" name="offset_x" />
1156        <field type="CARD32" name="offset_y" />
1157        <field type="INT32"  name="width" />
1158        <field type="INT32"  name="height" />
1159        <field type="INT32"  name="screen" />
1160        <field type="CARD32" name="following" />
1161    </struct>
1162
1163    <struct name="DeviceCoreCtrl">
1164        <field type="CARD16" name="control_id" enum="DeviceControl" />
1165        <field type="CARD16" name="len" />
1166        <field type="CARD8"  name="status" />
1167        <pad bytes="3" />
1168    </struct>
1169
1170    <struct name="DeviceEnableCtrl">
1171        <field type="CARD16" name="control_id" enum="DeviceControl" />
1172        <field type="CARD16" name="len" />
1173        <field type="CARD8"  name="enable" />
1174        <pad bytes="3" />
1175    </struct>
1176
1177    <struct name="DeviceCtl">
1178        <field type="CARD16" name="control_id" enum="DeviceControl" />
1179        <field type="CARD16" name="len" />
1180        <switch name="data">
1181            <fieldref>control_id</fieldref>
1182            <case name="resolution">
1183                <enumref ref="DeviceControl">resolution</enumref>
1184                <field type="CARD8"  name="first_valuator" />
1185                <field type="CARD8"  name="num_valuators" />
1186                <pad bytes="2" />
1187                <list type="CARD32"  name="resolution_values">
1188                    <fieldref>num_valuators</fieldref>
1189                </list>
1190            </case>
1191            <case name="abs_calib">
1192                <enumref ref="DeviceControl">abs_calib</enumref>
1193                <field type="INT32"  name="min_x" />
1194                <field type="INT32"  name="max_x" />
1195                <field type="INT32"  name="min_y" />
1196                <field type="INT32"  name="max_y" />
1197                <field type="CARD32" name="flip_x" />
1198                <field type="CARD32" name="flip_y" />
1199                <field type="CARD32" name="rotation" />
1200                <field type="CARD32" name="button_threshold" />
1201            </case>
1202            <case name="core">
1203                <enumref ref="DeviceControl">core</enumref>
1204                <field type="CARD8"  name="status" />
1205                <pad bytes="3" />
1206            </case>
1207            <case name="enable">
1208                <enumref ref="DeviceControl">enable</enumref>
1209                <field type="CARD8"  name="enable" />
1210                <pad bytes="3" />
1211            </case>
1212            <case name="abs_area">
1213                <enumref ref="DeviceControl">abs_area</enumref>
1214                <field type="CARD32" name="offset_x" />
1215                <field type="CARD32" name="offset_y" />
1216                <field type="INT32"  name="width" />
1217                <field type="INT32"  name="height" />
1218                <field type="INT32"  name="screen" />
1219                <field type="CARD32" name="following" />
1220            </case>
1221        </switch>
1222    </struct>
1223
1224    <request name="ChangeDeviceControl" opcode="35">
1225        <field type="CARD16" name="control_id" enum="DeviceControl" />
1226        <field type="CARD8"  name="device_id" />
1227        <pad bytes="1" />
1228        <field type="DeviceCtl" name="control" />
1229        <reply>
1230            <field type="CARD8" name="xi_reply_type" />
1231            <field type="CARD8" name="status" altenum="GrabStatus" />
1232            <pad bytes="23" />
1233        </reply>
1234    </request>
1235
1236    <!-- ⋅⋅⋅ Requests (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
1237
1238    <!-- ListDeviceProperties -->
1239
1240    <request name="ListDeviceProperties" opcode="36">
1241        <field type="CARD8"  name="device_id" />
1242        <pad bytes="3" />
1243        <reply>
1244            <field type="CARD8"  name="xi_reply_type" />
1245            <field type="CARD16" name="num_atoms" />
1246            <pad bytes="22" />
1247            <list type="ATOM" name="atoms">
1248                <fieldref>num_atoms</fieldref>
1249            </list>
1250        </reply>
1251    </request>
1252
1253    <!-- ChangeDeviceProperty -->
1254
1255    <enum name="PropertyFormat">
1256        <item name="8Bits">  <value>8</value> </item>
1257        <item name="16Bits"> <value>16</value> </item>
1258        <item name="32Bits"> <value>32</value> </item>
1259    </enum>
1260
1261    <request name="ChangeDeviceProperty" opcode="37">
1262        <field type="ATOM"  name="property" />
1263        <field type="ATOM"  name="type" />
1264        <field type="CARD8" name="device_id" />
1265        <field type="CARD8" name="format" enum="PropertyFormat" />
1266        <field type="CARD8" name="mode" enum="PropMode" />
1267        <pad bytes="1" />
1268        <field type="CARD32" name="num_items" />
1269        <switch name="items">
1270            <fieldref>format</fieldref>
1271            <case>
1272                <enumref ref="PropertyFormat">8Bits</enumref>
1273                <list type="CARD8" name="data8">
1274                    <fieldref>num_items</fieldref>
1275                </list>
1276                <pad align="4" />
1277            </case>
1278            <case>
1279                <enumref ref="PropertyFormat">16Bits</enumref>
1280                <list type="CARD16" name="data16">
1281                    <fieldref>num_items</fieldref>
1282                </list>
1283                <pad align="4" />
1284            </case>
1285            <case>
1286                <enumref ref="PropertyFormat">32Bits</enumref>
1287                <list type="CARD32" name="data32">
1288                    <fieldref>num_items</fieldref>
1289                </list>
1290            </case>
1291        </switch>
1292    </request>
1293
1294    <!-- DeleteDeviceProperty -->
1295
1296    <request name="DeleteDeviceProperty" opcode="38">
1297        <field type="ATOM"  name="property" />
1298        <field type="CARD8" name="device_id" />
1299        <pad bytes="3" />
1300    </request>
1301
1302    <!-- GetDeviceProperty -->
1303
1304    <request name="GetDeviceProperty" opcode="39">
1305        <field type="ATOM"   name="property" />
1306        <field type="ATOM"   name="type" />
1307        <field type="CARD32" name="offset" />
1308        <field type="CARD32" name="len" />
1309        <field type="CARD8"  name="device_id" />
1310        <field type="BOOL"   name="delete" />
1311        <pad bytes="2" />
1312        <reply>
1313            <field type="CARD8"  name="xi_reply_type" />
1314            <field type="ATOM"   name="type" />
1315            <field type="CARD32" name="bytes_after" />
1316            <field type="CARD32" name="num_items" />
1317            <field type="CARD8"  name="format" enum="PropertyFormat" />
1318            <field type="CARD8"  name="device_id" />
1319            <pad bytes="10" />
1320            <switch name="items">
1321                <fieldref>format</fieldref>
1322                <case>
1323                    <enumref ref="PropertyFormat">8Bits</enumref>
1324                    <list type="CARD8" name="data8">
1325                        <fieldref>num_items</fieldref>
1326                    </list>
1327                    <pad align="4" />
1328                </case>
1329                <case>
1330                    <enumref ref="PropertyFormat">16Bits</enumref>
1331                    <list type="CARD16" name="data16">
1332                        <fieldref>num_items</fieldref>
1333                    </list>
1334                    <pad align="4" />
1335                </case>
1336                <case>
1337                    <enumref ref="PropertyFormat">32Bits</enumref>
1338                    <list type="CARD32" name="data32">
1339                        <fieldref>num_items</fieldref>
1340                    </list>
1341                </case>
1342            </switch>
1343        </reply>
1344    </request>
1345
1346    <!-- ⋅⋅⋅ Requests (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
1347
1348    <!-- XIQueryPointer -->
1349
1350    <enum name="Device">
1351        <item name="All">       <value>0</value> </item>
1352        <item name="AllMaster"> <value>1</value> </item>
1353    </enum>
1354
1355    <struct name="GroupInfo">
1356        <field type="CARD8" name="base" />
1357        <field type="CARD8" name="latched" />
1358        <field type="CARD8" name="locked" />
1359        <field type="CARD8" name="effective" />
1360    </struct>
1361
1362    <struct name="ModifierInfo">
1363        <field type="CARD32" name="base" />
1364        <field type="CARD32" name="latched" />
1365        <field type="CARD32" name="locked" />
1366        <field type="CARD32" name="effective" />
1367    </struct>
1368
1369    <request name="XIQueryPointer" opcode="40">
1370        <field type="WINDOW"   name="window" />
1371        <field type="DeviceId" name="deviceid" altenum="Device" />
1372        <pad bytes="2" />
1373        <reply>
1374            <pad bytes="1" />
1375            <field type="WINDOW"       name="root" />
1376            <field type="WINDOW"       name="child" />
1377            <field type="FP1616"       name="root_x" />
1378            <field type="FP1616"       name="root_y" />
1379            <field type="FP1616"       name="win_x" />
1380            <field type="FP1616"       name="win_y" />
1381            <field type="BOOL"         name="same_screen" />
1382            <pad bytes="1" />
1383            <field type="CARD16"       name="buttons_len" />
1384            <field type="ModifierInfo" name="mods" />
1385            <field type="GroupInfo"    name="group" />
1386            <list type="CARD32" name="buttons">
1387                <fieldref>buttons_len</fieldref>
1388            </list>
1389        </reply>
1390    </request>
1391
1392    <!-- XIWarpPointer -->
1393
1394    <request name="XIWarpPointer" opcode="41">
1395        <field type="WINDOW"   name="src_win" />
1396        <field type="WINDOW"   name="dst_win" />
1397        <field type="FP1616"   name="src_x" />
1398        <field type="FP1616"   name="src_y" />
1399        <field type="CARD16"   name="src_width" />
1400        <field type="CARD16"   name="src_height" />
1401        <field type="FP1616"   name="dst_x" />
1402        <field type="FP1616"   name="dst_y" />
1403        <field type="DeviceId" name="deviceid" altenum="Device" />
1404        <pad bytes="2" />
1405    </request>
1406
1407    <!-- XIChangeCursor -->
1408
1409    <request name="XIChangeCursor" opcode="42">
1410        <field type="WINDOW"   name="window" />
1411        <field type="CURSOR"   name="cursor" />
1412        <field type="DeviceId" name="deviceid" altenum="Device" />
1413        <pad bytes="2" />
1414    </request>
1415
1416    <!-- XIChangeHierarchy -->
1417
1418    <enum name="HierarchyChangeType">
1419        <item name="AddMaster">    <value>1</value> </item>
1420        <item name="RemoveMaster"> <value>2</value> </item>
1421        <item name="AttachSlave">  <value>3</value> </item>
1422        <item name="DetachSlave">  <value>4</value> </item>
1423    </enum>
1424
1425    <enum name="ChangeMode">
1426        <item name="Attach"> <value>1</value> </item>
1427        <item name="Float">  <value>2</value> </item>
1428    </enum>
1429
1430    <struct name="AddMaster">
1431        <field type="CARD16" name="type" enum="HierarchyChangeType" />
1432        <field type="CARD16" name="len" />
1433        <field type="CARD16" name="name_len" />
1434        <field type="BOOL"   name="send_core" />
1435        <field type="BOOL"   name="enable" />
1436        <list type="char" name="name">
1437            <fieldref>name_len</fieldref>
1438        </list>
1439        <pad align="4" />
1440    </struct>
1441
1442    <struct name="RemoveMaster">
1443        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
1444        <field type="CARD16"   name="len" />
1445        <field type="DeviceId" name="deviceid" altenum="Device" />
1446        <field type="CARD8"    name="return_mode" enum="ChangeMode" />
1447        <pad bytes="1" />
1448        <field type="DeviceId" name="return_pointer" altenum="Device" />
1449        <field type="DeviceId" name="return_keyboard" altenum="Device" />
1450    </struct>
1451
1452    <struct name="AttachSlave">
1453        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
1454        <field type="CARD16"   name="len" />
1455        <field type="DeviceId" name="deviceid" altenum="Device" />
1456        <field type="DeviceId" name="master" altenum="Device" />
1457    </struct>
1458
1459    <struct name="DetachSlave">
1460        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
1461        <field type="CARD16"   name="len" />
1462        <field type="DeviceId" name="deviceid" altenum="Device" />
1463        <pad bytes="2" />
1464    </struct>
1465
1466    <struct name="HierarchyChange">
1467        <field type="CARD16" name="type" enum="HierarchyChangeType" />
1468        <field type="CARD16" name="len" />
1469        <switch name="data">
1470            <fieldref>type</fieldref>
1471            <case name="add_master">
1472                <enumref ref="HierarchyChangeType">AddMaster</enumref>
1473                <field type="CARD16" name="name_len" />
1474                <field type="BOOL"   name="send_core" />
1475                <field type="BOOL"   name="enable" />
1476                <list type="char" name="name">
1477                    <fieldref>name_len</fieldref>
1478                </list>
1479                <pad align="4" />
1480            </case>
1481            <case name="remove_master">
1482                <enumref ref="HierarchyChangeType">RemoveMaster</enumref>
1483                <field type="DeviceId" name="deviceid" altenum="Device" />
1484                <field type="CARD8"    name="return_mode" enum="ChangeMode" />
1485                <pad bytes="1" />
1486                <field type="DeviceId" name="return_pointer" altenum="Device" />
1487                <field type="DeviceId" name="return_keyboard" altenum="Device" />
1488            </case>
1489            <case name="attach_slave">
1490                <enumref ref="HierarchyChangeType">AttachSlave</enumref>
1491                <field type="DeviceId" name="deviceid" altenum="Device" />
1492                <field type="DeviceId" name="master" altenum="Device" />
1493            </case>
1494            <case name="detach_slave">
1495                <enumref ref="HierarchyChangeType">DetachSlave</enumref>
1496                <field type="DeviceId" name="deviceid" altenum="Device" />
1497                <pad bytes="2" />
1498            </case>
1499        </switch>
1500    </struct>
1501
1502    <request name="XIChangeHierarchy" opcode="43">
1503        <field type="CARD8" name="num_changes" />
1504        <pad bytes="3" />
1505        <list type="HierarchyChange" name="changes">
1506            <fieldref>num_changes</fieldref>
1507        </list>
1508    </request>
1509
1510    <!-- XISetClientPointer -->
1511
1512    <request name="XISetClientPointer" opcode="44">
1513        <field type="WINDOW"   name="window" />
1514        <field type="DeviceId" name="deviceid" altenum="Device" />
1515        <pad bytes="2" />
1516    </request>
1517
1518    <!-- XIGetClientPointer -->
1519
1520    <request name="XIGetClientPointer" opcode="45">
1521        <field type="WINDOW" name="window" />
1522        <reply>
1523            <pad bytes="1" />
1524            <field type="BOOL"     name="set" />
1525            <pad bytes="1" />
1526            <field type="DeviceId" name="deviceid" altenum="Device" />
1527            <pad bytes="20" />
1528        </reply>
1529    </request>
1530
1531    <!-- XISelectEvents -->
1532
1533    <enum name="XIEventMask">
1534        <item name="DeviceChanged">    <bit>1</bit> </item>
1535        <item name="KeyPress">         <bit>2</bit> </item>
1536        <item name="KeyRelease">       <bit>3</bit> </item>
1537        <item name="ButtonPress">      <bit>4</bit> </item>
1538        <item name="ButtonRelease">    <bit>5</bit> </item>
1539        <item name="Motion">           <bit>6</bit> </item>
1540        <item name="Enter">            <bit>7</bit> </item>
1541        <item name="Leave">            <bit>8</bit> </item>
1542        <item name="FocusIn">          <bit>9</bit> </item>
1543        <item name="FocusOut">         <bit>10</bit> </item>
1544        <item name="Hierarchy">        <bit>11</bit> </item>
1545        <item name="Property">         <bit>12</bit> </item>
1546        <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅ -->
1547        <item name="RawKeyPress">      <bit>13</bit> </item>
1548        <item name="RawKeyRelease">    <bit>14</bit> </item>
1549        <item name="RawButtonPress">   <bit>15</bit> </item>
1550        <item name="RawButtonRelease"> <bit>16</bit> </item>
1551        <item name="RawMotion">        <bit>17</bit> </item>
1552        <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅ -->
1553        <item name="TouchBegin">       <bit>18</bit> </item>
1554        <item name="TouchUpdate">      <bit>19</bit> </item>
1555        <item name="TouchEnd">         <bit>20</bit> </item>
1556        <item name="TouchOwnership">   <bit>21</bit> </item>
1557        <item name="RawTouchBegin">    <bit>22</bit> </item>
1558        <item name="RawTouchUpdate">   <bit>23</bit> </item>
1559        <item name="RawTouchEnd">      <bit>24</bit> </item>
1560        <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅ -->
1561        <item name="BarrierHit">       <bit>25</bit> </item>
1562        <item name="BarrierLeave">     <bit>26</bit> </item>
1563    </enum>
1564
1565    <struct name="EventMask">
1566        <field type="DeviceId" name="deviceid" altenum="Device" />
1567        <field type="CARD16"   name="mask_len" />
1568        <list type="CARD32" name="mask" mask="XIEventMask">
1569            <fieldref>mask_len</fieldref>
1570        </list>
1571    </struct>
1572
1573    <request name="XISelectEvents" opcode="46">
1574        <field type="WINDOW" name="window" />
1575        <field type="CARD16" name="num_mask" />
1576        <pad bytes="2" />
1577        <list type="EventMask" name="masks">
1578            <fieldref>num_mask</fieldref>
1579        </list>
1580    </request>
1581
1582    <!-- XIQueryVersion -->
1583
1584    <request name="XIQueryVersion" opcode="47">
1585        <field type="CARD16" name="major_version" />
1586        <field type="CARD16" name="minor_version" />
1587
1588        <reply>
1589            <pad bytes="1" />
1590            <field type="CARD16" name="major_version" />
1591            <field type="CARD16" name="minor_version" />
1592            <pad bytes="20" />
1593        </reply>
1594    </request>
1595
1596    <!-- XIQueryDevice -->
1597
1598    <enum name="DeviceClassType">
1599        <item name="Key">      <value>0</value> </item>
1600        <item name="Button">   <value>1</value> </item>
1601        <item name="Valuator"> <value>2</value> </item>
1602        <item name="Scroll">   <value>3</value> </item>
1603        <item name="Touch">    <value>8</value> </item>
1604        <item name="Gesture">  <value>9</value> </item>
1605    </enum>
1606
1607    <enum name="DeviceType">
1608        <item name="MasterPointer">  <value>1</value> </item>
1609        <item name="MasterKeyboard"> <value>2</value> </item>
1610        <item name="SlavePointer">   <value>3</value> </item>
1611        <item name="SlaveKeyboard">  <value>4</value> </item>
1612        <item name="FloatingSlave">  <value>5</value> </item>
1613    </enum>
1614
1615    <enum name="ScrollFlags">
1616        <item name="NoEmulation"> <bit>0</bit> </item>
1617        <item name="Preferred">   <bit>1</bit> </item>
1618    </enum>
1619
1620    <enum name="ScrollType">
1621        <item name="Vertical">   <value>1</value> </item>
1622        <item name="Horizontal"> <value>2</value> </item>
1623    </enum>
1624
1625    <enum name="TouchMode">
1626        <item name="Direct">    <value>1</value> </item>
1627        <item name="Dependent"> <value>2</value> </item>
1628    </enum>
1629
1630    <struct name="ButtonClass">
1631        <field type="CARD16"   name="type" enum="DeviceClassType" />
1632        <field type="CARD16"   name="len" />
1633        <field type="DeviceId" name="sourceid" />
1634        <field type="CARD16"   name="num_buttons" />
1635        <list type="CARD32"    name="state">
1636            <op op="/">
1637                <op op="+">
1638                    <fieldref>num_buttons</fieldref>
1639                    <value>31</value>
1640                </op>
1641                <value>32</value>
1642            </op>
1643        </list>
1644        <list type="ATOM" name="labels">
1645            <fieldref>num_buttons</fieldref>
1646        </list>
1647    </struct>
1648
1649    <struct name="KeyClass">
1650        <field type="CARD16"   name="type" enum="DeviceClassType" />
1651        <field type="CARD16"   name="len" />
1652        <field type="DeviceId" name="sourceid" />
1653        <field type="CARD16"   name="num_keys" />
1654        <list type="CARD32" name="keys">
1655            <fieldref>num_keys</fieldref>
1656        </list>
1657    </struct>
1658
1659    <struct name="ScrollClass">
1660        <field type="CARD16"   name="type" enum="DeviceClassType" />
1661        <field type="CARD16"   name="len" />
1662        <field type="DeviceId" name="sourceid" />
1663        <field type="CARD16"   name="number" />
1664        <field type="CARD16"   name="scroll_type" enum="ScrollType" />
1665        <pad bytes="2" />
1666        <field type="CARD32"   name="flags" mask="ScrollFlags" />
1667        <field type="FP3232"   name="increment" />
1668    </struct>
1669
1670    <struct name="TouchClass">
1671        <field type="CARD16"   name="type" enum="DeviceClassType" />
1672        <field type="CARD16"   name="len" />
1673        <field type="DeviceId" name="sourceid" />
1674        <field type="CARD8"    name="mode" enum="TouchMode" />
1675        <field type="CARD8"    name="num_touches" />
1676    </struct>
1677
1678    <struct name="GestureClass">
1679        <field type="CARD16"   name="type" enum="DeviceClassType" />
1680        <field type="CARD16"   name="len" />
1681        <field type="DeviceId" name="sourceid" />
1682        <field type="CARD8"    name="num_touches" />
1683        <pad bytes="1" />
1684    </struct>
1685
1686    <struct name="ValuatorClass">
1687        <field type="CARD16"   name="type" enum="DeviceClassType" />
1688        <field type="CARD16"   name="len" />
1689        <field type="DeviceId" name="sourceid" />
1690        <field type="CARD16"   name="number" />
1691        <field type="ATOM"     name="label" />
1692        <field type="FP3232"   name="min" />
1693        <field type="FP3232"   name="max" />
1694        <field type="FP3232"   name="value" />
1695        <field type="CARD32"   name="resolution" />
1696        <field type="CARD8"    name="mode" enum="ValuatorMode" />
1697        <pad bytes="3" />
1698    </struct>
1699
1700    <struct name="DeviceClass">
1701        <length>
1702            <op op="*">
1703                <fieldref>len</fieldref>
1704                <value>4</value>
1705            </op>
1706        </length>
1707        <field type="CARD16"   name="type" enum="DeviceClassType" />
1708        <field type="CARD16"   name="len" />
1709        <field type="DeviceId" name="sourceid" />
1710	<switch name="data">
1711	    <fieldref>type</fieldref>
1712	    <required_start_align align="4" offset="2" />
1713	    <case name="key">
1714		<enumref ref="DeviceClassType">Key</enumref>
1715		<required_start_align align="4" offset="2" />
1716		<field type="CARD16"   name="num_keys" />
1717		<list type="CARD32" name="keys">
1718		    <fieldref>num_keys</fieldref>
1719		</list>
1720	    </case>
1721	    <case name="button">
1722		<enumref ref="DeviceClassType">Button</enumref>
1723		<required_start_align align="4" offset="2" />
1724		<field type="CARD16"   name="num_buttons" />
1725		<list type="CARD32"    name="state">
1726		    <op op="/">
1727		        <op op="+">
1728		            <fieldref>num_buttons</fieldref>
1729		            <value>31</value>
1730		        </op>
1731		        <value>32</value>
1732		    </op>
1733		</list>
1734		<list type="ATOM" name="labels">
1735		    <fieldref>num_buttons</fieldref>
1736		</list>
1737	    </case>
1738	    <case name="valuator">
1739		<enumref ref="DeviceClassType">Valuator</enumref>
1740		<required_start_align align="4" offset="2" />
1741		<field type="CARD16"   name="number" />
1742		<field type="ATOM"     name="label" />
1743		<field type="FP3232"   name="min" />
1744		<field type="FP3232"   name="max" />
1745		<field type="FP3232"   name="value" />
1746		<field type="CARD32"   name="resolution" />
1747		<field type="CARD8"    name="mode" enum="ValuatorMode" />
1748		<pad bytes="3" />
1749	    </case>
1750	    <case name="scroll">
1751		<enumref ref="DeviceClassType">Scroll</enumref>
1752                <required_start_align align="4" offset="2" />
1753		<field type="CARD16"   name="number" />
1754		<field type="CARD16"   name="scroll_type" enum="ScrollType" />
1755		<pad bytes="2" />
1756		<field type="CARD32"   name="flags" mask="ScrollFlags" />
1757		<field type="FP3232"   name="increment" />
1758	    </case>
1759	    <case name="touch">
1760		<enumref ref="DeviceClassType">Touch</enumref>
1761		<field type="CARD8"    name="mode" enum="TouchMode" />
1762		<field type="CARD8"    name="num_touches" />
1763	    </case>
1764        <case name="gesture">
1765            <enumref ref="DeviceClassType">Gesture</enumref>
1766            <field type="CARD8"    name="num_touches" />
1767            <pad bytes="1" />
1768        </case>
1769	</switch>
1770    </struct>
1771
1772    <struct name="XIDeviceInfo">
1773        <field type="DeviceId" name="deviceid" altenum="Device" />
1774        <field type="CARD16"   name="type" enum="DeviceType" />
1775        <field type="DeviceId" name="attachment" altenum="Device" />
1776        <field type="CARD16"   name="num_classes" />
1777        <field type="CARD16"   name="name_len" />
1778        <field type="BOOL"     name="enabled" />
1779        <pad bytes="1" />
1780        <list type="char" name="name">
1781            <fieldref>name_len</fieldref>
1782        </list>
1783        <pad align="4" />
1784        <list type="DeviceClass" name="classes">
1785            <fieldref>num_classes</fieldref>
1786        </list>
1787    </struct>
1788
1789    <request name="XIQueryDevice" opcode="48">
1790        <field type="DeviceId" name="deviceid" altenum="Device" />
1791        <pad bytes="2" />
1792        <reply>
1793            <pad bytes="1" />
1794            <field type="CARD16" name="num_infos" />
1795            <pad bytes="22" />
1796            <list type="XIDeviceInfo" name="infos">
1797                <fieldref>num_infos</fieldref>
1798            </list>
1799        </reply>
1800    </request>
1801
1802    <!-- XISetFocus -->
1803
1804    <request name="XISetFocus" opcode="49">
1805        <field type="WINDOW"    name="window" />
1806        <field type="TIMESTAMP" name="time" altenum="Time" />
1807        <field type="DeviceId"  name="deviceid" altenum="Device" />
1808        <pad bytes="2" />
1809    </request>
1810
1811    <!-- XIGetFocus -->
1812
1813    <request name="XIGetFocus" opcode="50">
1814        <field type="DeviceId" name="deviceid" altenum="Device" />
1815        <pad bytes="2" />
1816        <reply>
1817            <pad bytes="1" />
1818            <field type="WINDOW" name="focus" />
1819            <pad bytes="20" />
1820        </reply>
1821    </request>
1822
1823    <!-- XIGrabDevice -->
1824
1825    <enum name="GrabOwner">
1826        <item name="NoOwner"> <value>0</value> </item>
1827        <item name="Owner">   <value>1</value> </item>
1828    </enum>
1829
1830    <request name="XIGrabDevice" opcode="51">
1831        <field type="WINDOW"    name="window" />
1832        <field type="TIMESTAMP" name="time" altenum="Time" />
1833        <field type="CURSOR"    name="cursor" />
1834        <field type="DeviceId"  name="deviceid" altenum="Device" />
1835        <field type="CARD8"     name="mode" enum="GrabMode" />
1836        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
1837        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
1838        <pad bytes="1" />
1839        <field type="CARD16"    name="mask_len" />
1840        <list type="CARD32" name="mask">
1841            <fieldref>mask_len</fieldref>
1842        </list>
1843        <reply>
1844            <pad bytes="1" />
1845            <field type="CARD8" name="status" enum="GrabStatus" />
1846            <pad bytes="23" />
1847        </reply>
1848    </request>
1849
1850    <!-- XIUngrabDevice -->
1851
1852    <request name="XIUngrabDevice" opcode="52">
1853        <field type="TIMESTAMP" name="time" altenum="Time" />
1854        <field type="DeviceId" name="deviceid" altenum="Device" />
1855        <pad bytes="2" />
1856    </request>
1857
1858    <!-- XIAllowEvents -->
1859
1860    <enum name="EventMode">
1861        <item name="AsyncDevice">       <value>0</value> </item>
1862        <item name="SyncDevice">        <value>1</value> </item>
1863        <item name="ReplayDevice">      <value>2</value> </item>
1864        <item name="AsyncPairedDevice"> <value>3</value> </item>
1865        <item name="AsyncPair">         <value>4</value> </item>
1866        <item name="SyncPair">          <value>5</value> </item>
1867        <item name="AcceptTouch">       <value>6</value> </item>
1868        <item name="RejectTouch">       <value>7</value> </item>
1869    </enum>
1870
1871    <request name="XIAllowEvents" opcode="53">
1872        <field type="TIMESTAMP" name="time" altenum="Time" />
1873        <field type="DeviceId"  name="deviceid" altenum="Device" />
1874        <field type="CARD8"     name="event_mode" enum="EventMode" />
1875        <pad bytes="1" />
1876        <field type="CARD32"    name="touchid" />
1877        <field type="WINDOW"    name="grab_window" />
1878    </request>
1879
1880    <!-- XIPassiveGrabDevice -->
1881
1882    <enum name="GrabMode22">
1883        <item name="Sync">  <value>0</value> </item>
1884        <item name="Async"> <value>1</value> </item>
1885        <item name="Touch"> <value>2</value> </item>
1886    </enum>
1887
1888    <enum name="GrabType">
1889        <item name="Button">            <value>0</value> </item>
1890        <item name="Keycode">           <value>1</value> </item>
1891        <item name="Enter">             <value>2</value> </item>
1892        <item name="FocusIn">           <value>3</value> </item>
1893        <item name="TouchBegin">        <value>4</value> </item>
1894        <item name="GesturePinchBegin"> <value>5</value> </item>
1895        <item name="GestureSwipeBegin"> <value>6</value> </item>
1896    </enum>
1897
1898    <enum name="ModifierMask">
1899        <item name="Any"> <bit>31</bit> </item>
1900    </enum>
1901
1902    <struct name="GrabModifierInfo">
1903        <field type="CARD32" name="modifiers" altenum="ModifierMask" />
1904        <field type="CARD8"  name="status" enum="GrabStatus" />
1905        <pad bytes="3" />
1906    </struct>
1907
1908    <request name="XIPassiveGrabDevice" opcode="54">
1909        <!-- field "time" is unused and its value is undefined -->
1910        <field type="TIMESTAMP" name="time" altenum="Time" />
1911        <field type="WINDOW"    name="grab_window" />
1912        <field type="CURSOR"    name="cursor" />
1913        <field type="CARD32"    name="detail" />
1914        <field type="DeviceId"  name="deviceid" altenum="Device" />
1915        <field type="CARD16"    name="num_modifiers" />
1916        <field type="CARD16"    name="mask_len" />
1917        <field type="CARD8"     name="grab_type" enum="GrabType" />
1918        <field type="CARD8"     name="grab_mode" enum="GrabMode22" />
1919        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
1920        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
1921        <pad bytes="2" />
1922        <list type="CARD32" name="mask">
1923            <fieldref>mask_len</fieldref>
1924        </list>
1925        <list type="CARD32" name="modifiers">
1926            <fieldref>num_modifiers</fieldref>
1927        </list>
1928        <reply>
1929            <pad bytes="1" />
1930            <field type="CARD16" name="num_modifiers" />
1931            <pad bytes="22" />
1932            <list type="GrabModifierInfo" name="modifiers">
1933                <fieldref>num_modifiers</fieldref>
1934            </list>
1935        </reply>
1936    </request>
1937
1938    <!-- XIPassiveUngrabDevice -->
1939
1940    <request name="XIPassiveUngrabDevice" opcode="55">
1941        <field type="WINDOW"   name="grab_window" />
1942        <field type="CARD32"   name="detail" />
1943        <field type="DeviceId" name="deviceid" altenum="Device" />
1944        <field type="CARD16"   name="num_modifiers" />
1945        <field type="CARD8"    name="grab_type" enum="GrabType" />
1946        <pad bytes="3" />
1947        <list type="CARD32" name="modifiers">
1948            <fieldref>num_modifiers</fieldref>
1949        </list>
1950    </request>
1951
1952    <!-- XIListProperties -->
1953
1954    <request name="XIListProperties" opcode="56">
1955        <field type="DeviceId" name="deviceid" altenum="Device" />
1956        <pad bytes="2" />
1957        <reply>
1958            <pad bytes="1" />
1959            <field type="CARD16" name="num_properties" />
1960            <pad bytes="22" />
1961            <list type="ATOM" name="properties">
1962                <fieldref>num_properties</fieldref>
1963            </list>
1964        </reply>
1965    </request>
1966
1967    <!-- XIChangeProperty -->
1968
1969    <request name="XIChangeProperty" opcode="57">
1970        <field type="DeviceId" name="deviceid" altenum="Device" />
1971        <field type="CARD8"    name="mode" enum="PropMode" />
1972        <field type="CARD8"    name="format" enum="PropertyFormat" />
1973        <field type="ATOM"     name="property" />
1974        <field type="ATOM"     name="type" />
1975        <field type="CARD32"   name="num_items" />
1976        <switch name="items">
1977            <fieldref>format</fieldref>
1978            <case>
1979                <enumref ref="PropertyFormat">8Bits</enumref>
1980                <list type="CARD8" name="data8">
1981                    <fieldref>num_items</fieldref>
1982                </list>
1983                <pad align="4" />
1984            </case>
1985            <case>
1986                <enumref ref="PropertyFormat">16Bits</enumref>
1987                <list type="CARD16" name="data16">
1988                    <fieldref>num_items</fieldref>
1989                </list>
1990                <pad align="4" />
1991            </case>
1992            <case>
1993                <enumref ref="PropertyFormat">32Bits</enumref>
1994                <list type="CARD32" name="data32">
1995                    <fieldref>num_items</fieldref>
1996                </list>
1997            </case>
1998        </switch>
1999    </request>
2000
2001    <!-- XIDeleteProperty -->
2002
2003    <request name="XIDeleteProperty" opcode="58">
2004        <field type="DeviceId" name="deviceid" altenum="Device" />
2005        <pad bytes="2" />
2006        <field type="ATOM"     name="property" />
2007    </request>
2008
2009    <!-- XIGetProperty -->
2010
2011    <request name="XIGetProperty" opcode="59">
2012        <field type="DeviceId" name="deviceid" altenum="Device" />
2013        <field type="BOOL"     name="delete" />
2014        <pad bytes="1" />
2015        <field type="ATOM"     name="property" />
2016        <field type="ATOM"     name="type" />
2017        <field type="CARD32"   name="offset" />
2018        <field type="CARD32"   name="len" />
2019        <reply>
2020            <pad bytes="1" />
2021            <field type="ATOM"   name="type" />
2022            <field type="CARD32" name="bytes_after" />
2023            <field type="CARD32" name="num_items" />
2024            <field type="CARD8"  name="format" enum="PropertyFormat" />
2025            <pad bytes="11" />
2026            <switch name="items">
2027                <fieldref>format</fieldref>
2028                <case>
2029                    <enumref ref="PropertyFormat">8Bits</enumref>
2030                    <list type="CARD8" name="data8">
2031                        <fieldref>num_items</fieldref>
2032                    </list>
2033                    <pad align="4" />
2034                </case>
2035                <case>
2036                    <enumref ref="PropertyFormat">16Bits</enumref>
2037                    <list type="CARD16" name="data16">
2038                        <fieldref>num_items</fieldref>
2039                    </list>
2040                    <pad align="4" />
2041                </case>
2042                <case>
2043                    <enumref ref="PropertyFormat">32Bits</enumref>
2044                    <list type="CARD32" name="data32">
2045                        <fieldref>num_items</fieldref>
2046                    </list>
2047                </case>
2048            </switch>
2049        </reply>
2050    </request>
2051
2052    <!-- XIGetSelectedEvents -->
2053
2054    <request name="XIGetSelectedEvents" opcode="60">
2055        <field type="WINDOW" name="window" />
2056        <reply>
2057            <pad bytes="1" />
2058            <field type="CARD16" name="num_masks" />
2059            <pad bytes="22" />
2060            <list type="EventMask" name="masks">
2061                <fieldref>num_masks</fieldref>
2062            </list>
2063        </reply>
2064    </request>
2065
2066    <!-- ⋅⋅⋅ Requests (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2067
2068    <!-- XIBarrierReleasePointer -->
2069
2070    <struct name="BarrierReleasePointerInfo">
2071        <field type="DeviceId" name="deviceid" />
2072        <pad bytes="2" />
2073        <field type="BARRIER"  name="barrier" />
2074        <field type="CARD32"   name="eventid" />
2075    </struct>
2076
2077    <request name="XIBarrierReleasePointer" opcode="61">
2078        <field type="CARD32" name="num_barriers" />
2079        <list type="BarrierReleasePointerInfo" name="barriers">
2080            <fieldref>num_barriers</fieldref>
2081        </list>
2082    </request>
2083
2084    <!-- ⋅⋅⋅ Events (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2085    <!-- Notes:
2086         - A 'len' field in a v1++ structure is in bytes.
2087    -->
2088
2089    <event name="DeviceValuator" number="0">
2090        <field type="CARD8"  name="device_id" />
2091        <field type="CARD16" name="device_state" />
2092        <field type="CARD8"  name="num_valuators" />
2093        <field type="CARD8"  name="first_valuator" />
2094        <list type="INT32"   name="valuators">
2095            <value>6</value>
2096        </list>
2097    </event>
2098
2099    <!-- the highest bit in a CARD8 device_id-field indicates that more
2100	events will follow -->
2101    <enum name="MoreEventsMask">
2102	<item name="MoreEvents"> <bit>7</bit> </item> <!-- 0x80 -->
2103    </enum>
2104
2105    <event name="DeviceKeyPress" number="1">
2106        <field type="BYTE"      name="detail" />
2107        <field type="TIMESTAMP" name="time" />
2108        <field type="WINDOW"    name="root" />
2109        <field type="WINDOW"    name="event" />
2110        <field type="WINDOW"    name="child" altenum="Window" />
2111        <field type="INT16"     name="root_x" />
2112        <field type="INT16"     name="root_y" />
2113        <field type="INT16"     name="event_x" />
2114        <field type="INT16"     name="event_y" />
2115        <field type="CARD16"    name="state" mask="KeyButMask" />
2116        <field type="BOOL"      name="same_screen" />
2117        <field type="CARD8"     name="device_id" altmask="MoreEventsMask" />
2118    </event>
2119
2120    <eventcopy name="DeviceKeyRelease"    number="2" ref="DeviceKeyPress" />
2121    <eventcopy name="DeviceButtonPress"   number="3" ref="DeviceKeyPress" />
2122    <eventcopy name="DeviceButtonRelease" number="4" ref="DeviceKeyPress" />
2123    <eventcopy name="DeviceMotionNotify"  number="5" ref="DeviceKeyPress" />
2124
2125    <event name="DeviceFocusIn" number="6">
2126        <field type="BYTE"      name="detail" enum="xproto:NotifyDetail" />
2127        <field type="TIMESTAMP" name="time" />
2128        <field type="WINDOW"    name="window" />
2129        <field type="BYTE"      name="mode" enum="xproto:NotifyMode" />
2130        <field type="CARD8"     name="device_id" />
2131        <pad bytes="18" />
2132    </event>
2133
2134    <eventcopy name="DeviceFocusOut" number="7" ref="DeviceFocusIn" />
2135    <eventcopy name="ProximityIn"    number="8" ref="DeviceKeyPress" />
2136    <eventcopy name="ProximityOut"   number="9" ref="DeviceKeyPress" />
2137
2138    <enum name="ClassesReportedMask">
2139        <item name="OutOfProximity">     <bit>7</bit> </item> <!-- 0x80 -->
2140            <!-- 0 = InProxmity, 1 = OutOfProximity -->
2141
2142        <item name="DeviceModeAbsolute"> <bit>6</bit> </item> <!-- 0x40 -->
2143            <!-- 0 = Relative, 1 = Absolute -->
2144
2145        <item name="ReportingValuators"> <bit>2</bit> </item> <!-- 0x04 -->
2146        <item name="ReportingButtons">   <bit>1</bit> </item> <!-- 0x02 -->
2147        <item name="ReportingKeys">      <bit>0</bit> </item> <!-- 0x01 -->
2148    </enum>
2149
2150    <event name="DeviceStateNotify" number="10">
2151        <field type="BYTE"      name="device_id" altmask="MoreEventsMask" />
2152        <field type="TIMESTAMP" name="time" />
2153        <field type="CARD8"     name="num_keys" />
2154        <field type="CARD8"     name="num_buttons" />
2155        <field type="CARD8"     name="num_valuators" />
2156        <field type="CARD8"     name="classes_reported" mask="ClassesReportedMask" />
2157        <list type="CARD8"      name="buttons">
2158            <value>4</value>
2159        </list>
2160        <list type="CARD8" name="keys">
2161            <value>4</value>
2162        </list>
2163        <list type="CARD32" name="valuators">
2164            <value>3</value>
2165        </list>
2166    </event>
2167
2168    <event name="DeviceMappingNotify" number="11">
2169        <field type="BYTE"    name="device_id" />
2170        <field type="CARD8"   name="request" enum="Mapping" />
2171        <field type="KeyCode" name="first_keycode" />
2172        <field type="CARD8"   name="count" />
2173        <pad bytes="1" />
2174        <field type="TIMESTAMP" name="time" />
2175        <pad bytes="20" />
2176    </event>
2177
2178    <enum name="ChangeDevice">
2179	<item name="NewPointer">  <value>0</value> </item>
2180	<item name="NewKeyboard"> <value>1</value> </item>
2181    </enum>
2182
2183    <event name="ChangeDeviceNotify" number="12">
2184        <field type="BYTE"      name="device_id" />
2185        <field type="TIMESTAMP" name="time" />
2186        <field type="CARD8"     name="request" enum="ChangeDevice" />
2187        <pad bytes="23" />
2188    </event>
2189
2190    <event name="DeviceKeyStateNotify" number="13">
2191        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
2192        <list type="CARD8" name="keys">
2193            <value>28</value>
2194        </list>
2195    </event>
2196
2197    <event name="DeviceButtonStateNotify" number="14">
2198        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
2199        <list type="CARD8" name="buttons">
2200            <value>28</value>
2201        </list>
2202    </event>
2203
2204    <!-- ⋅⋅⋅ Events (v1.4) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2205
2206    <enum name="DeviceChange">
2207        <item name="Added">          <value>0</value> </item>
2208        <item name="Removed">        <value>1</value> </item>
2209        <item name="Enabled">        <value>2</value> </item>
2210        <item name="Disabled">       <value>3</value> </item>
2211        <item name="Unrecoverable">  <value>4</value> </item>
2212        <item name="ControlChanged"> <value>5</value> </item>
2213    </enum>
2214
2215    <event name="DevicePresenceNotify" number="15">
2216        <pad bytes="1" />
2217        <field type="TIMESTAMP" name="time" />
2218        <field type="BYTE"      name="devchange" enum="DeviceChange" />
2219        <field type="BYTE"      name="device_id" />
2220        <field type="CARD16"    name="control" />
2221        <pad bytes="20" />
2222    </event>
2223
2224    <!-- ⋅⋅⋅ Events (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2225
2226    <event name="DevicePropertyNotify" number="16">
2227        <field type="BYTE"      name="state" enum="Property" />
2228        <field type="TIMESTAMP" name="time" />
2229        <field type="ATOM"      name="property" />
2230        <pad bytes="19" />
2231        <field type="CARD8"     name="device_id" />
2232    </event>
2233
2234    <!-- ⋅⋅⋅ Events (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2235    <!-- Notes:
2236         - A 'len' field in a v2++ structure is in 4 byte units.
2237    -->
2238
2239    <enum name="ChangeReason">
2240        <item name="SlaveSwitch">  <value>1</value> </item>
2241        <item name="DeviceChange"> <value>2</value> </item>
2242    </enum>
2243
2244    <event name="DeviceChanged" number="1" xge="true">
2245        <field type="DeviceId"  name="deviceid" altenum="Device" />
2246        <field type="TIMESTAMP" name="time" altenum="Time" />
2247        <!-- event specific fields -->
2248        <field type="CARD16"    name="num_classes" />
2249        <field type="DeviceId"  name="sourceid" altenum="Device" />
2250        <field type="CARD8"     name="reason" enum="ChangeReason" />
2251        <pad bytes="11" />
2252        <!-- 32 byte boundary -->
2253        <list type="DeviceClass" name="classes">
2254            <fieldref>num_classes</fieldref>
2255        </list>
2256    </event>
2257
2258    <enum name="KeyEventFlags">
2259        <item name="KeyRepeat"> <bit>16</bit> </item>
2260    </enum>
2261
2262    <event name="KeyPress" number="2" xge="true">
2263        <field type="DeviceId"  name="deviceid" altenum="Device" />
2264        <field type="TIMESTAMP" name="time" altenum="Time" />
2265        <!-- event specific fields -->
2266        <field type="CARD32"    name="detail" />
2267        <field type="WINDOW"    name="root" />
2268        <field type="WINDOW"    name="event" />
2269        <field type="WINDOW"    name="child" />
2270        <!-- 32 byte boundary -->
2271        <field type="FP1616"    name="root_x" />
2272        <field type="FP1616"    name="root_y" />
2273        <field type="FP1616"    name="event_x" />
2274        <field type="FP1616"    name="event_y" />
2275        <field type="CARD16"    name="buttons_len" />
2276        <field type="CARD16"    name="valuators_len" />
2277        <field type="DeviceId"  name="sourceid" altenum="Device" />
2278        <pad bytes="2" />
2279        <field type="CARD32"       name="flags" mask="KeyEventFlags" />
2280        <field type="ModifierInfo" name="mods" />
2281        <field type="GroupInfo"    name="group" />
2282        <list type="CARD32" name="button_mask">
2283            <fieldref>buttons_len</fieldref>
2284        </list>
2285        <list type="CARD32" name="valuator_mask">
2286            <fieldref>valuators_len</fieldref>
2287        </list>
2288        <list type="FP3232" name="axisvalues">
2289            <sumof ref="valuator_mask">
2290                <popcount>
2291                    <listelement-ref/>
2292                </popcount>
2293            </sumof>
2294        </list>
2295    </event>
2296
2297    <eventcopy name="KeyRelease" number="3" ref="KeyPress" />
2298
2299    <enum name="PointerEventFlags">
2300        <item name="PointerEmulated"> <bit>16</bit> </item>
2301    </enum>
2302
2303    <event name="ButtonPress" number="4" xge="true">
2304        <field type="DeviceId"  name="deviceid" altenum="Device" />
2305        <field type="TIMESTAMP" name="time" altenum="Time" />
2306        <!-- event specific fields -->
2307        <field type="CARD32"    name="detail" />
2308        <field type="WINDOW"    name="root" />
2309        <field type="WINDOW"    name="event" />
2310        <field type="WINDOW"    name="child" />
2311        <!-- 32 byte boundary -->
2312        <field type="FP1616"    name="root_x" />
2313        <field type="FP1616"    name="root_y" />
2314        <field type="FP1616"    name="event_x" />
2315        <field type="FP1616"    name="event_y" />
2316        <field type="CARD16"    name="buttons_len" />
2317        <field type="CARD16"    name="valuators_len" />
2318        <field type="DeviceId"  name="sourceid" altenum="Device" />
2319        <pad bytes="2" />
2320        <field type="CARD32"       name="flags" mask="PointerEventFlags" />
2321        <field type="ModifierInfo" name="mods" />
2322        <field type="GroupInfo"    name="group" />
2323        <list type="CARD32" name="button_mask">
2324            <fieldref>buttons_len</fieldref>
2325        </list>
2326        <list type="CARD32" name="valuator_mask">
2327            <fieldref>valuators_len</fieldref>
2328        </list>
2329        <list type="FP3232" name="axisvalues">
2330            <sumof ref="valuator_mask">
2331                <popcount>
2332                    <listelement-ref/>
2333                </popcount>
2334            </sumof>
2335        </list>
2336    </event>
2337
2338    <eventcopy name="ButtonRelease" number="5" ref="ButtonPress" />
2339    <eventcopy name="Motion"        number="6" ref="ButtonPress" />
2340
2341    <enum name="NotifyMode">
2342        <item name="Normal">        <value>0</value> </item>
2343        <item name="Grab">          <value>1</value> </item>
2344        <item name="Ungrab">        <value>2</value> </item>
2345        <item name="WhileGrabbed">  <value>3</value> </item>
2346        <item name="PassiveGrab">   <value>4</value> </item>
2347        <item name="PassiveUngrab"> <value>5</value> </item>
2348    </enum>
2349
2350    <enum name="NotifyDetail">
2351        <item name="Ancestor">         <value>0</value> </item>
2352        <item name="Virtual">          <value>1</value> </item>
2353        <item name="Inferior">         <value>2</value> </item>
2354        <item name="Nonlinear">        <value>3</value> </item>
2355        <item name="NonlinearVirtual"> <value>4</value> </item>
2356        <item name="Pointer">          <value>5</value> </item>
2357        <item name="PointerRoot">      <value>6</value> </item>
2358        <item name="None">             <value>7</value> </item>
2359    </enum>
2360
2361    <event name="Enter" number="7" xge="true">
2362        <field type="DeviceId"  name="deviceid" altenum="Device" />
2363        <field type="TIMESTAMP" name="time" altenum="Time" />
2364        <!-- event specific fields -->
2365        <field type="DeviceId"  name="sourceid" altenum="Device" />
2366        <field type="CARD8"     name="mode" enum="xinput:NotifyMode" />
2367        <field type="CARD8"     name="detail" enum="xinput:NotifyDetail" />
2368        <field type="WINDOW"    name="root" />
2369        <field type="WINDOW"    name="event" />
2370        <field type="WINDOW"    name="child" />
2371        <!-- 32 byte boundary -->
2372        <field type="FP1616"       name="root_x" />
2373        <field type="FP1616"       name="root_y" />
2374        <field type="FP1616"       name="event_x" />
2375        <field type="FP1616"       name="event_y" />
2376        <field type="BOOL"         name="same_screen" />
2377        <field type="BOOL"         name="focus" />
2378        <field type="CARD16"       name="buttons_len" />
2379        <field type="ModifierInfo" name="mods" />
2380        <field type="GroupInfo"    name="group" />
2381        <list type="CARD32" name="buttons">
2382            <fieldref>buttons_len</fieldref>
2383        </list>
2384    </event>
2385
2386    <eventcopy name="Leave"    number="8" ref="Enter" />
2387    <eventcopy name="FocusIn"  number="9" ref="Enter" />
2388    <eventcopy name="FocusOut" number="10" ref="Enter" />
2389
2390    <enum name="HierarchyMask">
2391        <item name="MasterAdded">    <bit>0</bit> </item>
2392        <item name="MasterRemoved">  <bit>1</bit> </item>
2393        <item name="SlaveAdded">     <bit>2</bit> </item>
2394        <item name="SlaveRemoved">   <bit>3</bit> </item>
2395        <item name="SlaveAttached">  <bit>4</bit> </item>
2396        <item name="SlaveDetached">  <bit>5</bit> </item>
2397        <item name="DeviceEnabled">  <bit>6</bit> </item>
2398        <item name="DeviceDisabled"> <bit>7</bit> </item>
2399    </enum>
2400
2401    <struct name="HierarchyInfo">
2402        <field type="DeviceId" name="deviceid" altenum="Device" />
2403        <field type="DeviceId" name="attachment" altenum="Device" />
2404        <field type="CARD8"    name="type" enum="DeviceType"/>
2405        <field type="BOOL"     name="enabled" />
2406        <pad bytes="2" />
2407        <field type="CARD32"   name="flags" mask="HierarchyMask" />
2408    </struct>
2409
2410    <event name="Hierarchy" number="11" xge="true">
2411        <field type="DeviceId"  name="deviceid" altenum="Device" />
2412        <field type="TIMESTAMP" name="time" altenum="Time" />
2413        <!-- event specific fields -->
2414        <field type="CARD32"    name="flags" mask="HierarchyMask" />
2415        <field type="CARD16"    name="num_infos" />
2416        <pad bytes="10" />
2417        <!-- 32 byte boundary -->
2418        <list type="HierarchyInfo" name="infos">
2419            <fieldref>num_infos</fieldref>
2420        </list>
2421    </event>
2422
2423    <enum name="PropertyFlag">
2424        <item name="Deleted">  <value>0</value> </item>
2425        <item name="Created">  <value>1</value> </item>
2426        <item name="Modified"> <value>2</value> </item>
2427    </enum>
2428
2429    <event name="Property" number="12" xge="true">
2430        <field type="DeviceId"  name="deviceid" altenum="Device" />
2431        <field type="TIMESTAMP" name="time" altenum="Time" />
2432        <!-- event specific fields -->
2433        <field type="ATOM"      name="property" />
2434        <field type="CARD8"     name="what" enum="PropertyFlag" />
2435        <pad bytes="11" />
2436        <!-- 32 byte boundary -->
2437    </event>
2438
2439    <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2440
2441    <event name="RawKeyPress" number="13" xge="true">
2442        <field type="DeviceId"  name="deviceid" altenum="Device" />
2443        <field type="TIMESTAMP" name="time" altenum="Time" />
2444        <!-- event specific fields -->
2445        <field type="CARD32"    name="detail" />
2446        <field type="DeviceId"  name="sourceid" />
2447        <field type="CARD16"    name="valuators_len" />
2448        <field type="CARD32"    name="flags" mask="KeyEventFlags"/>
2449        <pad bytes="4" />
2450        <!-- 32 byte boundary -->
2451        <list type="CARD32" name="valuator_mask">
2452            <fieldref>valuators_len</fieldref>
2453        </list>
2454        <list type="FP3232" name="axisvalues">
2455            <sumof ref="valuator_mask">
2456                <popcount>
2457                    <listelement-ref/>
2458                </popcount>
2459            </sumof>
2460        </list>
2461        <list type="FP3232" name="axisvalues_raw">
2462            <sumof ref="valuator_mask">
2463                <popcount>
2464                    <listelement-ref/>
2465                </popcount>
2466            </sumof>
2467        </list>
2468    </event>
2469
2470    <eventcopy name="RawKeyRelease" number="14" ref="RawKeyPress" />
2471
2472    <event name="RawButtonPress" number="15" xge="true">
2473        <field type="DeviceId"  name="deviceid" altenum="Device" />
2474        <field type="TIMESTAMP" name="time" altenum="Time" />
2475        <!-- event specific fields -->
2476        <field type="CARD32"    name="detail" />
2477        <field type="DeviceId"  name="sourceid" />
2478        <field type="CARD16"    name="valuators_len" />
2479        <field type="CARD32"    name="flags" mask="PointerEventFlags"/>
2480        <pad bytes="4" />
2481        <!-- 32 byte boundary -->
2482        <list type="CARD32" name="valuator_mask">
2483            <fieldref>valuators_len</fieldref>
2484        </list>
2485        <list type="FP3232" name="axisvalues">
2486            <sumof ref="valuator_mask">
2487                <popcount>
2488                    <listelement-ref/>
2489                </popcount>
2490            </sumof>
2491        </list>
2492        <list type="FP3232" name="axisvalues_raw">
2493            <sumof ref="valuator_mask">
2494                <popcount>
2495                    <listelement-ref/>
2496                </popcount>
2497            </sumof>
2498        </list>
2499    </event>
2500
2501    <eventcopy name="RawButtonRelease" number="16" ref="RawButtonPress" />
2502    <eventcopy name="RawMotion"        number="17" ref="RawButtonPress" />
2503
2504    <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2505
2506    <enum name="TouchEventFlags">
2507        <item name="TouchPendingEnd">       <bit>16</bit> </item>
2508        <item name="TouchEmulatingPointer"> <bit>17</bit> </item>
2509    </enum>
2510
2511    <event name="TouchBegin" number="18" xge="true">
2512        <field type="DeviceId"  name="deviceid" altenum="Device" />
2513        <field type="TIMESTAMP" name="time" altenum="Time" />
2514        <!-- event specific fields -->
2515        <field type="CARD32"    name="detail" />
2516        <field type="WINDOW"    name="root" />
2517        <field type="WINDOW"    name="event" />
2518        <field type="WINDOW"    name="child" />
2519        <!-- 32 byte boundary -->
2520        <field type="FP1616"    name="root_x" />
2521        <field type="FP1616"    name="root_y" />
2522        <field type="FP1616"    name="event_x" />
2523        <field type="FP1616"    name="event_y" />
2524        <field type="CARD16"    name="buttons_len" />
2525        <field type="CARD16"    name="valuators_len" />
2526        <field type="DeviceId"  name="sourceid" altenum="Device" />
2527        <pad bytes="2" />
2528        <field type="CARD32"       name="flags" mask="TouchEventFlags" />
2529        <field type="ModifierInfo" name="mods" />
2530        <field type="GroupInfo"    name="group" />
2531        <list type="CARD32" name="button_mask">
2532            <fieldref>buttons_len</fieldref>
2533        </list>
2534        <list type="CARD32" name="valuator_mask">
2535            <fieldref>valuators_len</fieldref>
2536        </list>
2537        <list type="FP3232" name="axisvalues">
2538            <sumof ref="valuator_mask">
2539                <popcount>
2540                    <listelement-ref/>
2541                </popcount>
2542            </sumof>
2543        </list>
2544    </event>
2545
2546    <eventcopy name="TouchUpdate" number="19" ref="TouchBegin" />
2547    <eventcopy name="TouchEnd"    number="20" ref="TouchBegin" />
2548
2549    <enum name="TouchOwnershipFlags">
2550        <!-- XXX: Remove this enum? Currently, no flag is defined. -->
2551        <item name="None"> <value>0</value> </item>
2552    </enum>
2553
2554    <event name="TouchOwnership" number="21" xge="true">
2555        <field type="DeviceId"  name="deviceid" altenum="Device" />
2556        <field type="TIMESTAMP" name="time" altenum="Time" />
2557        <!-- event specific fields -->
2558        <field type="CARD32"    name="touchid" />
2559        <field type="WINDOW"    name="root" />
2560        <field type="WINDOW"    name="event" />
2561        <field type="WINDOW"    name="child" />
2562        <!-- 32 byte boundary -->
2563        <field type="DeviceId"  name="sourceid" altenum="Device" />
2564        <pad bytes="2" />
2565        <field type="CARD32"    name="flags" enum="TouchOwnershipFlags" />
2566        <pad bytes="8" />
2567    </event>
2568
2569    <event name="RawTouchBegin" number="22" xge="true">
2570        <field type="DeviceId"  name="deviceid" altenum="Device" />
2571        <field type="TIMESTAMP" name="time" altenum="Time" />
2572        <!-- event specific fields -->
2573        <field type="CARD32"    name="detail" />
2574        <field type="DeviceId"  name="sourceid" />
2575        <field type="CARD16"    name="valuators_len" />
2576        <field type="CARD32"    name="flags" mask="TouchEventFlags"/>
2577        <pad bytes="4" />
2578        <!-- 32 byte boundary -->
2579        <list type="CARD32" name="valuator_mask">
2580            <fieldref>valuators_len</fieldref>
2581        </list>
2582        <list type="FP3232" name="axisvalues">
2583            <sumof ref="valuator_mask">
2584                <popcount>
2585                    <listelement-ref/>
2586                </popcount>
2587            </sumof>
2588        </list>
2589        <list type="FP3232" name="axisvalues_raw">
2590            <sumof ref="valuator_mask">
2591                <popcount>
2592                    <listelement-ref/>
2593                </popcount>
2594            </sumof>
2595        </list>
2596    </event>
2597
2598    <eventcopy name="RawTouchUpdate" number="23" ref="RawTouchBegin" />
2599    <eventcopy name="RawTouchEnd"    number="24" ref="RawTouchBegin" />
2600
2601    <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2602
2603    <enum name="BarrierFlags">
2604	<item name="PointerReleased"> <bit>0</bit> </item>
2605	<item name="DeviceIsGrabbed"> <bit>1</bit> </item>
2606    </enum>
2607
2608    <event name="BarrierHit" number="25" xge="true">
2609        <field type="DeviceId"  name="deviceid" altenum="Device" />
2610        <field type="TIMESTAMP" name="time" altenum="Time" />
2611        <!-- event specific fields -->
2612        <field type="CARD32"    name="eventid" />
2613        <field type="WINDOW"    name="root" />
2614        <field type="WINDOW"    name="event" />
2615        <field type="BARRIER"   name="barrier" />
2616        <!-- 32 byte boundary -->
2617        <field type="CARD32"    name="dtime" />
2618        <field type="CARD32"    name="flags" mask="BarrierFlags" />
2619        <field type="DeviceId"  name="sourceid" altenum="Device" />
2620        <pad bytes="2" />
2621        <field type="FP1616"    name="root_x" />
2622        <field type="FP1616"    name="root_y" />
2623        <field type="FP3232"    name="dx" />
2624        <field type="FP3232"    name="dy" />
2625    </event>
2626
2627    <eventcopy name="BarrierLeave" number="26" ref="BarrierHit" />
2628
2629    <!-- ⋅⋅⋅ Events (v2.4) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2630
2631    <enum name="GesturePinchEventFlags">
2632        <item name="GesturePinchCancelled"> <bit>0</bit> </item>
2633    </enum>
2634
2635    <event name="GesturePinchBegin" number="27" xge="true">
2636        <field type="DeviceId"  name="deviceid" altenum="Device" />
2637        <field type="TIMESTAMP" name="time" altenum="Time" />
2638        <!-- event specific fields -->
2639        <field type="CARD32"    name="detail" />
2640        <field type="WINDOW"    name="root" />
2641        <field type="WINDOW"    name="event" />
2642        <field type="WINDOW"    name="child" />
2643        <!-- 32 byte boundary -->
2644        <field type="FP1616"    name="root_x" />
2645        <field type="FP1616"    name="root_y" />
2646        <field type="FP1616"    name="event_x" />
2647        <field type="FP1616"    name="event_y" />
2648        <field type="FP1616"    name="delta_x" />
2649        <field type="FP1616"    name="delta_y" />
2650        <field type="FP1616"    name="delta_unaccel_x" />
2651        <field type="FP1616"    name="delta_unaccel_y" />
2652        <field type="FP1616"    name="scale" />
2653        <field type="FP1616"    name="delta_angle" />
2654        <field type="DeviceId"  name="sourceid" altenum="Device" />
2655        <pad bytes="2" />
2656        <field type="ModifierInfo" name="mods" />
2657        <field type="GroupInfo"    name="group" />
2658        <field type="CARD32"       name="flags" mask="GesturePinchEventFlags" />
2659    </event>
2660
2661    <eventcopy name="GesturePinchUpdate" number="28" ref="GesturePinchBegin" />
2662    <eventcopy name="GesturePinchEnd"    number="29" ref="GesturePinchBegin" />
2663
2664    <enum name="GestureSwipeEventFlags">
2665        <item name="GestureSwipeCancelled"> <bit>0</bit> </item>
2666    </enum>
2667
2668    <event name="GestureSwipeBegin" number="30" xge="true">
2669        <field type="DeviceId"  name="deviceid" altenum="Device" />
2670        <field type="TIMESTAMP" name="time" altenum="Time" />
2671        <!-- event specific fields -->
2672        <field type="CARD32"    name="detail" />
2673        <field type="WINDOW"    name="root" />
2674        <field type="WINDOW"    name="event" />
2675        <field type="WINDOW"    name="child" />
2676        <!-- 32 byte boundary -->
2677        <field type="FP1616"    name="root_x" />
2678        <field type="FP1616"    name="root_y" />
2679        <field type="FP1616"    name="event_x" />
2680        <field type="FP1616"    name="event_y" />
2681        <field type="FP1616"    name="delta_x" />
2682        <field type="FP1616"    name="delta_y" />
2683        <field type="FP1616"    name="delta_unaccel_x" />
2684        <field type="FP1616"    name="delta_unaccel_y" />
2685        <field type="DeviceId"  name="sourceid" altenum="Device" />
2686        <pad bytes="2" />
2687        <field type="ModifierInfo" name="mods" />
2688        <field type="GroupInfo"    name="group" />
2689        <field type="CARD32"       name="flags" mask="GestureSwipeEventFlags" />
2690    </event>
2691
2692    <eventcopy name="GestureSwipeUpdate" number="31" ref="GestureSwipeBegin" />
2693    <eventcopy name="GestureSwipeEnd"    number="32" ref="GestureSwipeBegin" />
2694
2695    <!-- ⋅⋅⋅ Requests that depend on events ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2696
2697    <!-- SendExtensionEvent -->
2698    <eventstruct name="EventForSend">
2699        <allowed extension="Input" xge="false" opcode-min="0" opcode-max="16" />
2700        <!-- We need not allow the newer events which are based on
2701             the GenericEvent extension:
2702             The wire-protocol-spec
2703             https://cgit.freedesktop.org/xorg/lib/libXi/tree/specs/encoding.xml?idĺibXi-1.7.9#n1793
2704             only allows fixed sized events, which seems
2705             to rule out GenericEvent.
2706
2707             The xlib-implementation also assumes fixed-sized events.
2708             https://cgit.freedesktop.org/xorg/lib/libXi/tree/src/XSndExEv.c?id=libXi-1.7.9#n106
2709
2710             The Xserver also allows only non-GE events:
2711	     https:g/xorg/xserver/tree/Xi/sendexev.c?id=xorg-server-1.19.1#n144
2712        -->
2713    </eventstruct>
2714
2715    <request name="SendExtensionEvent" opcode="31">
2716        <field type="WINDOW" name="destination" />
2717        <field type="CARD8"  name="device_id" />
2718        <field type="BOOL"   name="propagate" />
2719        <field type="CARD16" name="num_classes" />
2720        <field type="CARD8"  name="num_events" />
2721        <pad bytes="3" />
2722        <list type="EventForSend" name="events">
2723            <fieldref>num_events</fieldref>
2724        </list>
2725        <list type="EventClass" name="classes">
2726            <fieldref>num_classes</fieldref>
2727        </list>
2728    </request>
2729
2730
2731    <!-- ⋅⋅⋅ Errors (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
2732
2733    <error name="Device"     number="0" />
2734    <error name="Event"      number="1" />
2735    <error name="Mode"       number="2" />
2736    <error name="DeviceBusy" number="3" />
2737    <error name="Class"      number="4" />
2738
2739</xcb>
2740