xinput: req ChangeDeviceProperty: bitcase to case
[free-sw/xcb/proto] / src / xinput.xml
index 20ac52b..dc87e78 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-Copyright (C) 2006 Peter Hutterer 
+Copyright (C) 2006 Peter Hutterer
+Copyright (C) 2013 Daniel Martin
 All Rights Reserved.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,10 +29,79 @@ authorization from the authors.
 
 <!-- Specifications:
      http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XIproto.txt
+     http://cgit.freedesktop.org/xorg/proto/inputproto/tree/specs/XI2proto.txt
 -->
 
+<!-- TODO: Things which need to be done for full XInput support
+       but cannot be done now ( August 18, 2014 ) with the current feature-set
+       of the xml and the generator:
+
+*****
+
+replace "uninterpreted_data" or similar constructs
+with a semantic that shows how to interpret this data.
+This requires enhancements to the xml-schema and generator such as union with selector.
+
+This will, e.g., be necessary for automatically generated byte-order conversion code,
+which will, e.g., be necessary for server-side xcb.
+
+This affects the following:
+* GetFeedbackControl reply field "feedbacks" ( structs FeedbackState, ... )
+* ChangeFeedbackControl request field "feedback" ( structs FeedbackCtl, ... )
+* QueryDeviceState reply field "classes" ( structs InputState, ... )
+* GetDeviceControl reply field "control"  ( structs DeviceState, ... )
+* ChangeDeviceControl request field "control" ( structs ChangeDeviceControl, ... )
+* XIChangeHierarchy request field "changes" ( structs  HierarchyChange, ... )
+* struct XIDeviceInfo field "classes" ( structs DeviceClass, ... )
+* SendExtensionEvent member "events"
+
+*****
+
+xml and generator have to support <popcount> of all members of a list
+
+This is needed for the following XI2-events ( and eventcopies thereof )
+       KeyPress
+       ButtonPress
+       RawKeyPress
+       RawKeyPress
+       RawButtonPress
+       TouchBegin
+       RawTouchBegin
+
+
+*****
+
+<sumof> should support fields of listmembers.
+
+This is needed for request "ListInputDevices"
+
+*****
+
+xml and generator should support
+switch-case similar to switch-bitcase.
+
+(and maybe: variable sized unions with a mechanism to define
+which union-field is selected.)
+
+One of these features is needed for the InputInfo type
+which is used by request "ListInputDevices" for the list "input_infos".
+
+*****
+
+Parametrized structs
+
+This is needed for being able to use the value of the field
+"num_axes" of the GetDeviceMotionEvents-reply
+in struct DeviceTimeCoord.
+
+*****
+
+-->
+
+
 <xcb header="xinput" extension-xname="XInputExtension" extension-name="Input"
