[Xcb] [PATCH v2 resend 1/4] xkb: Work around alignment problems in GetNames and GetMap replies

Daniel Martin consume.noise at gmail.com
Sun Aug 11 01:17:16 PDT 2013


On Tue, Aug 06, 2013 at 02:12:00PM +0300, Ran Benita wrote:
> 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(+)
> 
> 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>
> -- 
> 1.8.3.4

Could you make the alignment pad lists of type 'void' please? Other
alignment pads use void too.

Additionally, I could think of: That we may patch the generator to omit
those list (based upon the condition: type is void and name starts with
alignment_pad) when generating the surrounding structure. That'd be a
hack until we've <pad align=.../>.


More information about the Xcb mailing list