diff options
author | Peter Hutterer <peter.hutterer@redhat.com> | 2008-09-22 11:10:46 +0930 |
---|---|---|
committer | Adam Jackson <ajax@redhat.com> | 2008-10-08 11:15:21 -0400 |
commit | e88df87851232d6b6c8da5fff802b33f5275b050 (patch) | |
tree | 7715adbc640be339f763b4b87807e03d3393643f | |
parent | be3b3cb970d040f0db4bead018c338012547334f (diff) |
xkb: squash canonical types into explicit ones on core reconstruction.
If we update key types from core, and groups 2 - n have a canonical type but
the same symbols as the explicit type of group 1, assume that it was a core
sym duplication according to Section 12.4 of the XKB Protocol Spec.
Ignore the canonical types and pretend there's only one group for the key -
with the explicit key type.
The protocol spec does not cover this case, so we have to guess here.
(cherry picked from commit 30c3c13f1030268aaa6a3598d538fafd0592d77a)
-rw-r--r-- | xkb/XKBMisc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c index 85415a4c9..ac81395d6 100644 --- a/xkb/XKBMisc.c +++ b/xkb/XKBMisc.c @@ -178,16 +178,23 @@ int nGroups,tmp,groupsWidth; } } - /* step 7: check for all groups identical or all width 1 */ + /* step 7: check for all groups identical or all width 1 + * + * Special feature: if group 1 has an explicit type and all other groups + * have canonical types with same symbols, we assume it's info lost from + * the core replication. + */ if (nGroups>1) { - Bool sameType,allOneLevel; + Bool sameType,allOneLevel, canonical = True; allOneLevel= (xkb->map->types[types_inout[0]].num_levels==1); for (i=1,sameType=True;(allOneLevel||sameType)&&(i<nGroups);i++) { sameType=(sameType&&(types_inout[i]==types_inout[XkbGroup1Index])); if (allOneLevel) allOneLevel= (xkb->map->types[types_inout[i]].num_levels==1); + if (types_inout[i] > XkbLastRequiredType) + canonical = False; } - if ((sameType)&& + if (((sameType) || canonical)&& (!(protected&(XkbExplicitKeyTypesMask&~XkbExplicitKeyType1Mask)))){ register int s; Bool identical; |