vmod: don't allow to add a vmod with the name of a real mod
authorRan Benita <ran234@gmail.com>
Fri, 5 Oct 2012 18:17:54 +0000 (20:17 +0200)
committerRan Benita <ran234@gmail.com>
Sat, 6 Oct 2012 19:41:59 +0000 (21:41 +0200)
Otherwise strange thing might ensue.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/vmod.c

index ebd5371..51269be 100644 (file)
@@ -43,6 +43,7 @@ bool
 HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap, VModInfo *info)
 {
     xkb_mod_index_t i;
 HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap, VModInfo *info)
 {
     xkb_mod_index_t i;
+    const char *name;
     const struct xkb_vmod *vmod;
     struct xkb_vmod new;
 
     const struct xkb_vmod *vmod;
     struct xkb_vmod new;
 
@@ -51,6 +52,15 @@ HandleVModDef(VModDef *stmt, struct xkb_keymap *keymap, VModInfo *info)
                 "Support for setting a value in a virtual_modifiers statement has been removed; "
                 "Value ignored\n");
 
                 "Support for setting a value in a virtual_modifiers statement has been removed; "
                 "Value ignored\n");
 
+    name = xkb_atom_text(keymap->ctx, stmt->name);
+    if (ModNameToIndex(name) != XKB_MOD_INVALID) {
+        log_err(keymap->ctx,
+                "Can't add a virtual modifier named \"%s\"; "
+                "there is already a non-virtual modifier with this name! Ignored\n",
+                name);
+        return false;
+    }
+
     darray_enumerate(i, vmod, keymap->vmods) {
         if (vmod->name == stmt->name) {
             info->available |= 1 << i;
     darray_enumerate(i, vmod, keymap->vmods) {
         if (vmod->name == stmt->name) {
             info->available |= 1 << i;