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="2" minor-version="3">
<import>xfixes</import>
<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" />
<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">
<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">
<field type="CARD8" name="mode" enum="ValuatorMode" />
<pad bytes="2" />
<reply>
- <pad bytes="1" />
+ <field type="CARD8" name="xi_reply_type" />
<!-- values for status: 0: Success, 1: AlreadyGrabbed -->
<field type="CARD8" name="status" enum="GrabStatus" />
<pad bytes="23" />
<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" />
<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">
<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" />
<field type="CARD8" name="device_id" />
<pad bytes="3" />
<reply>
- <pad bytes="1" />
+ <field type="CARD8" name="xi_reply_type" />
<!-- only the following GrabStatus-values are valid here:
"Success", "AlreadyGrabbed", and "Frozen"
-->
<field type="CARD8" name="device_id" />
<pad bytes="1" />
<reply>
- <pad bytes="1" />
+ <field type="CARD8" name="xi_reply_type" />
<!-- only the following GrabStatus-values are valid here:
"Success", "AlreadyGrabbed", and "Frozen"
-->
<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>
<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" />
<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" />
<list type="FeedbackState" name="feedbacks">
<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">
<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">
</op>
</list>
<reply>
- <pad bytes="1" />
+ <field type="CARD8" name="xi_reply_type" />
<field type="CARD8" name="status" enum="MappingStatus" />
<pad bytes="23" />
</reply>
<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>
<reply>
- <pad bytes="1" />
+ <field type="CARD8" name="xi_reply_type" />
<field type="CARD8" name="status" enum="MappingStatus" />
<pad bytes="23" />
</reply>
<field type="CARD8" name="len" />
<field type="CARD8" name="num_valuators" />
<field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
- <list type="CARD32" name="valuators">
+ <list type="INT32" name="valuators">
<fieldref>num_valuators</fieldref>
</list>
</struct>
<struct name="InputState">
<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>
+ <switch name="data">
+ <fieldref>class_id</fieldref>
+ <case name="key">
+ <enumref ref="InputClass">Key</enumref>
+ <field type="CARD8" name="num_keys" />
+ <pad bytes="1" />
+ <list type="CARD8" name="keys">
+ <value>32</value>
+ </list>
+ </case>
+ <case name="button">
+ <enumref ref="InputClass">Button</enumref>
+ <field type="CARD8" name="num_buttons" />
+ <pad bytes="1" />
+ <list type="CARD8" name="buttons">
+ <value>32</value>
+ </list>
+ </case>
+ <case name="valuator">
+ <enumref ref="InputClass">Valuator</enumref>
+ <field type="CARD8" name="num_valuators" />
+ <field type="CARD8" name="mode" mask="ValuatorStateModeMask" />
+ <list type="INT32" name="valuators">
+ <fieldref>num_valuators</fieldref>
+ </list>
+ </case>
+ </switch>
</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" />
<list type="InputState" name="classes">
<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>
<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" />
<field type="DeviceState" name="control" />
<pad bytes="1" />
<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>
<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">
<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>
<pad align="4" />
- </bitcase>
- <bitcase>
+ </case>
+ <case>
<enumref ref="PropertyFormat">16Bits</enumref>
<list type="CARD16" name="data16">
<fieldref>num_items</fieldref>
</list>
<pad align="4" />
- </bitcase>
- <bitcase>
+ </case>
+ <case>
<enumref ref="PropertyFormat">32Bits</enumref>
<list type="CARD32" name="data32">
<fieldref>num_items</fieldref>
</list>
- </bitcase>
+ </case>
</switch>
</request>
<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" />