[Xcb] [PATCH proto v2] xkb: Work around alignment problems in GetNames and GetMap replies

Ran Benita ran234 at gmail.com
Mon Jul 29 12:51:36 PDT 2013


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 at gmail.com>
---
 src/xkb.xml | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

I see now that the previous patch was incomplete. I missed it because I
got "lucky" numbers. Now this is becoming a bit unwieldy, but I don't
mind too much, because it *is* actually an explicit rendition of the spec,
as Peter Harris mentioned.

The spec also mentions padding in a few other requests, but I don't have
the code to test them right now.

diff --git a/src/xkb.xml b/src/xkb.xml
index 659cfad..8945445 100644
--- a/src/xkb.xml
+++ b/src/xkb.xml
@@ -1347,6 +1347,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="&">
+						    <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>
@@ -1362,18 +1376,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="&">
+						    <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="&">
+						    <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="&">
+						    <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>
@@ -1654,6 +1710,20 @@ authorization from the authors.
 					       <fieldref>nKTLevels</fieldref> -->
 					        <fieldref>nTypes</fieldref>
 					</list>
+					<list type="CARD8" name="alignment_pad">
+					    <op op="-">
+						<op op="&">
+						    <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>
-- 
1.8.3.4



More information about the Xcb mailing list