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)
commit37d0f55392d68d0a05dcf5d793d729e49108f1b7
tree10603a4292122dbfffba59510c1b7e3f86fb3f3b
parent330bf32140890931fdc4e9f9ecafccd212568265
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>
src/xkb.xml