xkb: Work around alignment problems in GetNames and GetMap replies
authorRan Benita <ran234@gmail.com>
Sun, 4 Aug 2013 10:31:29 +0000 (13:31 +0300)
committerDaniel Martin <consume.noise@gmail.com>
Wed, 14 Aug 2013 22:23:14 +0000 (00:23 +0200)
The basic situation is this: a list of CARD8/CARD16s followed by a list
of CARD16/CARD32s. In the current code, the second list is aligned to
1/2 bytes according the size of the first list. However, in some cases
the second list needs to be aligned to 4 bytes per the xkbproto spec:
http://www.x.org/releases/current/doc/kbproto/xkbproto.html#appD::Requests

XkbGetMap reply (xkb-opcode 8):
[...]
a     LISTofCARD8          actsRtrn.count
p               unused,p=pad(a)
8A     LISTofKB_ACTION          actsRtrn.acts
4B     LISTofKB_SETBEHAVIOR          behaviorsRtrn
v     LISTofSETofKEYMASK          vmodsRtrn
p               unused, p=pad(v)
2E     LISTofKB_SETEXPLICIT          explicitRtrn
p               unused,p=pad(2E)
2M     LISTofKB_KEYMODMAP          modmapRtrn
p               unused, p=pad(2M)
[...]

XkbGetNames reply (xkb-opcode 17):
[...]
l     LISTofCARD8          nLevelsPerType, sum of all elements=L
p               unused, p=pad(l)
[...]

The server and Xlib handle this with calls to XkbPaddedSize(), which is
a good way to see where the extra padding is needed.

Signed-off-by: Ran Benita <ran234@gmail.com>
Reviewed-by: Daniel Martin <consume.noise@gmail.com>
src/xkb.xml

index 0e263c4..15b3368 100644 (file)
@@ -1350,6 +1350,20 @@ authorization from the authors.
                                        <list name="acts_rtrn_count" type="CARD8">
                                                <fieldref>nKeyActions</fieldref>
                                        </list>
+                                       <list type="CARD8" name="alignment_pad">
+                                           <op op="-">
+                                               <op op="&amp;">
+                                                   <op op="+">
+                                                       <fieldref>nKeyActions</fieldref>
+                                                       <value>3</value>
+                                                   </op>
+                                                   <unop op="~">
+                                                       <value>3</value>
+                                                   </unop>
+                                               </op>
+                                               <fieldref>nKeyActions</fieldref>
+                                           </op>
+                                       </list>
                                        <list name="acts_rtrn_acts" type="Action">
                                                <fieldref>totalActions</fieldref>
                                        </list>
@@ -1365,18 +1379,60 @@ authorization from the authors.
                                        <list name="vmods_rtrn" type="CARD8" mask="ModMask">
                                                <popcount><fieldref>virtualMods</fieldref></popcount>
                                        </list>
+                                       <list type="CARD8" name="alignment_pad2">
+                                           <op op="-">
+                                               <op op="&amp;">
+                                                   <op op="+">
+                                                       <popcount><fieldref>virtualMods</fieldref></popcount>
+                                                       <value>3</value>
+                                                   </op>
+                                                   <unop op="~">
+                                                       <value>3</value>
+                                                   </unop>
+                                               </op>
+                                               <popcount><fieldref>virtualMods</fieldref></popcount>
+                                           </op>
+                                       </list>
                                </bitcase>
                                <bitcase>
                                        <enumref ref="MapPart">ExplicitComponents</enumref>
                                        <list name="explicit_rtrn" type="SetExplicit">
                                                <fieldref>totalKeyExplicit</fieldref>
                                        </list>
+                                       <list type="CARD16" name="alignment_pad3">
+                                           <op op="-">
+                                               <op op="&amp;">
+                                                   <op op="+">
+                                                       <fieldref>totalKeyExplicit</fieldref>
+                                                       <value>1</value>
+                                                   </op>
+                                                   <unop op="~">
+                                                       <value>1</value>
+                                                   </unop>
+                                               </op>
+                                               <fieldref>totalKeyExplicit</fieldref>
+                                           </op>
+                                       </list>
                                </bitcase>
                                <bitcase>
                                        <enumref ref="MapPart">ModifierMap</enumref>
                                        <list name="modmap_rtrn" type="KeyModMap">
                                                <fieldref>totalModMapKeys</fieldref>
                                        </list>
+                                       <list type="CARD16" name="alignment_pad4">
+                                           <op op="-">
+                                               <op op="&amp;">
+                                                   <op op="+">
+                                                       <fieldref>totalModMapKeys</fieldref>
+                                                       <value>1</value>
+                                                   </op>
+                                                   <unop op="~">
+                                                       <value>1</value>
+                                                   </unop>
+                                               </op>
+                                               <fieldref>totalModMapKeys</fieldref>
+                                           </op>
+                                       </list>
                                </bitcase>
                                <bitcase>
                                        <enumref ref="MapPart">VirtualModMap</enumref>
@@ -1657,6 +1713,20 @@ authorization from the authors.
                                               <fieldref>nKTLevels</fieldref> -->
                                                <fieldref>nTypes</fieldref>
                                        </list>
+                                       <list type="CARD8" name="alignment_pad">
+                                           <op op="-">
+                                               <op op="&amp;">
+                                                   <op op="+">
+                                                       <fieldref>nTypes</fieldref>
+                                                       <value>3</value>
+                                                   </op>
+                                                   <unop op="~">
+                                                       <value>3</value>
+                                                   </unop>
+                                               </op>
+                                               <fieldref>nTypes</fieldref>
+                                           </op>
+                                       </list>
                                        <list name="ktLevelNames" type="ATOM">
                                                <sumof ref="nLevelsPerType" />
                                        </list>