-     major-version="1" minor-version="5">
+     major-version="2" minor-version="3">
+    <import>xfixes</import>
     <import>xproto</import>
 
     <!-- ⋅⋅⋅ Types (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
@@ -39,6 +109,16 @@ authorization from the authors.
     <typedef oldname="CARD32" newname="EventClass" />
     <typedef oldname="CARD8"  newname="KeyCode" />
 
+    <!-- ⋅⋅⋅ Types (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <typedef oldname="CARD16" newname="DeviceId" />
+    <typedef oldname="INT32"  newname="FP1616" />
+
+    <struct name="FP3232">
+        <field type="INT32"  name="integral" />
+        <field type="CARD32" name="frac" />
+    </struct>
+
     <!-- ⋅⋅⋅ Requests (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
 
     <!-- GetExtensionVersion -->
@@ -50,7 +130,7 @@ authorization from the authors.
             <fieldref>name_len</fieldref>
         </list>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD16" name="server_major" />
             <field type="CARD16" name="server_minor" />
             <field type="BOOL"   name="present" />
@@ -76,6 +156,17 @@ authorization from the authors.
         <item name="Proximity"> <value>4</value> </item>
         <item name="Focus">     <value>5</value> </item>
         <item name="Other">     <value>6</value> </item>
+        <!--
+               value Attach=7 is still contained in XI.h as "#define AttachClass"
+               but it was never transmitted over the protocol.
+               (It was used to tag a fake class created by libXi).
+
+               Even the creation of that fake class has been dropped
+               from libXi in 2009 by the following change:
+               http://cgit.freedesktop.org/xorg/lib/libXi/commit/?id=62858c426e6de1b99df660251737233afd335302
+
+               <item name="Attach">    <value>7</value> </item>
+        -->
     </enum>
 
     <enum name="ValuatorMode">
@@ -137,7 +228,7 @@ authorization from the authors.
 
     <request name="ListInputDevices" opcode="2">
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="devices_len" />
             <pad bytes="23" />
             <list type="DeviceInfo" name="devices">
@@ -160,12 +251,13 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="num_classes" />
             <pad bytes="23" />
             <list type="InputClassInfo" name="class_info">
                 <fieldref>num_classes</fieldref>
             </list>
+            <pad align="4" />
         </reply>
     </request>
 
@@ -183,8 +275,9 @@ authorization from the authors.
         <field type="CARD8" name="mode" enum="ValuatorMode" />
         <pad bytes="2" />
         <reply>
-            <pad bytes="1" />
-            <field type="CARD8" name="status" altenum="GrabStatus" />
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- values for status: 0: Success, 1: AlreadyGrabbed -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
             <pad bytes="23" />
         </reply>
     </request>
@@ -205,7 +298,7 @@ authorization from the authors.
     <request name="GetSelectedExtensionEvents" opcode="7">
         <field type="WINDOW" name="window" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD16" name="num_this_classes" />
             <field type="CARD16" name="num_all_classes" />
             <pad bytes="20" />
@@ -240,7 +333,7 @@ authorization from the authors.
     <request name="GetDeviceDontPropagateList" opcode="9">
         <field type="WINDOW" name="window" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD16" name="num_classes" />
             <pad bytes="22" />
             <list type="EventClass" name="classes">
@@ -253,7 +346,7 @@ authorization from the authors.
 
     <struct name="DeviceTimeCoord">
         <field type="TIMESTAMP" name="time" />
-        <!-- Uninterpreted: list (axisvalues) of CARD32,
+        <!-- Uninterpreted: list (axisvalues) of INT32,
                             length is num_axes from GetDeviceMotionEvents -->
     </struct>
 
@@ -261,8 +354,9 @@ authorization from the authors.
         <field type="TIMESTAMP" name="start" />
         <field type="TIMESTAMP" name="stop" altenum="Time" />
         <field type="CARD8"     name="device_id" />
+        <pad bytes="3"/>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD32" name="num_events" />
             <field type="CARD8"  name="num_axes" />
             <field type="CARD8"  name="device_mode" enum="ValuatorMode" />
@@ -277,8 +371,11 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
-            <field type="CARD8" name="status" altenum="GrabStatus" />
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- only the following GrabStatus-values are valid here:
+                 "Success", "AlreadyGrabbed", and "Frozen"
+            -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
             <pad bytes="23" />
         </reply>
     </request>
@@ -291,8 +388,11 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="1" />
         <reply>
-            <pad bytes="1" />
-            <field type="CARD8" name="status" altenum="GrabStatus" />
+            <field type="CARD8" name="xi_reply_type" />
+            <!-- only the following GrabStatus-values are valid here:
+                 "Success", "AlreadyGrabbed", and "Frozen"
+            -->
+            <field type="CARD8" name="status" enum="GrabStatus" />
             <pad bytes="23" />
         </reply>
     </request>
@@ -312,7 +412,7 @@ authorization from the authors.
             <fieldref>num_classes</fieldref>
         </list>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" enum="GrabStatus" />
             <pad bytes="23" />
         </reply>
@@ -323,15 +423,20 @@ authorization from the authors.
     <request name="UngrabDevice" opcode="14">
         <field type="TIMESTAMP" name="time" altenum="Time" />
         <field type="CARD8"     name="device_id" />
+        <pad bytes="3" />
     </request>
 
     <!-- GrabDeviceKey -->
 
+    <enum name="ModifierDevice">
+       <item name="UseXKeyboard"><value>255</value></item> <!-- 0xff -->
+    </enum>
+
     <request name="GrabDeviceKey" opcode="15">
         <field type="WINDOW" name="grab_window" />
         <field type="CARD16" name="num_classes" />
         <field type="CARD16" name="modifiers" mask="ModMask" />
-        <field type="CARD8"  name="modifier_device" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
         <field type="CARD8"  name="grabbed_device" />
         <field type="CARD8"  name="key" altenum="Grab" />
         <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
@@ -348,7 +453,7 @@ authorization from the authors.
     <request name="UngrabDeviceKey" opcode="16">
         <field type="WINDOW" name="grabWindow" />
         <field type="CARD16" name="modifiers" mask="ModMask" />
-        <field type="CARD8"  name="modifier_device" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
         <field type="CARD8"  name="key" altenum="Grab" />
         <field type="CARD8"  name="grabbed_device" />
     </request>
@@ -358,13 +463,13 @@ authorization from the authors.
     <request name="GrabDeviceButton" opcode="17">
         <field type="WINDOW" name="grab_window" />
         <field type="CARD8"  name="grabbed_device" />
-        <field type="CARD8"  name="modifier_device" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
         <field type="CARD16" name="num_classes" />
         <field type="CARD16" name="modifiers" mask="ModMask" />
         <field type="CARD8"  name="this_device_mode" enum="GrabMode" />
         <field type="CARD8"  name="other_device_mode" enum="GrabMode" />
         <field type="CARD8"  name="button" altenum="Grab" />
-        <field type="CARD8"  name="owner_events" />
+        <field type="BOOL"   name="owner_events" />
         <pad bytes="2" />
         <list type="EventClass" name="classes">
             <fieldref>num_classes</fieldref>
@@ -376,26 +481,28 @@ authorization from the authors.
     <request name="UngrabDeviceButton" opcode="18">
         <field type="WINDOW" name="grab_window" />
         <field type="CARD16" name="modifiers" mask="ModMask" />
-        <field type="CARD8"  name="modifier_device" />
+        <field type="CARD8"  name="modifier_device" altenum="ModifierDevice" />
         <field type="CARD8"  name="button" altenum="Grab" />
         <field type="CARD8"  name="grabbed_device" />
+        <pad bytes="3" />
     </request>
 
     <!-- AllowDeviceEvents -->
 
     <enum name="DeviceInputMode">
-        <item name="AsyncThisDevice" />
-        <item name="SyncThisDevice" />
-        <item name="ReplayThisDevice" />
-        <item name="AsyncOtherDevices" />
-        <item name="AsyncAll" />
-        <item name="SyncAll" />
+        <item name="AsyncThisDevice">   <value>0</value> </item>
+        <item name="SyncThisDevice">    <value>1</value> </item>
+        <item name="ReplayThisDevice">  <value>2</value> </item>
+        <item name="AsyncOtherDevices"> <value>3</value> </item>
+        <item name="AsyncAll">          <value>4</value> </item>
+        <item name="SyncAll">           <value>5</value> </item>
     </enum>
 
     <request name="AllowDeviceEvents" opcode="19">
         <field type="TIMESTAMP" name="time" altenum="Time" />
         <field type="CARD8"     name="mode" enum="DeviceInputMode" />
         <field type="CARD8"     name="device_id" />
+        <pad bytes="2" />
     </request>
 
     <!-- GetDeviceFocus -->
@@ -404,7 +511,7 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"     name="xi_reply_type" />
             <field type="WINDOW"    name="focus" altenum="InputFocus" />
             <field type="TIMESTAMP" name="time" />
             <field type="CARD8"     name="revert_to" enum="InputFocus" />
@@ -419,17 +526,18 @@ authorization from the authors.
         <field type="TIMESTAMP" name="time" altenum="Time" />
         <field type="CARD8"     name="revert_to" enum="InputFocus" />
         <field type="CARD8"     name="device_id" />
+        <pad bytes="2" />
     </request>
 
     <!-- GetFeedbackControl -->
 
     <enum name="FeedbackClass">
-        <item name="Keyboard" />
-        <item name="Pointer" />
-        <item name="String" />
-        <item name="Integer" />
-        <item name="Led" />
-        <item name="Bell" />
+        <item name="Keyboard"> <value>0</value> </item>
+        <item name="Pointer">  <value>1</value> </item>
+        <item name="String">   <value>2</value> </item>
+        <item name="Integer">  <value>3</value> </item>
+        <item name="Led">      <value>4</value> </item>
+        <item name="Bell">     <value>5</value> </item>
     </enum>
 
     <struct name="KbdFeedbackState">
@@ -501,16 +609,24 @@ authorization from the authors.
         <field type="CARD8"  name="class_id" enum="FeedbackClass" />
         <field type="CARD8"  name="feedback_id" />
         <field type="CARD16" name="len" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <fieldref>len</fieldref>
+                <value>4</value>
+            </op>
+        </list>
     </struct>
 
     <request name="GetFeedbackControl" opcode="22">
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD16" name="num_feedbacks" />
             <pad bytes="22" />
-            <!-- Uninterpreted: list (feedbacks) of FeedbackState structures -->
+            <list type="FeedbackState" name="feedbacks">
+                <fieldref>num_feedbacks</fieldref>
+            </list>
         </reply>
     </request>
 
@@ -580,13 +696,36 @@ authorization from the authors.
         <field type="CARD8"  name="class_id" enum="FeedbackClass" />
         <field type="CARD8"  name="feedback_id" />
         <field type="CARD16" name="len" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <fieldref>len</fieldref>
+                <value>4</value>
+            </op>
+        </list>
     </struct>
 
+    <enum name="ChangeFeedbackControlMask">
+        <item name="KeyClickPercent">  <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="Percent">          <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="Pitch">            <bit>2</bit> </item> <!-- 0x04 -->
+        <item name="Duration">         <bit>3</bit> </item> <!-- 0x08 -->
+        <item name="Led">              <bit>4</bit> </item> <!-- 0x10 -->
+        <item name="LedMode">          <bit>5</bit> </item> <!-- 0x20 -->
+        <item name="Key">              <bit>6</bit> </item> <!-- 0x40 -->
+        <item name="AutoRepeatMode">   <bit>7</bit> </item> <!-- 0x80 -->
+        <item name="String">           <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="Integer">          <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="AccelNum">         <bit>0</bit> </item> <!-- 0x01 -->
+        <item name="AccelDenom">       <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="Threshold">        <bit>2</bit> </item> <!-- 0x04 -->
+    </enum>
+
     <request name="ChangeFeedbackControl" opcode="23">
-        <field type="CARD32"      name="mask" />
+        <field type="CARD32"      name="mask" mask="ChangeFeedbackControlMask" />
         <field type="CARD8"       name="device_id" />
         <field type="CARD8"       name="feedback_id" />
-        <!-- Uninterpreted: field (feedback) of FeedbackCtl structure -->
+        <pad bytes="2" />
+        <field type="FeedbackCtl" name="feedback" />
     </request>
 
     <!-- GetDeviceKeyMapping -->
@@ -595,8 +734,9 @@ authorization from the authors.
         <field type="CARD8"   name="device_id" />
         <field type="KeyCode" name="first_keycode" />
         <field type="CARD8"   name="count" />
+        <pad bytes="1" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="keysyms_per_keycode" />
             <pad bytes="23" />
             <list type="KEYSYM" name="keysyms">
@@ -627,7 +767,7 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="keycodes_per_modifier" />
             <pad bytes="23" />
             <list type="CARD8"  name="keymaps">
@@ -644,7 +784,7 @@ authorization from the authors.
     <request name="SetDeviceModifierMapping" opcode="27">
         <field type="CARD8" name="device_id" />
         <field type="CARD8" name="keycodes_per_modifier" />
-        <pad bytes="1" />
+        <pad bytes="2" />
         <list type="CARD8" name="keymaps">
             <op op="*">
                 <fieldref>keycodes_per_modifier</fieldref>
@@ -652,7 +792,7 @@ authorization from the authors.
             </op>
         </list>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" enum="MappingStatus" />
             <pad bytes="23" />
         </reply>
@@ -664,12 +804,13 @@ authorization from the authors.
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="map_size" />
             <pad bytes="23" />
             <list type="CARD8" name="map">
                 <fieldref>map_size</fieldref>
             </list>
+            <pad align="4" />
         </reply>
     </request>
 
@@ -683,7 +824,7 @@ authorization from the authors.
             <fieldref>map_size</fieldref>
         </list>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" enum="MappingStatus" />
             <pad bytes="23" />
         </reply>
@@ -711,11 +852,16 @@ authorization from the authors.
         </list>
     </struct>
 
+    <enum name="ValuatorStateModeMask">
+        <item name="DeviceModeAbsolute"> <bit>0</bit> </item>
+        <item name="OutOfProximity">     <bit>1</bit> </item>
+    </enum>
+
     <struct name="ValuatorState">
         <field type="CARD8" name="class_id" enum="InputClass" />
         <field type="CARD8" name="len" />
         <field type="CARD8" name="num_valuators" />
-        <field type="CARD8" name="mode" />
+        <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
         <list type="CARD32" name="valuators">
             <fieldref>num_valuators</fieldref>
         </list>
@@ -725,16 +871,25 @@ authorization from the authors.
         <field type="CARD8" name="class_id" enum="InputClass" />
         <field type="CARD8" name="len" />
         <field type="CARD8" name="num_items" />
+        <pad bytes="1" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <fieldref>len</fieldref>
+                <value>4</value>
+            </op>
+        </list>
     </struct>
 
     <request name="QueryDeviceState" opcode="30">
         <field type="CARD8" name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="num_classes" />
             <pad bytes="23" />
-            <!-- Uninterpreted: list (classes) of InputState structures -->
+            <list type="InputState" name="classes">
+                <fieldref>num_classes</fieldref>
+            </list>
         </reply>
     </request>
 
@@ -778,7 +933,7 @@ authorization from the authors.
             <fieldref>num_valuators</fieldref>
         </list>
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" enum="GrabStatus" />
             <pad bytes="23" />
         </reply>
@@ -851,6 +1006,12 @@ authorization from the authors.
     <struct name="DeviceState">
         <field type="CARD16" name="control_id" enum="DeviceControl" />
         <field type="CARD16" name="len" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <fieldref>len</fieldref>
+                <value>4</value>
+            </op>
+        </list>
     </struct>
 
     <request name="GetDeviceControl" opcode="34">
@@ -858,10 +1019,10 @@ authorization from the authors.
         <field type="CARD8"  name="device_id" />
         <pad bytes="1" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" altenum="GrabStatus" />
             <pad bytes="23" />
-            <!-- Uninterpreted: field (control) of DeviceState structure -->
+            <field type="DeviceState" name="control" />
         </reply>
     </request>
 
@@ -872,6 +1033,7 @@ authorization from the authors.
         <field type="CARD16" name="len" />
         <field type="CARD8"  name="first_valuator" />
         <field type="CARD8"  name="num_valuators" />
+        <pad bytes="2" />
         <list type="CARD32"  name="resolution_values">
             <fieldref>num_valuators</fieldref>
         </list>
@@ -918,15 +1080,21 @@ authorization from the authors.
     <struct name="DeviceCtl">
         <field type="CARD16" name="control_id" enum="DeviceControl" />
         <field type="CARD16" name="len" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <fieldref>len</fieldref>
+                <value>4</value>
+            </op>
+        </list>
     </struct>
 
     <request name="ChangeDeviceControl" opcode="35">
         <field type="CARD16" name="control_id" enum="DeviceControl" />
         <field type="CARD8"  name="device_id" />
         <pad bytes="1" />
-        <!-- Uninterpreted: field (control) of DeviceCtl structure -->
+        <field type="DeviceCtl" name="control" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8" name="xi_reply_type" />
             <field type="CARD8" name="status" altenum="GrabStatus" />
             <pad bytes="23" />
         </reply>
@@ -940,7 +1108,7 @@ authorization from the authors.
         <field type="CARD8"  name="device_id" />
         <pad bytes="3" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="CARD16" name="num_atoms" />
             <pad bytes="22" />
             <list type="ATOM" name="atoms">
@@ -952,7 +1120,7 @@ authorization from the authors.
     <!-- ChangeDeviceProperty -->
 
     <enum name="PropertyFormat">
-        <item name="8Bits">  <value> 8</value> </item>
+        <item name="8Bits">  <value>8</value> </item>
         <item name="16Bits"> <value>16</value> </item>
         <item name="32Bits"> <value>32</value> </item>
     </enum>
@@ -967,28 +1135,26 @@ authorization from the authors.
         <field type="CARD32" name="num_items" />
         <switch name="items">
             <fieldref>format</fieldref>
-            <!-- <bitcase> is not correct, this would need <cases>s.
-                 It works in that case, because PropertyFormat items can be
-                 distinguished exactly as their values don't have equal bits.
-            -->
-            <bitcase>
+            <case>
                 <enumref ref="PropertyFormat">8Bits</enumref>
                 <list type="CARD8" name="data8">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
-            <bitcase>
+                <pad align="4" />
+            </case>
+            <case>
                 <enumref ref="PropertyFormat">16Bits</enumref>
                 <list type="CARD16" name="data16">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
-            <bitcase>
+                <pad align="4" />
+            </case>
+            <case>
                 <enumref ref="PropertyFormat">32Bits</enumref>
                 <list type="CARD32" name="data32">
                     <fieldref>num_items</fieldref>
                 </list>
-            </bitcase>
+            </case>
         </switch>
     </request>
 
@@ -1011,7 +1177,7 @@ authorization from the authors.
         <field type="BOOL"   name="delete" />
         <pad bytes="2" />
         <reply>
-            <pad bytes="1" />
+            <field type="CARD8"  name="xi_reply_type" />
             <field type="ATOM"   name="type" />
             <field type="CARD32" name="bytes_after" />
             <field type="CARD32" name="num_items" />
@@ -1029,12 +1195,14 @@ authorization from the authors.
                     <list type="CARD8" name="data8">
                         <fieldref>num_items</fieldref>
                     </list>
+                    <pad align="4" />
                 </bitcase>
                 <bitcase>
                     <enumref ref="PropertyFormat">16Bits</enumref>
                     <list type="CARD16" name="data16">
                         <fieldref>num_items</fieldref>
                     </list>
+                    <pad align="4" />
                 </bitcase>
                 <bitcase>
                     <enumref ref="PropertyFormat">32Bits</enumref>
@@ -1046,126 +1214,804 @@ authorization from the authors.
         </reply>
     </request>
 
-    <!-- ⋅⋅⋅ Events (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
-    <!-- Notes:
-         - A 'len' field in a v1++ structure is in bytes.
-    -->
+    <!-- ⋅⋅⋅ Requests (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
 
-    <event name="DeviceValuator" number="0">
-        <field type="CARD8"  name="device_id" />
-        <field type="CARD16" name="device_state" />
-        <field type="CARD8"  name="num_valuators" />
-        <field type="CARD8"  name="first_valuator" />
-        <list type="INT32"   name="valuators">
-            <value>6</value>
-        </list>
-    </event>
+    <!-- XIQueryPointer -->
 
-    <event name="DeviceKeyPress" number="1">
-        <field type="BYTE"      name="detail" />
-        <field type="TIMESTAMP" name="time" />
-        <field type="WINDOW"    name="root" />
-        <field type="WINDOW"    name="event" />
-        <field type="WINDOW"    name="child" altenum="Window" />
-        <field type="INT16"     name="root_x" />
-        <field type="INT16"     name="root_y" />
-        <field type="INT16"     name="event_x" />
-        <field type="INT16"     name="event_y" />
-        <field type="CARD16"    name="state" />
-        <field type="BOOL"      name="same_screen" />
-        <field type="CARD8"     name="device_id" />
-    </event>
+    <enum name="Device">
+        <item name="All">       <value>0</value> </item>
+        <item name="AllMaster"> <value>1</value> </item>
+    </enum>
 
-    <eventcopy name="DeviceKeyRelease"    number="2" ref="DeviceKeyPress" />
-    <eventcopy name="DeviceButtonPress"   number="3" ref="DeviceKeyPress" />
-    <eventcopy name="DeviceButtonRelease" number="4" ref="DeviceKeyPress" />
-    <eventcopy name="DeviceMotionNotify"  number="5" ref="DeviceKeyPress" />
+    <struct name="GroupInfo">
+        <field type="CARD8" name="base" />
+        <field type="CARD8" name="latched" />
+        <field type="CARD8" name="locked" />
+        <field type="CARD8" name="effective" />
+    </struct>
 
-    <event name="DeviceFocusIn" number="6">
-        <field type="BYTE"      name="detail" enum="NotifyDetail" />
-        <field type="TIMESTAMP" name="time" />
-        <field type="WINDOW"    name="window" />
-        <field type="BYTE"      name="mode" enum="NotifyMode" />
-        <field type="CARD8"     name="device_id" />
-        <pad bytes="18" />
-    </event>
+    <struct name="ModifierInfo">
+        <field type="CARD32" name="base" />
+        <field type="CARD32" name="latched" />
+        <field type="CARD32" name="locked" />
+        <field type="CARD32" name="effective" />
+    </struct>
 
-    <eventcopy name="DeviceFocusOut" number="7" ref="DeviceFocusIn" />
-    <eventcopy name="ProximityIn"    number="8" ref="DeviceKeyPress" />
-    <eventcopy name="ProximityOut"   number="9" ref="DeviceKeyPress" />
+    <request name="XIQueryPointer" opcode="40">
+        <field type="WINDOW"   name="window" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="WINDOW"       name="root" />
+            <field type="WINDOW"       name="child" />
+            <field type="FP1616"       name="root_x" />
+            <field type="FP1616"       name="root_y" />
+            <field type="FP1616"       name="win_x" />
+            <field type="FP1616"       name="win_y" />
+            <field type="BOOL"         name="same_screen" />
+            <pad bytes="1" />
+            <field type="CARD16"       name="buttons_len" />
+            <field type="ModifierInfo" name="mods" />
+            <field type="GroupInfo"    name="group" />
+            <list type="CARD32" name="buttons">
+                <fieldref>buttons_len</fieldref>
+            </list>
+        </reply>
+    </request>
 
-    <event name="DeviceStateNotify" number="10">
-        <field type="BYTE"      name="device_id" />
-        <field type="TIMESTAMP" name="time" />
-        <field type="CARD8"     name="num_keys" />
-        <field type="CARD8"     name="num_buttons" />
-        <field type="CARD8"     name="num_valuators" />
-        <field type="CARD8"     name="classes_reported" />
-        <list type="CARD8"      name="buttons">
-            <value>4</value>
+    <!-- XIWarpPointer -->
+
+    <request name="XIWarpPointer" opcode="41">
+        <field type="WINDOW"   name="src_win" />
+        <field type="WINDOW"   name="dst_win" />
+        <field type="FP1616"   name="src_x" />
+        <field type="FP1616"   name="src_y" />
+        <field type="CARD16"   name="src_width" />
+        <field type="CARD16"   name="src_height" />
+        <field type="FP1616"   name="dst_x" />
+        <field type="FP1616"   name="dst_y" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIChangeCursor -->
+
+    <request name="XIChangeCursor" opcode="42">
+        <field type="WINDOW"   name="window" />
+        <field type="CURSOR"   name="cursor" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIChangeHierarchy -->
+
+    <enum name="HierarchyChangeType">
+        <item name="AddMaster">    <value>1</value> </item>
+        <item name="RemoveMaster"> <value>2</value> </item>
+        <item name="AttachSlave">  <value>3</value> </item>
+        <item name="DetachSlave">  <value>4</value> </item>
+    </enum>
+
+    <enum name="ChangeMode">
+        <item name="Attach"> <value>1</value> </item>
+        <item name="Float">  <value>2</value> </item>
+    </enum>
+
+    <struct name="AddMaster">
+        <field type="CARD16" name="type" enum="HierarchyChangeType" />
+        <field type="CARD16" name="len" />
+        <field type="CARD16" name="name_len" />
+        <field type="BOOL"   name="send_core" />
+        <field type="BOOL"   name="enable" />
+        <list type="char" name="name">
+            <fieldref>name_len</fieldref>
         </list>
-        <list type="CARD8" name="keys">
-            <value>4</value>
+        <pad align="4" />
+    </struct>
+
+    <struct name="RemoveMaster">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD8"    name="return_mode" enum="ChangeMode" />
+        <pad bytes="1" />
+        <field type="DeviceId" name="return_pointer" altenum="Device" />
+        <field type="DeviceId" name="return_keyboard" altenum="Device" />
+    </struct>
+
+    <struct name="AttachSlave">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="DeviceId" name="master" altenum="Device" />
+    </struct>
+
+    <struct name="DetachSlave">
+        <field type="CARD16"   name="type" enum="HierarchyChangeType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </struct>
+
+    <struct name="HierarchyChange">
+        <field type="CARD16" name="type" enum="HierarchyChangeType" />
+        <field type="CARD16" name="len" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <op op="*">
+                    <fieldref>len</fieldref>
+                    <value>4</value>
+                </op>
+                <value>4</value>
+            </op>
         </list>
-        <list type="CARD32" name="valuators">
-            <value>3</value>
+    </struct>
+
+    <request name="XIChangeHierarchy" opcode="43">
+        <field type="CARD8" name="num_changes" />
+        <pad bytes="3" />
+        <list type="HierarchyChange" name="changes">
+            <fieldref>num_changes</fieldref>
         </list>
-    </event>
+    </request>
 
-    <event name="DeviceMappingNotify" number="11">
-        <field type="BYTE"    name="device_id" />
-        <field type="CARD8"   name="request" />
-        <field type="KeyCode" name="first_keycode" />
-        <field type="CARD8"   name="count" />
-        <pad bytes="1" />
-        <field type="TIMESTAMP" name="time" />
-        <pad bytes="20" />
-    </event>
+    <!-- XISetClientPointer -->
 
-    <event name="ChangeDeviceNotify" number="12">
-        <field type="BYTE"      name="device_id" />
-        <field type="TIMESTAMP" name="time" />
-        <field type="CARD8"     name="request" />
-        <pad bytes="23" />
-    </event>
+    <request name="XISetClientPointer" opcode="44">
+        <field type="WINDOW"   name="window" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
 
-    <event name="DeviceKeyStateNotify" number="13">
-        <field type="BYTE" name="device_id" />
-        <list type="CARD8" name="keys">
-            <value>28</value>
+    <!-- XIGetClientPointer -->
+
+    <request name="XIGetClientPointer" opcode="45">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <pad bytes="1" />
+            <field type="BOOL"     name="set" />
+            <pad bytes="1" />
+            <field type="DeviceId" name="deviceid" altenum="Device" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XISelectEvents -->
+
+    <enum name="XIEventMask">
+        <item name="DeviceChanged">    <bit>1</bit> </item>
+        <item name="KeyPress">         <bit>2</bit> </item>
+        <item name="KeyRelease">       <bit>3</bit> </item>
+        <item name="ButtonPress">      <bit>4</bit> </item>
+        <item name="ButtonRelease">    <bit>5</bit> </item>
+        <item name="Motion">           <bit>6</bit> </item>
+        <item name="Enter">            <bit>7</bit> </item>
+        <item name="Leave">            <bit>8</bit> </item>
+        <item name="FocusIn">          <bit>9</bit> </item>
+        <item name="FocusOut">         <bit>10</bit> </item>
+        <item name="Hierarchy">        <bit>11</bit> </item>
+        <item name="Property">         <bit>12</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅ -->
+        <item name="RawKeyPress">      <bit>13</bit> </item>
+        <item name="RawKeyRelease">    <bit>14</bit> </item>
+        <item name="RawButtonPress">   <bit>15</bit> </item>
+        <item name="RawButtonRelease"> <bit>16</bit> </item>
+        <item name="RawMotion">        <bit>17</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅ -->
+        <item name="TouchBegin">       <bit>18</bit> </item>
+        <item name="TouchUpdate">      <bit>19</bit> </item>
+        <item name="TouchEnd">         <bit>20</bit> </item>
+        <item name="TouchOwnership">   <bit>21</bit> </item>
+        <item name="RawTouchBegin">    <bit>22</bit> </item>
+        <item name="RawTouchUpdate">   <bit>23</bit> </item>
+        <item name="RawTouchEnd">      <bit>24</bit> </item>
+        <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅ -->
+        <item name="BarrierHit">       <bit>25</bit> </item>
+        <item name="BarrierLeave">     <bit>26</bit> </item>
+    </enum>
+
+    <struct name="EventMask">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="mask_len" />
+        <list type="CARD32" name="mask" mask="XIEventMask">
+            <fieldref>mask_len</fieldref>
         </list>
-    </event>
+    </struct>
 
-    <event name="DeviceButtonStateNotify" number="14">
-        <field type="BYTE" name="device_id" />
-        <list type="CARD8" name="buttons">
-            <value>28</value>
+    <request name="XISelectEvents" opcode="46">
+        <field type="WINDOW" name="window" />
+        <field type="CARD16" name="num_mask" />
+        <pad bytes="2" />
+        <list type="EventMask" name="masks">
+            <fieldref>num_mask</fieldref>
         </list>
-    </event>
+    </request>
 
-    <!-- ⋅⋅⋅ Events (v1.4) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <!-- XIQueryVersion -->
 
-    <enum name="DeviceChange">
-        <item name="Added" />
-        <item name="Removed" />
-        <item name="Enabled" />
-        <item name="Disabled" />
-        <item name="Unrecoverable" />
-        <item name="ControlChanged" />
+    <request name="XIQueryVersion" opcode="47">
+        <field type="CARD16" name="major_version" />
+        <field type="CARD16" name="minor_version" />
+
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="major_version" />
+            <field type="CARD16" name="minor_version" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XIQueryDevice -->
+
+    <enum name="DeviceClassType">
+        <item name="Key">      <value>0</value> </item>
+        <item name="Button">   <value>1</value> </item>
+        <item name="Valuator"> <value>2</value> </item>
+        <item name="Scroll">   <value>3</value> </item>
+        <item name="Touch">    <value>8</value> </item>
     </enum>
 
-    <event name="DevicePresenceNotify" number="15">
-        <pad bytes="1" />
-        <field type="TIMESTAMP" name="time" />
-        <field type="BYTE"      name="devchange" enum="DeviceChange" />
-        <field type="BYTE"      name="device_id" />
-        <field type="CARD16"    name="control" />
-        <pad bytes="20" />
-    </event>
+    <enum name="DeviceType">
+        <item name="MasterPointer">  <value>1</value> </item>
+        <item name="MasterKeyboard"> <value>2</value> </item>
+        <item name="SlavePointer">   <value>3</value> </item>
+        <item name="SlaveKeyboard">  <value>4</value> </item>
+        <item name="FloatingSlave">  <value>5</value> </item>
+    </enum>
 
-    <!-- ⋅⋅⋅ Events (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <enum name="ScrollFlags">
+        <item name="NoEmulation"> <bit>0</bit> </item>
+        <item name="Preferred">   <bit>1</bit> </item>
+    </enum>
 
-    <event name="DevicePropertyNotify" number="16">
+    <enum name="ScrollType">
+        <item name="Vertical">   <value>1</value> </item>
+        <item name="Horizontal"> <value>2</value> </item>
+    </enum>
+
+    <enum name="TouchMode">
+        <item name="Direct">    <value>1</value> </item>
+        <item name="Dependent"> <value>2</value> </item>
+    </enum>
+
+    <struct name="ButtonClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="num_buttons" />
+        <list type="CARD32"    name="state">
+            <op op="/">
+                <op op="+">
+                    <fieldref>num_buttons</fieldref>
+                    <value>31</value>
+                </op>
+                <value>32</value>
+            </op>
+        </list>
+        <list type="ATOM" name="labels">
+            <fieldref>num_buttons</fieldref>
+        </list>
+    </struct>
+
+    <struct name="KeyClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="num_keys" />
+        <list type="CARD32" name="keys">
+            <fieldref>num_keys</fieldref>
+        </list>
+    </struct>
+
+    <struct name="ScrollClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="number" />
+        <field type="CARD16"   name="scroll_type" enum="ScrollType" />
+        <pad bytes="2" />
+        <field type="CARD32"   name="flags" mask="ScrollFlags" />
+        <field type="FP3232"   name="increment" />
+    </struct>
+
+    <struct name="TouchClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD8"    name="mode" enum="TouchMode" />
+        <field type="CARD8"    name="num_touches" />
+    </struct>
+
+    <struct name="ValuatorClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <field type="CARD16"   name="number" />
+        <field type="ATOM"     name="label" />
+        <field type="FP3232"   name="min" />
+        <field type="FP3232"   name="max" />
+        <field type="FP3232"   name="value" />
+        <field type="CARD32"   name="resolution" />
+        <field type="CARD8"    name="mode" enum="ValuatorMode" />
+        <pad bytes="3" />
+    </struct>
+
+    <struct name="DeviceClass">
+        <field type="CARD16"   name="type" enum="DeviceClassType" />
+        <field type="CARD16"   name="len" />
+        <field type="DeviceId" name="sourceid" />
+        <pad bytes="2" />
+        <list type="CARD8" name="uninterpreted_data">
+            <op op="-">
+                <op op="*">
+                    <fieldref>len</fieldref>
+                    <value>4</value>
+                </op>
+                <value>8</value>
+            </op>
+        </list>
+    </struct>
+
+    <struct name="XIDeviceInfo">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="type" enum="DeviceType" />
+        <field type="DeviceId" name="attachment" altenum="Device" />
+        <field type="CARD16"   name="num_classes" />
+        <field type="CARD16"   name="name_len" />
+        <field type="BOOL"     name="enabled" />
+        <pad bytes="1" />
+        <list type="char" name="name">
+            <fieldref>name_len</fieldref>
+        </list>
+        <pad align="4" />
+        <list type="DeviceClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </struct>
+
+    <request name="XIQueryDevice" opcode="48">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_infos" />
+            <pad bytes="22" />
+            <list type="XIDeviceInfo" name="infos">
+                <fieldref>num_infos</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XISetFocus -->
+
+    <request name="XISetFocus" opcode="49">
+        <field type="WINDOW"    name="window" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIGetFocus -->
+
+    <request name="XIGetFocus" opcode="50">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="WINDOW" name="focus" />
+            <pad bytes="20" />
+        </reply>
+    </request>
+
+    <!-- XIGrabDevice -->
+
+    <enum name="GrabOwner">
+        <item name="NoOwner"> <value>0</value> </item>
+        <item name="Owner">   <value>1</value> </item>
+    </enum>
+
+    <request name="XIGrabDevice" opcode="51">
+        <field type="WINDOW"    name="window" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="CURSOR"    name="cursor" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD8"     name="mode" enum="GrabMode" />
+        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
+        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
+        <pad bytes="1" />
+        <field type="CARD16"    name="mask_len" />
+        <list type="CARD32" name="mask">
+            <fieldref>mask_len</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD8" name="status" enum="GrabStatus" />
+            <pad bytes="23" />
+        </reply>
+    </request>
+
+    <!-- XIUngrabDevice -->
+
+    <request name="XIUngrabDevice" opcode="52">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+    </request>
+
+    <!-- XIAllowEvents -->
+
+    <enum name="EventMode">
+        <item name="AsyncDevice">       <value>0</value> </item>
+        <item name="SyncDevice">        <value>1</value> </item>
+        <item name="ReplayDevice">      <value>2</value> </item>
+        <item name="AsyncPairedDevice"> <value>3</value> </item>
+        <item name="AsyncPair">         <value>4</value> </item>
+        <item name="SyncPair">          <value>5</value> </item>
+        <item name="AcceptTouch">       <value>6</value> </item>
+        <item name="RejectTouch">       <value>7</value> </item>
+    </enum>
+
+    <request name="XIAllowEvents" opcode="53">
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD8"     name="event_mode" enum="EventMode" />
+        <pad bytes="1" />
+        <field type="CARD32"    name="touchid" />
+        <field type="WINDOW"    name="grab_window" />
+    </request>
+
+    <!-- XIPassiveGrabDevice -->
+
+    <enum name="GrabMode22">
+        <item name="Sync">  <value>0</value> </item>
+        <item name="Async"> <value>1</value> </item>
+        <item name="Touch"> <value>2</value> </item>
+    </enum>
+
+    <enum name="GrabType">
+        <item name="Button">     <value>0</value> </item>
+        <item name="Keycode">    <value>1</value> </item>
+        <item name="Enter">      <value>2</value> </item>
+        <item name="FocusIn">    <value>3</value> </item>
+        <item name="TouchBegin"> <value>4</value> </item>
+    </enum>
+
+    <enum name="ModifierMask">
+        <item name="Any"> <bit>31</bit> </item>
+    </enum>
+
+    <struct name="GrabModifierInfo">
+        <field type="CARD32" name="modifiers" altenum="ModifierMask" />
+        <field type="CARD8"  name="status" enum="GrabStatus" />
+        <pad bytes="3" />
+    </struct>
+
+    <request name="XIPassiveGrabDevice" opcode="54">
+        <!-- field "time" is unused and its value is undefined -->
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <field type="WINDOW"    name="grab_window" />
+        <field type="CURSOR"    name="cursor" />
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="CARD16"    name="num_modifiers" />
+        <field type="CARD16"    name="mask_len" />
+        <field type="CARD8"     name="grab_type" enum="GrabType" />
+        <field type="CARD8"     name="grab_mode" enum="GrabMode22" />
+        <field type="CARD8"     name="paired_device_mode" enum="GrabMode" />
+        <field type="BOOL"      name="owner_events" enum="GrabOwner" />
+        <pad bytes="2" />
+        <list type="CARD32" name="mask">
+            <fieldref>mask_len</fieldref>
+        </list>
+        <list type="CARD32" name="modifiers">
+            <fieldref>num_modifiers</fieldref>
+        </list>
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_modifiers" />
+            <pad bytes="22" />
+            <list type="GrabModifierInfo" name="modifiers">
+                <fieldref>num_modifiers</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XIPassiveUngrabDevice -->
+
+    <request name="XIPassiveUngrabDevice" opcode="55">
+        <field type="WINDOW"   name="grab_window" />
+        <field type="CARD32"   name="detail" />
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD16"   name="num_modifiers" />
+        <field type="CARD8"    name="grab_type" enum="GrabType" />
+        <pad bytes="3" />
+        <list type="CARD32" name="modifiers">
+            <fieldref>num_modifiers</fieldref>
+        </list>
+    </request>
+
+    <!-- XIListProperties -->
+
+    <request name="XIListProperties" opcode="56">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_properties" />
+            <pad bytes="22" />
+            <list type="ATOM" name="properties">
+                <fieldref>num_properties</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- XIChangeProperty -->
+
+    <request name="XIChangeProperty" opcode="57">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="CARD8"    name="mode" enum="PropMode" />
+        <field type="CARD8"    name="format" enum="PropertyFormat" />
+        <field type="ATOM"     name="property" />
+        <field type="ATOM"     name="type" />
+        <field type="CARD32"   name="num_items" />
+        <switch name="items">
+            <fieldref>format</fieldref>
+            <!-- <bitcase> is not correct, this would need <cases>s.
+                 It works in that case, because PropertyFormat items can be
+                 distinguished exactly as their values don't have equal bits.
+            -->
+            <bitcase>
+                <enumref ref="PropertyFormat">8Bits</enumref>
+                <list type="CARD8" name="data8">
+                    <fieldref>num_items</fieldref>
+                </list>
+            </bitcase>
+            <bitcase>
+                <enumref ref="PropertyFormat">16Bits</enumref>
+                <list type="CARD16" name="data16">
+                    <fieldref>num_items</fieldref>
+                </list>
+            </bitcase>
+            <bitcase>
+                <enumref ref="PropertyFormat">32Bits</enumref>
+                <list type="CARD32" name="data32">
+                    <fieldref>num_items</fieldref>
+                </list>
+            </bitcase>
+        </switch>
+    </request>
+
+    <!-- XIDeleteProperty -->
+
+    <request name="XIDeleteProperty" opcode="58">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="ATOM"     name="property" />
+    </request>
+
+    <!-- XIGetProperty -->
+
+    <request name="XIGetProperty" opcode="59">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="BOOL"     name="delete" />
+        <pad bytes="1" />
+        <field type="ATOM"     name="property" />
+        <field type="ATOM"     name="type" />
+        <field type="CARD32"   name="offset" />
+        <field type="CARD32"   name="len" />
+        <reply>
+            <pad bytes="1" />
+            <field type="ATOM"   name="type" />
+            <field type="CARD32" name="bytes_after" />
+            <field type="CARD32" name="num_items" />
+            <field type="CARD8"  name="format" enum="PropertyFormat" />
+            <pad bytes="11" />
+            <switch name="items">
+                <fieldref>format</fieldref>
+                <!-- <bitcase> is not correct, this would need <cases>s.
+                     It works in that case, because PropertyFormat items can be
+                     distinguished exactly as their values don't have equal bits.
+                -->
+                <bitcase>
+                    <enumref ref="PropertyFormat">8Bits</enumref>
+                    <list type="CARD8" name="data8">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </bitcase>
+                <bitcase>
+                    <enumref ref="PropertyFormat">16Bits</enumref>
+                    <list type="CARD16" name="data16">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                    <pad align="4" />
+                </bitcase>
+                <bitcase>
+                    <enumref ref="PropertyFormat">32Bits</enumref>
+                    <list type="CARD32" name="data32">
+                        <fieldref>num_items</fieldref>
+                    </list>
+                </bitcase>
+            </switch>
+        </reply>
+    </request>
+
+    <!-- XIGetSelectedEvents -->
+
+    <request name="XIGetSelectedEvents" opcode="60">
+        <field type="WINDOW" name="window" />
+        <reply>
+            <pad bytes="1" />
+            <field type="CARD16" name="num_masks" />
+            <pad bytes="22" />
+            <list type="EventMask" name="masks">
+                <fieldref>num_masks</fieldref>
+            </list>
+        </reply>
+    </request>
+
+    <!-- ⋅⋅⋅ Requests (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <!-- XIBarrierReleasePointer -->
+
+    <struct name="BarrierReleasePointerInfo">
+        <field type="DeviceId" name="deviceid" />
+        <pad bytes="2" />
+        <field type="BARRIER"  name="barrier" />
+        <field type="CARD32"   name="eventid" />
+    </struct>
+
+    <request name="XIBarrierReleasePointer" opcode="61">
+        <field type="CARD32" name="num_barriers" />
+        <list type="BarrierReleasePointerInfo" name="barriers">
+            <fieldref>num_barriers</fieldref>
+        </list>
+    </request>
+
+    <!-- ⋅⋅⋅ Events (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <!-- Notes:
+         - A 'len' field in a v1++ structure is in bytes.
+    -->
+
+    <event name="DeviceValuator" number="0">
+        <field type="CARD8"  name="device_id" />
+        <field type="CARD16" name="device_state" />
+        <field type="CARD8"  name="num_valuators" />
+        <field type="CARD8"  name="first_valuator" />
+        <list type="INT32"   name="valuators">
+            <value>6</value>
+        </list>
+    </event>
+
+    <!-- the highest bit in a CARD8 device_id-field indicates that more
+       events will follow -->
+    <enum name="MoreEventsMask">
+       <item name="MoreEvents"> <bit>7</bit> </item> <!-- 0x80 -->
+    </enum>
+
+    <event name="DeviceKeyPress" number="1">
+        <field type="BYTE"      name="detail" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" altenum="Window" />
+        <field type="INT16"     name="root_x" />
+        <field type="INT16"     name="root_y" />
+        <field type="INT16"     name="event_x" />
+        <field type="INT16"     name="event_y" />
+        <field type="CARD16"    name="state" mask="KeyButMask" />
+        <field type="BOOL"      name="same_screen" />
+        <field type="CARD8"     name="device_id" altmask="MoreEventsMask" />
+    </event>
+
+    <eventcopy name="DeviceKeyRelease"    number="2" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceButtonPress"   number="3" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceButtonRelease" number="4" ref="DeviceKeyPress" />
+    <eventcopy name="DeviceMotionNotify"  number="5" ref="DeviceKeyPress" />
+
+    <event name="DeviceFocusIn" number="6">
+        <field type="BYTE"      name="detail" enum="xproto:NotifyDetail" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="WINDOW"    name="window" />
+        <field type="BYTE"      name="mode" enum="xproto:NotifyMode" />
+        <field type="CARD8"     name="device_id" />
+        <pad bytes="18" />
+    </event>
+
+    <eventcopy name="DeviceFocusOut" number="7" ref="DeviceFocusIn" />
+    <eventcopy name="ProximityIn"    number="8" ref="DeviceKeyPress" />
+    <eventcopy name="ProximityOut"   number="9" ref="DeviceKeyPress" />
+
+    <enum name="ClassesReportedMask">
+        <item name="OutOfProximity">     <bit>7</bit> </item> <!-- 0x80 -->
+            <!-- 0 = InProxmity, 1 = OutOfProximity -->
+
+        <item name="DeviceModeAbsolute"> <bit>6</bit> </item> <!-- 0x40 -->
+            <!-- 0 = Relative, 1 = Absolute -->
+
+        <item name="ReportingValuators"> <bit>2</bit> </item> <!-- 0x04 -->
+        <item name="ReportingButtons">   <bit>1</bit> </item> <!-- 0x02 -->
+        <item name="ReportingKeys">      <bit>0</bit> </item> <!-- 0x01 -->
+    </enum>
+
+    <event name="DeviceStateNotify" number="10">
+        <field type="BYTE"      name="device_id" altmask="MoreEventsMask" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="CARD8"     name="num_keys" />
+        <field type="CARD8"     name="num_buttons" />
+        <field type="CARD8"     name="num_valuators" />
+        <field type="CARD8"     name="classes_reported" mask="ClassesReportedMask" />
+        <list type="CARD8"      name="buttons">
+            <value>4</value>
+        </list>
+        <list type="CARD8" name="keys">
+            <value>4</value>
+        </list>
+        <list type="CARD32" name="valuators">
+            <value>3</value>
+        </list>
+    </event>
+
+    <event name="DeviceMappingNotify" number="11">
+        <field type="BYTE"    name="device_id" />
+        <field type="CARD8"   name="request" enum="Mapping" />
+        <field type="KeyCode" name="first_keycode" />
+        <field type="CARD8"   name="count" />
+        <pad bytes="1" />
+        <field type="TIMESTAMP" name="time" />
+        <pad bytes="20" />
+    </event>
+
+    <enum name="ChangeDevice">
+       <item name="NewPointer">  <value>0</value> </item>
+       <item name="NewKeyboard"> <value>1</value> </item>
+    </enum>
+
+    <event name="ChangeDeviceNotify" number="12">
+        <field type="BYTE"      name="device_id" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="CARD8"     name="request" enum="ChangeDevice" />
+        <pad bytes="23" />
+    </event>
+
+    <event name="DeviceKeyStateNotify" number="13">
+        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
+        <list type="CARD8" name="keys">
+            <value>28</value>
+        </list>
+    </event>
+
+    <event name="DeviceButtonStateNotify" number="14">
+        <field type="BYTE" name="device_id" altmask="MoreEventsMask" />
+        <list type="CARD8" name="buttons">
+            <value>28</value>
+        </list>
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v1.4) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="DeviceChange">
+        <item name="Added">          <value>0</value> </item>
+        <item name="Removed">        <value>1</value> </item>
+        <item name="Enabled">        <value>2</value> </item>
+        <item name="Disabled">       <value>3</value> </item>
+        <item name="Unrecoverable">  <value>4</value> </item>
+        <item name="ControlChanged"> <value>5</value> </item>
+    </enum>
+
+    <event name="DevicePresenceNotify" number="15">
+        <pad bytes="1" />
+        <field type="TIMESTAMP" name="time" />
+        <field type="BYTE"      name="devchange" enum="DeviceChange" />
+        <field type="BYTE"      name="device_id" />
+        <field type="CARD16"    name="control" />
+        <pad bytes="20" />
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v1.5) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <event name="DevicePropertyNotify" number="16">
         <field type="BYTE"      name="state" enum="Property" />
         <field type="TIMESTAMP" name="time" />
         <field type="ATOM"      name="property" />
@@ -1173,6 +2019,356 @@ authorization from the authors.
         <field type="CARD8"     name="device_id" />
     </event>
 
+    <!-- ⋅⋅⋅ Events (v2.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+    <!-- Notes:
+         - A 'len' field in a v2++ structure is in 4 byte units.
+    -->
+
+    <enum name="ChangeReason">
+        <item name="SlaveSwitch">  <value>1</value> </item>
+        <item name="DeviceChange"> <value>2</value> </item>
+    </enum>
+
+    <event name="DeviceChanged" number="1" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD16"    name="num_classes" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <field type="CARD8"     name="reason" enum="ChangeReason" />
+        <pad bytes="11" />
+        <!-- 32 byte boundary -->
+        <list type="DeviceClass" name="classes">
+            <fieldref>num_classes</fieldref>
+        </list>
+    </event>
+
+    <enum name="KeyEventFlags">
+        <item name="KeyRepeat"> <bit>16</bit> </item>
+    </enum>
+
+    <event name="KeyPress" number="2" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="KeyEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="KeyRelease" number="3" ref="KeyPress" />
+
+    <enum name="PointerEventFlags">
+        <item name="PointerEmulated"> <bit>16</bit> </item>
+    </enum>
+
+    <event name="ButtonPress" number="4" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="PointerEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="ButtonRelease" number="5" ref="ButtonPress" />
+    <eventcopy name="Motion"        number="6" ref="ButtonPress" />
+
+    <enum name="NotifyMode">
+        <item name="Normal">        <value>0</value> </item>
+        <item name="Grab">          <value>1</value> </item>
+        <item name="Ungrab">        <value>2</value> </item>
+        <item name="WhileGrabbed">  <value>3</value> </item>
+        <item name="PassiveGrab">   <value>4</value> </item>
+        <item name="PassiveUngrab"> <value>5</value> </item>
+    </enum>
+
+    <enum name="NotifyDetail">
+        <item name="Ancestor">         <value>0</value> </item>
+        <item name="Virtual">          <value>1</value> </item>
+        <item name="Inferior">         <value>2</value> </item>
+        <item name="Nonlinear">        <value>3</value> </item>
+        <item name="NonlinearVirtual"> <value>4</value> </item>
+        <item name="Pointer">          <value>5</value> </item>
+        <item name="PointerRoot">      <value>6</value> </item>
+        <item name="None">             <value>7</value> </item>
+    </enum>
+
+    <event name="Enter" number="7" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <field type="CARD8"     name="mode" enum="xinput:NotifyMode" />
+        <field type="CARD8"     name="detail" enum="xinput:NotifyDetail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"       name="root_x" />
+        <field type="FP1616"       name="root_y" />
+        <field type="FP1616"       name="event_x" />
+        <field type="FP1616"       name="event_y" />
+        <field type="BOOL"         name="same_screen" />
+        <field type="BOOL"         name="focus" />
+        <field type="CARD16"       name="buttons_len" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="buttons">
+            <fieldref>buttons_len</fieldref>
+        </list>
+    </event>
+
+    <eventcopy name="Leave"    number="8" ref="Enter" />
+    <eventcopy name="FocusIn"  number="9" ref="Enter" />
+    <eventcopy name="FocusOut" number="10" ref="Enter" />
+
+    <enum name="HierarchyMask">
+        <item name="MasterAdded">    <bit>0</bit> </item>
+        <item name="MasterRemoved">  <bit>1</bit> </item>
+        <item name="SlaveAdded">     <bit>2</bit> </item>
+        <item name="SlaveRemoved">   <bit>3</bit> </item>
+        <item name="SlaveAttached">  <bit>4</bit> </item>
+        <item name="SlaveDetached">  <bit>5</bit> </item>
+        <item name="DeviceEnabled">  <bit>6</bit> </item>
+        <item name="DeviceDisabled"> <bit>7</bit> </item>
+    </enum>
+
+    <struct name="HierarchyInfo">
+        <field type="DeviceId" name="deviceid" altenum="Device" />
+        <field type="DeviceId" name="attachment" altenum="Device" />
+        <field type="CARD8"    name="type" enum="DeviceType"/>
+        <field type="BOOL"     name="enabled" />
+        <pad bytes="2" />
+        <field type="CARD32"   name="flags" mask="HierarchyMask" />
+    </struct>
+
+    <event name="Hierarchy" number="11" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="flags" mask="HierarchyMask" />
+        <field type="CARD16"    name="num_infos" />
+        <pad bytes="10" />
+        <!-- 32 byte boundary -->
+        <list type="HierarchyInfo" name="infos">
+            <fieldref>num_infos</fieldref>
+        </list>
+    </event>
+
+    <enum name="PropertyFlag">
+        <item name="Deleted">  <value>0</value> </item>
+        <item name="Created">  <value>1</value> </item>
+        <item name="Modified"> <value>2</value> </item>
+    </enum>
+
+    <event name="Property" number="12" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="ATOM"      name="property" />
+        <field type="CARD8"     name="what" enum="PropertyFlag" />
+        <pad bytes="11" />
+        <!-- 32 byte boundary -->
+    </event>
+
+    <!-- ⋅⋅⋅ Events (v2.1) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <event name="RawKeyPress" number="13" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="KeyEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="RawKeyRelease" number="14" ref="RawKeyPress" />
+
+    <event name="RawButtonPress" number="15" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="PointerEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="RawButtonRelease" number="16" ref="RawButtonPress" />
+    <eventcopy name="RawMotion"        number="17" ref="RawButtonPress" />
+
+    <!-- ⋅⋅⋅ Events (v2.2) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="TouchEventFlags">
+        <item name="TouchPendingEnd">       <bit>16</bit> </item>
+        <item name="TouchEmulatingPointer"> <bit>17</bit> </item>
+    </enum>
+
+    <event name="TouchBegin" number="18" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP1616"    name="event_x" />
+        <field type="FP1616"    name="event_y" />
+        <field type="CARD16"    name="buttons_len" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"       name="flags" mask="TouchEventFlags" />
+        <field type="ModifierInfo" name="mods" />
+        <field type="GroupInfo"    name="group" />
+        <list type="CARD32" name="button_mask">
+            <fieldref>buttons_len</fieldref>
+        </list>
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="TouchUpdate" number="19" ref="TouchBegin" />
+    <eventcopy name="TouchEnd"    number="20" ref="TouchBegin" />
+
+    <enum name="TouchOwnershipFlags">
+        <!-- XXX: Remove this enum? Currently, no flag is defined. -->
+        <item name="None"> <value>0</value> </item>
+    </enum>
+
+    <event name="TouchOwnership" number="21" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="touchid" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="WINDOW"    name="child" />
+        <!-- 32 byte boundary -->
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="CARD32"    name="flags" enum="TouchOwnershipFlags" />
+        <pad bytes="8" />
+    </event>
+
+    <event name="RawTouchBegin" number="22" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="detail" />
+        <field type="DeviceId"  name="sourceid" />
+        <field type="CARD16"    name="valuators_len" />
+        <field type="CARD32"    name="flags" mask="TouchEventFlags"/>
+        <pad bytes="4" />
+        <!-- 32 byte boundary -->
+        <list type="CARD32" name="valuator_mask">
+            <fieldref>valuators_len</fieldref>
+        </list>
+        <!-- Uninterpreted: list (axisvalues) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+        <!-- Uninterpreted: list (axisvalues_raw) of FP3232,
+                            length is <popcount> on valuator_mask list -->
+    </event>
+
+    <eventcopy name="RawTouchUpdate" number="23" ref="RawTouchBegin" />
+    <eventcopy name="RawTouchEnd"    number="24" ref="RawTouchBegin" />
+
+    <!-- ⋅⋅⋅ Events (v2.3) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
+
+    <enum name="BarrierFlags">
+       <item name="PointerReleased"> <bit>0</bit> </item>
+       <item name="DeviceIsGrabbed"> <bit>1</bit> </item>
+    </enum>
+
+    <event name="BarrierHit" number="25" xge="true">
+        <field type="DeviceId"  name="deviceid" altenum="Device" />
+        <field type="TIMESTAMP" name="time" altenum="Time" />
+        <!-- event specific fields -->
+        <field type="CARD32"    name="eventid" />
+        <field type="WINDOW"    name="root" />
+        <field type="WINDOW"    name="event" />
+        <field type="BARRIER"   name="barrier" />
+        <!-- 32 byte boundary -->
+        <field type="CARD32"    name="dtime" />
+        <field type="CARD32"    name="flags" mask="BarrierFlags" />
+        <field type="DeviceId"  name="sourceid" altenum="Device" />
+        <pad bytes="2" />
+        <field type="FP1616"    name="root_x" />
+        <field type="FP1616"    name="root_y" />
+        <field type="FP3232"    name="dx" />
+        <field type="FP3232"    name="dy" />
+    </event>
+
+    <eventcopy name="BarrierLeave" number="26" ref="BarrierHit" />
+
     <!-- ⋅⋅⋅ Errors (v1.0) ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅ -->
 
     <error name="Device"     number="0" />