summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@redhat.com>2008-09-22 11:10:46 +0930
committerAdam Jackson <ajax@redhat.com>2008-10-08 11:15:21 -0400
commite88df87851232d6b6c8da5fff802b33f5275b050 (patch)
tree7715adbc640be339f763b4b87807e03d3393643f
parentbe3b3cb970d040f0db4bead018c338012547334f (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.c13
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;