Fix virtual modifiers mask extraction
authorRan Benita <ran234@gmail.com>
Sun, 5 Aug 2012 16:38:31 +0000 (19:38 +0300)
committerRan Benita <ran234@gmail.com>
Tue, 7 Aug 2012 10:20:37 +0000 (13:20 +0300)
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>
src/xkbcomp/action.c
src/xkbcomp/compat.c
src/xkbcomp/keytypes.c
src/xkbcomp/symbols.c

index e5632f3..22252b9 100644 (file)
@@ -310,7 +310,7 @@ HandleSetLatchMods(struct xkb_keymap *keymap, struct xkb_any_action *action,
         if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
             act->flags = t1;
             act->real_mods = act->mask = (t2 & 0xff);
-            act->vmods = (t2 >> 8) & 0xffff;
+            act->vmods = (t2 >> XkbNumModifiers) & 0xffff;
             return true;
         }
         return false;
@@ -335,7 +335,7 @@ HandleLockMods(struct xkb_keymap *keymap, struct xkb_any_action *action,
         if (CheckModifierField(keymap, action->type, value, &t1, &t2)) {
             act->flags = t1;
             act->real_mods = act->mask = (t2 & 0xff);
-            act->vmods = (t2 >> 8) & 0xffff;
+            act->vmods = (t2 >> XkbNumModifiers) & 0xffff;
             return true;
         }
         return false;
@@ -659,7 +659,7 @@ HandleISOLock(struct xkb_keymap *keymap, struct xkb_any_action *action,
 
         act->flags = flags & (~XkbSA_ISODfltIsGroup);
         act->real_mods = mods & 0xff;
-        act->vmods = (mods >> 8) & 0xff;
+        act->vmods = (mods >> XkbNumModifiers) & 0xffff;
         return true;
     }
     else if (field == F_Group) {
@@ -937,7 +937,7 @@ HandleRedirectKey(struct xkb_keymap *keymap, struct xkb_any_action *action,
             else
                 act->mods &= ~(t2 & 0xff);
 
-            t2 = (t2 >> 8) & 0xffff;
+            t2 = (t2 >> XkbNumModifiers) & 0xffff;
             act->vmods_mask |= t2;
             if (field == F_Modifiers)
                 act->vmods |= t2;
index 2761221..064a7fe 100644 (file)
@@ -767,7 +767,7 @@ SetIndicatorMapField(CompatInfo *info, LEDInfo *led,
             return ReportIndicatorBadType(info, led, field, "modifier mask");
 
         led->real_mods = mask & 0xff;
-        led->vmods = (mask >> 8) & 0xff;
+        led->vmods = (mask >> XkbNumModifiers) & 0xffff;
         led->defined |= LED_FIELD_MODS;
     }
     else if (istreq(field, "groups")) {
@@ -998,7 +998,7 @@ HandleGroupCompatDef(CompatInfo *info, GroupCompatDef *def,
     }
 
     tmp.real_mods = mask & 0xff;
-    tmp.vmods = (mask >> 8) & 0xffff;
+    tmp.vmods = (mask >> XkbNumModifiers) & 0xffff;
     tmp.defined = true;
     return AddGroupCompat(info, def->group - 1, &tmp);
 }
index 1eeae5a..f25a1f5 100644 (file)
@@ -466,7 +466,7 @@ SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
     }
 
     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) {
         log_warn(info->keymap->ctx,
@@ -644,8 +644,8 @@ SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
     if (!ExprResolveVModMask(info->keymap, arrayNdx, &mask))
         return ReportTypeBadType(info, type, "map entry", "modifier mask");
 
-    entry.mods.real_mods = mask & 0xff;      /* modifiers < 512 */
-    entry.mods.vmods = (mask >> 8) & 0xffff; /* modifiers > 512 */
+    entry.mods.real_mods = mask & 0xff;
+    entry.mods.vmods = (mask >> XkbNumModifiers) & 0xffff;
 
     if ((entry.mods.real_mods & (~type->mask)) ||
         (entry.mods.vmods & (~type->vmask))) {
@@ -686,7 +686,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
                                  "modifier mask");
 
     new.indexMods = mask & 0xff;
-    new.indexVMods = (mask >> 8) & 0xffff;
+    new.indexVMods = (mask >> XkbNumModifiers) & 0xffff;
 
     if ((new.indexMods & (~type->mask)) ||
         (new.indexVMods & (~type->vmask))) {
@@ -711,7 +711,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
     }
 
     new.preMods = mask & 0xff;
-    new.preVMods = (mask >> 16) & 0xffff;
+    new.preVMods = (mask >> XkbNumModifiers) & 0xffff;
 
     if ((new.preMods & (~new.indexMods)) ||
         (new.preVMods & (~new.indexVMods))) {
index ea4fb11..62c9fd5 100644 (file)
@@ -81,7 +81,7 @@ typedef struct _KeyInfo {
 
     xkb_atom_t types[XkbNumKbdGroups];
     enum key_repeat repeat;
-    unsigned short vmodmap;
+    xkb_mod_mask_t vmodmap;
     xkb_atom_t dfltType;
 
     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);
         if (ok) {
-            keyi->vmodmap = (mask >> 8);
+            keyi->vmodmap = (mask >> XkbNumModifiers) & 0xffff;
             keyi->defined |= KEY_FIELD_VMODMAP;
         }
         else {