diff options
author | Ran Benita <ran234@gmail.com> | 2013-08-04 13:31:29 +0300 |
---|---|---|
committer | Daniel Martin <consume.noise@gmail.com> | 2013-08-15 00:23:14 +0200 |
commit | 37d0f55392d68d0a05dcf5d793d729e49108f1b7 (patch) | |
tree | 10603a4292122dbfffba59510c1b7e3f86fb3f3b | |
parent | 330bf32140890931fdc4e9f9ecafccd212568265 (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.xml | 70 |
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="&"> + <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="&"> + <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> @@ -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="&"> + <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> |