Fix virtual modifiers mask extraction
The calculations were performed incorrectly in several places, specifically shifting by 16 instead of 8 (= XkbNumModifiers) and masking with 0xff instead of 0xffff. More stuff that probably never worked as intended. This also makes these more grep-able when we remove the vmods/real_mods separation. Signed-off-by: Ran Benita <ran234@gmail.com>master
parent
796dccabe8
commit
6b75dd2dcb
|
@ -310,7 +310,7 @@ HandleSetLatchMods(struct xkb_keymap *keymap, struct xkb_any_action *action,
|
||||||
if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
|
if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
|
||||||
act->flags = t1;
|
act->flags = t1;
|
||||||
act->real_mods = act->mask = (t2 & 0xff);
|
act->real_mods = act->mask = (t2 & 0xff);
|
||||||
act->vmods = (t2 >> 8) & 0xffff;
|
act->vmods = (t2 >> XkbNumModifiers) & 0xffff;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -335,7 +335,7 @@ HandleLockMods(struct xkb_keymap *keymap, struct xkb_any_action *action,
|
||||||
if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
|
if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
|
||||||
act->flags = t1;
|
act->flags = t1;
|
||||||
act->real_mods = act->mask = (t2 & 0xff);
|
act->real_mods = act->mask = (t2 & 0xff);
|
||||||
act->vmods = (t2 >> 8) & 0xffff;
|
act->vmods = (t2 >> XkbNumModifiers) & 0xffff;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -659,7 +659,7 @@ HandleISOLock(struct xkb_keymap *keymap, struct xkb_any_action *action,
|
||||||
|
|
||||||
act->flags = flags & (~XkbSA_ISODfltIsGroup);
|
act->flags = flags & (~XkbSA_ISODfltIsGroup);
|
||||||
act->real_mods = mods & 0xff;
|
act->real_mods = mods & 0xff;
|
||||||
act->vmods = (mods >> 8) & 0xff;
|
act->vmods = (mods >> XkbNumModifiers) & 0xffff;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (field == F_Group) {
|
else if (field == F_Group) {
|
||||||
|
@ -937,7 +937,7 @@ HandleRedirectKey(struct xkb_keymap *keymap, struct xkb_any_action *action,
|
||||||
else
|
else
|
||||||
act->mods &= ~(t2 & 0xff);
|
act->mods &= ~(t2 & 0xff);
|
||||||
|
|
||||||
t2 = (t2 >> 8) & 0xffff;
|
t2 = (t2 >> XkbNumModifiers) & 0xffff;
|
||||||
act->vmods_mask |= t2;
|
act->vmods_mask |= t2;
|
||||||
if (field == F_Modifiers)
|
if (field == F_Modifiers)
|
||||||
act->vmods |= t2;
|
act->vmods |= t2;
|
||||||
|
|
|
@ -767,7 +767,7 @@ SetIndicatorMapField(CompatInfo *info, LEDInfo *led,
|
||||||
return ReportIndicatorBadType(info, led, field, "modifier mask");
|
return ReportIndicatorBadType(info, led, field, "modifier mask");
|
||||||
|
|
||||||
led->real_mods = mask & 0xff;
|
led->real_mods = mask & 0xff;
|
||||||
led->vmods = (mask >> 8) & 0xff;
|
led->vmods = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
led->defined |= LED_FIELD_MODS;
|
led->defined |= LED_FIELD_MODS;
|
||||||
}
|
}
|
||||||
else if (istreq(field, "groups")) {
|
else if (istreq(field, "groups")) {
|
||||||
|
@ -998,7 +998,7 @@ HandleGroupCompatDef(CompatInfo *info, GroupCompatDef *def,
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp.real_mods = mask & 0xff;
|
tmp.real_mods = mask & 0xff;
|
||||||
tmp.vmods = (mask >> 8) & 0xffff;
|
tmp.vmods = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
tmp.defined = true;
|
tmp.defined = true;
|
||||||
return AddGroupCompat(info, def->group - 1, &tmp);
|
return AddGroupCompat(info, def->group - 1, &tmp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -466,7 +466,7 @@ SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
}
|
}
|
||||||
|
|
||||||
mods = mask & 0xff; /* core mods */
|
mods = mask & 0xff; /* core mods */
|
||||||
vmods = (mask >> 8) & 0xffff; /* xkb virtual mods */
|
vmods = (mask >> XkbNumModifiers) & 0xffff; /* xkb virtual mods */
|
||||||
|
|
||||||
if (type->defined & TYPE_FIELD_MASK) {
|
if (type->defined & TYPE_FIELD_MASK) {
|
||||||
log_warn(info->keymap->ctx,
|
log_warn(info->keymap->ctx,
|
||||||
|
@ -644,8 +644,8 @@ SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
if (!ExprResolveVModMask(info->keymap, arrayNdx, &mask))
|
if (!ExprResolveVModMask(info->keymap, arrayNdx, &mask))
|
||||||
return ReportTypeBadType(info, type, "map entry", "modifier mask");
|
return ReportTypeBadType(info, type, "map entry", "modifier mask");
|
||||||
|
|
||||||
entry.mods.real_mods = mask & 0xff; /* modifiers < 512 */
|
entry.mods.real_mods = mask & 0xff;
|
||||||
entry.mods.vmods = (mask >> 8) & 0xffff; /* modifiers > 512 */
|
entry.mods.vmods = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
|
|
||||||
if ((entry.mods.real_mods & (~type->mask)) ||
|
if ((entry.mods.real_mods & (~type->mask)) ||
|
||||||
(entry.mods.vmods & (~type->vmask))) {
|
(entry.mods.vmods & (~type->vmask))) {
|
||||||
|
@ -686,7 +686,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
"modifier mask");
|
"modifier mask");
|
||||||
|
|
||||||
new.indexMods = mask & 0xff;
|
new.indexMods = mask & 0xff;
|
||||||
new.indexVMods = (mask >> 8) & 0xffff;
|
new.indexVMods = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
|
|
||||||
if ((new.indexMods & (~type->mask)) ||
|
if ((new.indexMods & (~type->mask)) ||
|
||||||
(new.indexVMods & (~type->vmask))) {
|
(new.indexVMods & (~type->vmask))) {
|
||||||
|
@ -711,7 +711,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
}
|
}
|
||||||
|
|
||||||
new.preMods = mask & 0xff;
|
new.preMods = mask & 0xff;
|
||||||
new.preVMods = (mask >> 16) & 0xffff;
|
new.preVMods = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
|
|
||||||
if ((new.preMods & (~new.indexMods)) ||
|
if ((new.preMods & (~new.indexMods)) ||
|
||||||
(new.preVMods & (~new.indexVMods))) {
|
(new.preVMods & (~new.indexVMods))) {
|
||||||
|
|
|
@ -81,7 +81,7 @@ typedef struct _KeyInfo {
|
||||||
|
|
||||||
xkb_atom_t types[XkbNumKbdGroups];
|
xkb_atom_t types[XkbNumKbdGroups];
|
||||||
enum key_repeat repeat;
|
enum key_repeat repeat;
|
||||||
unsigned short vmodmap;
|
xkb_mod_mask_t vmodmap;
|
||||||
xkb_atom_t dfltType;
|
xkb_atom_t dfltType;
|
||||||
|
|
||||||
uint8_t out_of_range_group_action;
|
uint8_t out_of_range_group_action;
|
||||||
|
@ -1040,7 +1040,7 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field,
|
||||||
|
|
||||||
ok = ExprResolveVModMask(info->keymap, value, &mask);
|
ok = ExprResolveVModMask(info->keymap, value, &mask);
|
||||||
if (ok) {
|
if (ok) {
|
||||||
keyi->vmodmap = (mask >> 8);
|
keyi->vmodmap = (mask >> XkbNumModifiers) & 0xffff;
|
||||||
keyi->defined |= KEY_FIELD_VMODMAP;
|
keyi->defined |= KEY_FIELD_VMODMAP;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in New Issue