summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRan Benita <ran234@gmail.com>2013-08-04 13:31:29 +0300
committerDaniel Martin <consume.noise@gmail.com>2013-08-15 00:23:14 +0200
commit37d0f55392d68d0a05dcf5d793d729e49108f1b7 (patch)
tree10603a4292122dbfffba59510c1b7e3f86fb3f3b
parent330bf32140890931fdc4e9f9ecafccd212568265 (diff)
xkb: Work around alignment problems in GetNames and GetMap replies
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>
-rw-r--r--src/xkb.xml70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/xkb.xml b/src/xkb.xml
index 0e263c4..15b3368 100644
--- a/src/xkb.xml
+++ b/src/xkb.xml
@@ -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>