The reply to XInput's XIGetProperty is incorrectly represented
Edit: Original downstream bug report: https://github.com/psychon/x11rb/pull/505
When sending a XInput
XIGetProperty
request for a property that does not exist, the code ends up here: https://gitlab.freedesktop.org/xorg/xserver/-/blob/7ae221ad5774756766dc78a73d71f4163ac7b1c6/Xi/xiproperty.c#L266-273
This means that the reply will contain "all zeros". However, "all zeros" is not correct for the format
field of the reply (PropertyFormat
only has values 8, 16, 32):
<field type="CARD8" name="format" enum="PropertyFormat" />
Also, the following <switch>
now has no matching case. I am not quite sure what the semantics of that should (and doc/xml-xcb.txt
does not really say much either). So far I was assuming that there will always be exactly one match in a <switch>
containing only <case>
s.
I am not quite sure what a good fix would be. An ugly one would be (does this cause API changes to libxcb?):
diff --git a/src/xinput.xml b/src/xinput.xml
index 5f88a98..d91b29a 100644
--- a/src/xinput.xml
+++ b/src/xinput.xml
@@ -1301,6 +1301,13 @@ authorization from the authors.
<!-- GetDeviceProperty -->
+ <enum name="PossiblePropertyFormat">
+ <item name="Missing"> <value>0</value> </item>
+ <item name="8Bits"> <value>8</value> </item>
+ <item name="16Bits"> <value>16</value> </item>
+ <item name="32Bits"> <value>32</value> </item>
+ </enum>
+
<request name="GetDeviceProperty" opcode="39">
<field type="ATOM" name="property" />
<field type="ATOM" name="type" />
@@ -1314,27 +1321,30 @@ authorization from the authors.
<field type="ATOM" name="type" />
<field type="CARD32" name="bytes_after" />
<field type="CARD32" name="num_items" />
- <field type="CARD8" name="format" enum="PropertyFormat" />
+ <field type="CARD8" name="format" enum="PossiblePropertyFormat" />
<field type="CARD8" name="device_id" />
<pad bytes="10" />
<switch name="items">
<fieldref>format</fieldref>
<case>
- <enumref ref="PropertyFormat">8Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">Missing</enumref>
+ </case>
+ <case>
+ <enumref ref="PossiblePropertyFormat">8Bits</enumref>
<list type="CARD8" name="data8">
<fieldref>num_items</fieldref>
</list>
<pad align="4" />
</case>
<case>
- <enumref ref="PropertyFormat">16Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">16Bits</enumref>
<list type="CARD16" name="data16">
<fieldref>num_items</fieldref>
</list>
<pad align="4" />
</case>
<case>
- <enumref ref="PropertyFormat">32Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">32Bits</enumref>
<list type="CARD32" name="data32">
<fieldref>num_items</fieldref>
</list>
@@ -1999,26 +2009,29 @@ authorization from the authors.
<field type="ATOM" name="type" />
<field type="CARD32" name="bytes_after" />
<field type="CARD32" name="num_items" />
- <field type="CARD8" name="format" enum="PropertyFormat" />
+ <field type="CARD8" name="format" enum="PossiblePropertyFormat" />
<pad bytes="11" />
<switch name="items">
<fieldref>format</fieldref>
<case>
- <enumref ref="PropertyFormat">8Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">Missing</enumref>
+ </case>
+ <case>
+ <enumref ref="PossiblePropertyFormat">8Bits</enumref>
<list type="CARD8" name="data8">
<fieldref>num_items</fieldref>
</list>
<pad align="4" />
</case>
<case>
- <enumref ref="PropertyFormat">16Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">16Bits</enumref>
<list type="CARD16" name="data16">
<fieldref>num_items</fieldref>
</list>
<pad align="4" />
</case>
<case>
- <enumref ref="PropertyFormat">32Bits</enumref>
+ <enumref ref="PossiblePropertyFormat">32Bits</enumref>
<list type="CARD32" name="data32">
<fieldref>num_items</fieldref>
</list>