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.
This commit is contained in:
parent
ae986d1c73
commit
30c3c13f10
|
@ -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) {
|
if (nGroups>1) {
|
||||||
Bool sameType,allOneLevel;
|
Bool sameType,allOneLevel, canonical = True;
|
||||||
allOneLevel= (xkb->map->types[types_inout[0]].num_levels==1);
|
allOneLevel= (xkb->map->types[types_inout[0]].num_levels==1);
|
||||||
for (i=1,sameType=True;(allOneLevel||sameType)&&(i<nGroups);i++) {
|
for (i=1,sameType=True;(allOneLevel||sameType)&&(i<nGroups);i++) {
|
||||||
sameType=(sameType&&(types_inout[i]==types_inout[XkbGroup1Index]));
|
sameType=(sameType&&(types_inout[i]==types_inout[XkbGroup1Index]));
|
||||||
if (allOneLevel)
|
if (allOneLevel)
|
||||||
allOneLevel= (xkb->map->types[types_inout[i]].num_levels==1);
|
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)))){
|
(!(protected&(XkbExplicitKeyTypesMask&~XkbExplicitKeyType1Mask)))){
|
||||||
register int s;
|
register int s;
|
||||||
Bool identical;
|
Bool identical;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user