[Xcb] XKB once again ...

Mark Seaborn mrs at mythic-beasts.com
Tue Jan 1 15:45:13 PST 2008


Thomas Hunger <hto at arcor.de> wrote:

> I have attached the XKB xml description. It has a few new elements 
> which need the new python generator:

With a few changes I have been able to get this XKB description to
work with my Python-based encoder/decoder [1] (which I haven't given a
name to yet).  It is at the point where the definition passes all the
unit tests, which check that the encodings are reversible and that
integers are properly aligned, and it can decode the XKB requests made
on start-up by Gnumeric (arbitrarily chosen as a test program).

My changes to xkb.xml are available here:
http://svn.gna.org/viewcvs/plash/scratch/x11-proxy/ext/xkb.xml
and the patch is also pasted below.

I found the <itemlist> element (which I haven't implemented) was not
necessary for GetMap/SetMap, which can be done as a series of <list>s
instead.  However, other parts that used <itemlist>, such as
SelectEvents, do not work yet.

Mark

[1] http://plash.beasts.org/wiki/X11ProxySpike


--- scratch/x11-proxy/ext/xkb.xml	2007/12/31 12:31:59	684
+++ scratch/x11-proxy/ext/xkb.xml	2008/01/01 18:35:23	690
@@ -11,7 +11,6 @@
 
   <typedef oldname="CARD8" newname="DEVICESPEC" />
 
-  <typedef oldname="CARD8" newname="KEYCODE" />
   <typedef oldname="CARD8" newname="KEYMASK"/>
   <typedef oldname="CARD16" newname="BUTMASK"/>
   <typedef oldname="CARD16" newname="KB_VMODMASK"/>
@@ -438,6 +437,7 @@
     </list>
   </struct>
 
+  <!-- Also referred to as KB_SYMINTERP in the spec -->
   <struct name="KB_SYMINTERPRET">
     <field type="CARD32" name="sym" />
     <field type="KEYMASK" name="mods" />
@@ -446,20 +446,24 @@
     <field type="CARD8" name="virtualMod" />
     <field type="BOOL" name="autoRepeat" />
     <field type="BOOL" name="lockingKey" />
+    <!-- Not sure about the padding.  The spec doesn't specify this struct! -->
+    <pad bytes="6" />
   </struct>
 
   <struct name="KB_COUNTED_STRING8">
     <field type="CARD8" name="length" />
-    <list type="char" name="string">
+    <list type="char_unpadded" name="string">
       <fieldref>length</fieldref>
     </list>
   </struct>
 
   <struct name="KB_COUNTED_STRING16">
+    <!-- We expect this to start and end word-aligned -->
     <field type="CARD16" name="length" />
-    <list type="char" name="string">
+    <list type="char_unpadded" name="string">
       <fieldref>length</fieldref>
     </list>
+    <align/>
   </struct>
 
   <struct name="KB_KTMAPENTRY">
@@ -468,6 +472,7 @@
     <field type="CARD8" name="level" />
     <field type="KEYMASK" name="mods_mods" />
     <field type="KB_VMOD" name="mods_vmods" />
+    <pad bytes="2" />
   </struct>
 
   <struct name="KB_KEYTYPE">
@@ -476,19 +481,22 @@
     <field type="KB_VMOD" name="mods_vmods" />
     <field type="CARD8" name="numLevels" />
     <field type="CARD8" name="nMapEntries" />
-    <field type="BOOL" name="hasPreserve" />
+    <field type="BOOL" name="preserve" />
     <pad bytes="1"/>
     <list name="map" type="KB_KTMAPENTRY">
       <fieldref>nMapEntries</fieldref>
     </list>
 
     <!-- xxx optional extension of XKB. -->
+    <special type="XkbPreserveEntries"/>
+<!--
     <list name="preserve" type="KB_MODDEF">
       <op op="if">
 	<fieldref>hasPreserve</fieldref>
 	<fieldref>nMapEntries</fieldref>
       </op>
     </list>
+-->
   </struct>
 
   <struct name="KB_KEYSYMMAP">
@@ -546,8 +554,8 @@
     <field type="KB_MAPDETAILS" name="affectMap" />
     <field type="KB_MAPDETAILS" name="map" />
 
-    
-    <!-- xxx encode "ref" in op-notation??? -->
+<!--
+    <!- xxx encode "ref" in op-notation??? ->
     <itemlist name="details" ref="(affect_which &amp; (~clear) &amp; (~select_all))">
       <option flag="XCB_XKB_KB_EVENTTYPE_ENUM_NEW_KEYBOARD_NOTIFY">
 	<field type="KB_NKNDETAIL" name="affectNewKeyboard" />
@@ -586,17 +594,18 @@
 	<field type="KB_MSGDETAIL" name="msgDetails" />
       </option>
 
-      <!--  xxx: these parts seem to miss a flag so that they can be set
+      <!-  xxx: these parts seem to miss a flag so that they can be set
 	   <option flag="">
 	   <field type="KB_AXNDETAIL" name="affectAccessX" />
 	   <field type="KB_AXNDETAIL" name="accessXDetails" />
-	   </option> -->
+	   </option> ->
 
       <option flag="XCB_XKB_KB_EVENTTYPE_ENUM_EXTENSION_DEVICE_NOTIFY">
 	<field type="KB_XIDETAIL" name="affectExtDev" />
 	<field type="KB_XIDETAIL" name="extdevDetails" />
       </option>
     </itemlist>
+-->
   </request>
 
   <request name="Bell" opcode="3" >
@@ -774,56 +783,33 @@
       <field type="CARD8" name="totalVModMapKeys" />
       <pad bytes="1"/>
       <field type="KB_VMOD" name="virtualMods" />
-
-      <itemlist name="map" ref="present">
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_TYPES">
-	  <list type="KB_KEYTYPE" name="typesRtrn">
-	    <fieldref>nTypes</fieldref>
-	  </list>
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_SYMS">
-	  <list type="KB_KEYSYMMAP" name="symsRtrn">
-	    <fieldref>nKeySyms</fieldref>
-	  </list>
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_ACTIONS">
-	  <list type="CARD8" name="actsRtrn_count">
-	    <fieldref>nKeyActions</fieldref>
-	  </list>
-	  <!-- xxx pad ?-->
-	  <list type="KB_ACTION" name="actsRtrn_acts">
-	    <fieldref>totalActions</fieldref>
-	  </list>
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_BEHAVIORS">
-	  <list type="KB_SETBEHAVIOR" name="behaviorsRtrn">
-	    <fieldref>totalKeyBehaviors</fieldref>
-	  </list>
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_VIRTUAL_MODS">
-	  <list type="KEYMASK" name="vmodsRtrn">
-	    <popcount>virtualMods</popcount>
-	  </list>
-	  <!-- xxx pad ?-->
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_EXPLICIT_COMPONENTS">
-	  <list type="KB_SETEXPLICIT" name="explicitRtrn">
-	    <fieldref>totalKeyExplicit</fieldref>
-	  </list>
-	  <!-- xxx pad ?-->
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_MODIFIER_MAP">
-	  <list type="KB_KEYMODMAP" name="modmapRtrn">
-	    <fieldref>totalModMapKeys</fieldref>
-	  </list>
-	  <!-- xxx pad ?-->
-	</option>
-	<option flag="XCB_XKB_KB_MAPPART_ENUM_VIRTUAL_MOD_MAP">
-	  <list type="KB_KEYVMODMAP" name="vmodMapRtrn">
-	    <fieldref>totalVModMapKeys</fieldref><!-- xxx length of lists need operators -->
-	  </list>
-	</option>
-      </itemlist>
+      <list type="KB_KEYTYPE" name="types">
+        <fieldref>nTypes</fieldref>
+      </list>
+      <list type="KB_KEYSYMMAP" name="syms">
+        <fieldref>nKeySyms</fieldref>
+      </list>
+      <list type="CARD8" name="actions.count">
+        <fieldref>nKeyActions</fieldref>
+      </list>
+      <list type="KB_ACTION" name="actions.actions">
+        <fieldref>totalActions</fieldref>
+      </list>
+      <list type="KB_SETBEHAVIOR" name="behaviors">
+        <fieldref>totalKeyBehaviors</fieldref>
+      </list>
+      <list type="KEYMASK" name="vmods">
+        <fieldref>nVModMapKeys</fieldref>
+      </list>
+      <list type="KB_SETEXPLICIT" name="explicit">
+        <fieldref>totalKeyExplicit</fieldref>
+      </list>
+      <list type="KB_KEYMODMAP" name="modmap">
+        <fieldref>totalModMapKeys</fieldref>
+      </list>
+      <list type="KB_KEYVMODMAP" name="vmodmap">
+        <fieldref>totalVModMapKeys</fieldref>
+      </list>
     </reply>
   </request>
 
@@ -841,23 +827,20 @@
     <field type="CARD8" name="nMapEntries" />
     <field type="BOOL" name="preserve" />
     <pad bytes="1"/>
-    <list type="KB_KTMAPENTRY" name="entries">
-      <op op="*">
-	<value>4</value>
-	<fieldref>nMapEntries</fieldref>
-      </op>
+    <list type="KB_KTSETMAPENTRY" name="entries">
+      <fieldref>nMapEntries</fieldref>
     </list>
     <!-- xxx the following is the "optional" XKB extension.
 	 Try to map it into a list -->
+    <special type="XkbPreserveEntries"/>
+<!--
       <list type="KB_MODDEF" name="preserveEntries">
 	<op op="if">
 	  <fieldref>preserve</fieldref>
-	  <op op="*">
-	    <value>4</value>
-	    <fieldref>nMapEntries</fieldref>
-	  </op>
+	  <fieldref>nMapEntries</fieldref>
 	</op>
       </list>
+-->
   </struct>
 
   <struct name="KB_KTSETMAPENTRY">
@@ -893,47 +876,37 @@
     <field type="CARD8" name="nVModMapKeys" />
     <field type="CARD8" name="totalVModMapKeys" />
     <field type="KB_VMOD" name="virtualMods" />
-    <itemlist name="values" ref="present">
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_TYPES">
-	<list type="KB_SETKEYTYPE" name="types">
-	</list>
-      </option>
-
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_SYMS">
-	<list type="KB_KEYSYMMAP" name="syms">
-	</list>
-      </option>
-
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_ACTIONS">
-	<list type="CARD8" name="actions.count">
-	</list>
-	<list type="KB_ACTION" name="actions.actions">
-	</list>
-      </option>
-
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_KEY_BEHAVIORS">
-	<list type="KB_SETBEHAVIOR" name="behaviors">
-	</list>
-      </option>
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_VIRTUAL_MODS">
-	<list type="KEYMASK" name="vmods">
-	</list>
-      </option>
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_EXPLICIT_COMPONENTS">
-	<list type="KB_SETEXPLICIT" name="explicit">
-	</list>
-      </option>
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_MODIFIER_MAP">
-	<list type="KB_KEYMODMAP" name="modmap">
-	</list>
-      </option>
-      <option flag="XCB_XKB_KB_MAPPART_ENUM_VIRTUAL_MOD_MAP">
-	<list type="KB_KEYVMODMAP" name="vmodmap">
-	  <!-- xxx operators everywhere -->
-	</list>
-      </option>
-    </itemlist>
+    <!-- The high-level part of the spec says LISTofKB_KEYTYPE here, which
+         disagrees with the low-level part which refers to KB_SETKEYTYPE -->
+    <list type="KB_SETKEYTYPE" name="types">
+      <fieldref>nTypes</fieldref>
+    </list>
+    <list type="KB_KEYSYMMAP" name="syms">
+      <fieldref>nKeySyms</fieldref>
+    </list>
+    <list type="CARD8" name="actions.count">
+      <fieldref>nKeyActions</fieldref>
+    </list>
+    <list type="KB_ACTION" name="actions.actions">
+      <fieldref>totalActions</fieldref>
+    </list>
+    <list type="KB_SETBEHAVIOR" name="behaviors">
+      <fieldref>totalKeyBehaviors</fieldref>
+    </list>
+    <list type="KEYMASK" name="vmods">
+      <fieldref>nVModMapKeys</fieldref>
+    </list>
+    <list type="KB_SETEXPLICIT" name="explicit">
+      <fieldref>totalKeyExplicit</fieldref>
+    </list>
+    <list type="KB_KEYMODMAP" name="modmap">
+      <fieldref>totalModMapKeys</fieldref>
+    </list>
+    <list type="KB_KEYVMODMAP" name="vmodmap">
+      <fieldref>totalVModMapKeys</fieldref>
+    </list>
   </request>
+
   <request name="GetCompatMap" opcode="10" >
     <field type="KB_DEVICESPEC" name="deviceSpec" />
     <field type="KB_GROUP" name="groups" />
@@ -950,16 +923,10 @@
       <field type="CARD16" name="nTotalSI" />
       <pad bytes="16"/>
       <list type="KB_SYMINTERPRET" name="siRtrn">
-	<op op="*">
-	  <value>16</value>
-	  <fieldref>nSIRtrn</fieldref>
-	</op>
+	<fieldref>nSIRtrn</fieldref>
       </list>
-      <list type="KB_SYMINTERPRET" name="groupRtrn">
-	<op op="*">
-	  <value>4</value>
-	  <popcount>groupsRtrn</popcount>
-	</op>
+      <list type="KB_MODDEF" name="groupRtrn">
+	<popcount>groupsRtrn</popcount>
       </list>
     </reply>
   </request>
@@ -974,16 +941,10 @@
     <field type="CARD16" name="nSI" />
     <pad bytes="2"/>
     <list type="KB_SYMINTERPRET" name="si">
-      <op op="*">
-	<value>16</value>
-	<fieldref>nSI</fieldref>
-      </op>
+      <fieldref>nSI</fieldref>
     </list>
-    <list type="KB_SYMINTERPRET" name="groupMaps">
-      <op op="*">
-	<value>4</value>
-	<popcount>groups</popcount>
-      </op>
+    <list type="KB_MODDEF" name="groupMaps">
+      <popcount>groups</popcount>
     </list>
   </request>
 
@@ -1010,12 +971,7 @@
       <field type="CARD8" name="nIndicators" />
       <pad bytes="15"/>
       <list type="KB_INDICATORMAP" name="maps">
-	<!-- the size needs to be calculated explicityly because 
-	     popcount does not add a sizeof(KB_INDICATORMAP) -->
-	<op op="*"> 
-	  <value>12</value> 
-	  <popcount>nIndicators</popcount>
-	</op>
+	<popcount>nIndicators</popcount>
       </list>
     </reply>
   </request>
@@ -1025,10 +981,7 @@
     <pad bytes="2"/>
     <field type="KB_INDICATOR" name="which" />
     <list type="KB_INDICATORMAP" name="maps">
-      <op op="*">
-	<value>12</value>
-	<popcount>which</popcount>
-      </op>
+      <popcount>which</popcount>
     </list>
   </request>
 
@@ -1045,7 +998,7 @@
       <field type="BOOL" name="found" />
       <field type="BOOL" name="on" />
       <field type="BOOL" name="realIndicator" />
-      <field type="KB_INDICATOR" name="ndx" />
+      <field type="CARD8" name="ndx" /> <!-- should be KB_INDICATOR -->
       <field type="KB_IMFLAGS" name="map_flags" />
       <field type="KB_IMGROUPSWHICH" name="map_whichGroups" />
       <field type="KB_GROUPS" name="map_groups" />
@@ -1098,8 +1051,10 @@
       <field type="CARD8" name="nRadioGroups" />
       <field type="CARD8" name="nKeyAliases" />
       <field type="CARD16" name="nKTLevels" />
-      <pad bytes="1" />
+      <pad bytes="4" />
 
+      <list type="CARD32" name="not_supported_yet" />
+<!--
       <itemlist name="valueList" ref="which">
 	<option flag="XCB_XKB_KB_NAMEDETAIL_ENUM_KEYCODES_NAME">
 	  <field type="ATOM" name="keycodesName" />
@@ -1130,7 +1085,7 @@
 	  <list type="CARD8" name="nLevelsPerType">
 	    <fieldref>nKTLevels</fieldref>
 	  </list>
-	  <!-- p  unused, p=pad(l) xxx -->
+	  <!- p  unused, p=pad(l) xxx ->
 	  <list type="ATOM" name="ktLevelNames">
 	    <fieldref>nKTLevels</fieldref>
 	  </list>
@@ -1181,18 +1136,27 @@
 	  </list>
 	</option>
       </itemlist>
+-->
     </reply>
   </request>
 
   <struct name="KB_PROPERTY">
+    <!-- This is a guess: -->
+    <field type="KB_COUNTED_STRING16" name="name" />
+    <field type="KB_COUNTED_STRING16" name="value" />
+<!--
+    The spec specifies something like the following, but that can't be right
+    because then the CARD16s wouldn't be aligned.  It also inconsistently
+    states that KB_PROPERTYs are all 8 bytes.
     <field type="CARD16" name="nameLength" />
-    <list type="char" name="name">
+    <list type="char_unpadded" name="name">
       <fieldref>nameLength</fieldref>
     </list>
     <field type="CARD16" name="valueLength" />
-    <list type="char" name="value">
+    <list type="char_unpadded" name="value">
       <fieldref>valueLength</fieldref>
     </list>
+-->
   </struct>
 
   <struct name="KB_SHAPE">
@@ -1281,10 +1245,7 @@
     <field type="BOOL" name="vertical" />
     <pad bytes="2"/>
     <list type="KB_KEY" name="keys">
-      <op op="*">
-	<value>8</value>
-	<fieldref>nKeys</fieldref>
-      </op>
+      <fieldref>nKeys</fieldref>
     </list>
   </struct>
 
@@ -1298,10 +1259,7 @@
     <field type="CARD8" name="nKeys" />
     <pad bytes="2"/>
     <list type="KB_OVERLAYKEY" name="keys">
-      <op op="*">
-	<value>8</value>
-	<fieldref>nKeys</fieldref>
-      </op>
+      <fieldref>nKeys</fieldref>
     </list>
   </struct>
 
@@ -1379,12 +1337,18 @@
        answer: it is set as an union in XKBproto.h, so probably yes
   -->
 
+  <!-- TODO: implement unions -->
+  <struct name="KB_DOODAD">
+    <field type="KB_SHAPEDOODAD" name="shape"/>
+  </struct>
+<!--
   <union name="KB_DOODAD">
     <field type="KB_SHAPEDOODAD" name="shape"/>
     <field type="KB_LOGODOODAD" name="logo"/>
     <field type="KB_TEXTDOODAD" name="text"/>
     <field type="KB_INDICATORDOODAD" name="indicator"/>
   </union>
+-->
 
   <request name="GetGeometry" opcode="19" >
     <field type="KB_DEVICESPEC" name="deviceSpec" />
@@ -1392,7 +1356,6 @@
     <field type="ATOM" name="name" />
     <reply>
       <field type="CARD8" name="deviceID" />
-      <field type="CARD16" name="sequence_number" />
       <field type="ATOM" name="name" />
       <field type="BOOL" name="found" />
       <pad bytes="1"/>
@@ -1408,18 +1371,23 @@
       <field type="CARD8" name="labelColorNdx" />
       <field type="KB_COUNTED_STRING16" name="labelFont" />
       <list type="KB_PROPERTY" name="properties">
+        <fieldref>nProperties</fieldref>
       </list>
       <list type="KB_COUNTED_STRING16" name="colors">
+        <fieldref>nColors</fieldref>
       </list>
       <list type="KB_SHAPE" name="shapes">
+        <fieldref>nShapes</fieldref>
       </list>
       <list type="KB_SECTION" name="sections">
+        <fieldref>nSections</fieldref>
       </list>
       <list type="KB_DOODAD" name="doodads">
+        <fieldref>nDoodads</fieldref>
       </list>
       <list type="KB_KEYALIAS" name="keyAliases">
+        <fieldref>nKeyAliases</fieldref>
       </list>
-      <!-- xxx length expressions everywhere -->
     </reply>
   </request>
 
@@ -1439,17 +1407,22 @@
     <pad bytes="2"/>
     <field type="KB_COUNTED_STRING16" name="labelFont" />
     <list type="KB_PROPERTY" name="properties">
+      <fieldref>nProperties</fieldref>
     </list>
     <list type="KB_COUNTED_STRING16" name="colors">
+      <fieldref>nColors</fieldref>
     </list>
     <list type="KB_SHAPE" name="shapes">
+      <fieldref>nShapes</fieldref>
     </list>
     <list type="KB_SECTION" name="sections">
+      <fieldref>nSections</fieldref>
     </list>
     <list type="KB_DOODAD" name="doodads">
+      <fieldref>nDoodads</fieldref>
     </list>
     <list type="KB_KEYALIAS" name="keyAliases">
-      <!-- xxx length expressions -->
+      <fieldref>nKeyAliases</fieldref>
     </list>
   </request>
 
@@ -1530,28 +1503,29 @@
     <field type="KB_GBNDETAILMASK" name="want" />
     <field type="BOOL" name="load" />
     <pad bytes="1"/>
+    <!-- TODO: use KB_COUNTED_STRING8 here -->
     <field type="CARD8" name="keymapsSpecLen" />
-    <list type="char" name="keymapsSpec">
+    <list type="char_unpadded" name="keymapsSpec">
       <fieldref>keymapsSpecLen</fieldref>
     </list>
     <field type="CARD8" name="keycodesSpecLen" />
-    <list type="char" name="keycodesSpec">
+    <list type="char_unpadded" name="keycodesSpec">
       <fieldref>keycodesSpecLen</fieldref>
     </list>
     <field type="CARD8" name="typesSpecLen" />
-    <list type="char" name="typesSpec">
+    <list type="char_unpadded" name="typesSpec">
       <fieldref>typesSpecLen</fieldref>
     </list>
     <field type="CARD8" name="compatMapSpecLen" />
-    <list type="char" name="compatMapSpec">
+    <list type="char_unpadded" name="compatMapSpec">
       <fieldref>compatMapSpecLen</fieldref>
     </list>
     <field type="CARD8" name="symbolsSpecLen" />
-    <list type="char" name="symbolsSpec">
+    <list type="char_unpadded" name="symbolsSpec">
       <fieldref>symbolsSpecLen</fieldref>
     </list>
     <field type="CARD8" name="geometrySpecLen" />
-    <list type="char" name="geometrySpec">
+    <list type="char_unpadded" name="geometrySpec">
       <fieldref>geometrySpecLen</fieldref>
     </list>
     <!-- xxx special pad -->
@@ -1565,6 +1539,7 @@
       <field type="KB_GBNDETAILMASK" name="found" />
       <field type="KB_GBNDETAILMASK" name="reported" />
       <pad bytes="16"/>
+<!--
       <itemlist name="replies" ref="reported">
 	<option flag="XCB_XKB_KB_GBNDETAIL_GBN_TYPES | XCB_XKB_KB_GBNDETAIL_GBN_CLIENT_SYMBOLS | 
 XCB_XKB_KB_GBNDETAIL_GBN_SERVER_SYMBOLS">
@@ -1583,6 +1558,7 @@
 	  <replyref ref="GetGeometry" />
 	</option>
       </itemlist>
+-->
     </reply>
   </request>
 
@@ -1597,10 +1573,7 @@
       <popcount>namesPresent</popcount>
     </list>
     <list type="KB_INDICATORMAP" name="maps">
-      <op op="*">
-	<value>12</value>
-	<popcount>mapsPresent</popcount>
-      </op>
+      <popcount>mapsPresent</popcount>
     </list>
   </struct>
 
@@ -1615,24 +1588,29 @@
     <field type="KB_IDSPEC" name="ledID" />
 
     <reply>
+      <field type="CARD8" name="deviceID" />
       <field type="KB_DEVFEATURE" name="present" />
       <field type="KB_FEATURE" name="supported" />
       <field type="KB_FEATURE" name="unsupported" />
-      <field type="CARD8" name="nDeviceLedFBs" />l
+      <field type="CARD16" name="nDeviceLedFBs" />
       <field type="CARD8" name="firstBtnWanted" />
       <field type="CARD8" name="nBtnsWanted" />
       <field type="CARD8" name="firstBtnRtrn" />
-      <field type="CARD8" name="nBtnsRtrn" />b
+      <field type="CARD8" name="nBtnsRtrn" />
       <field type="CARD8" name="totalBtns" />
       <field type="BOOL" name="hasOwnState" />
       <field type="KB_IDRESULT" name="dfltKbdFB" />
       <field type="KB_IDRESULT" name="dfltLedFB" />
       <pad bytes="2"/>
       <field type="ATOM" name="devType" />
-      <field type="CARD16" name="nameLen" />n
-      <list type="char" name="name">
+      <field type="CARD16" name="nameLen" />
+      <!-- This string starts at offset 2 mod 4, so requires unusual
+           padding -->
+      <!-- TODO: use KB_COUNTED_STRING16 -->
+      <list type="char_unpadded" name="name">
 	<fieldref>nameLen</fieldref>
       </list>
+      <align/>
       <!-- xxx unused,p=pad(2+n) -->
       <list type="KB_ACTION" name="btnActions">
 	<fieldref>nBtnsRtrn</fieldref>
@@ -1650,10 +1628,7 @@
     <field type="KB_DEVFEATURE" name="change" />
     <field type="CARD16" name="nDeviceLedFBs" />
     <list type="KB_ACTION" name="btnActions">
-      <op op="*">
-	<fieldref>nBtns</fieldref>
-	<value>8</value>
-      </op>
+      <fieldref>nBtns</fieldref>
     </list>
     <list type="KB_DEVICELEDINFO" name="leds">
       <fieldref>nDeviceLedFBs</fieldref>


More information about the Xcb mailing list