]> git.sur5r.net Git - i3/i3/commitdiff
Validate that a binding mode is not defined more than once. (#2633)
authorIngo Bürk <admin@airblader.de>
Fri, 13 Jan 2017 17:33:29 +0000 (18:33 +0100)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Fri, 13 Jan 2017 17:33:29 +0000 (09:33 -0800)
While defining the same mode usually wouldn't hurt and, in fact, the old behavior
allows to split the definition of a binding mode into several blocks, this
can lead to user errors where they accidentally define a mode twice and don't understand
why the mode behaves a certain way (this has been observed in real life :-)).

There's no good usecase for splitting a single binding mode into multiple blocks, thus
the new behavior is better.

fixes #2615

src/bindings.c
src/config_directives.c

index c76e7779f1ef19c3f56d5f41b448712cabea30b8..bfec27e1edb797dff744d852ff1a05491a6bdce5 100644 (file)
@@ -32,8 +32,9 @@ static struct Mode *mode_from_name(const char *name, bool pango_markup) {
 
     /* Try to find the mode in the list of modes and return it */
     SLIST_FOREACH(mode, &modes, modes) {
-        if (strcmp(mode->name, name) == 0)
+        if (strcmp(mode->name, name) == 0) {
             return mode;
+        }
     }
 
     /* If the mode was not found, create a new one */
index a260518c3d533bb949ac08aaf989d5a5ffe4d54f..82e1a3461dc38e4c27eb4526817807de539e79c2 100644 (file)
@@ -126,6 +126,15 @@ CFGFUN(enter_mode, const char *pango_markup, const char *modename) {
         ELOG("You cannot use the name %s for your mode\n", DEFAULT_BINDING_MODE);
         exit(1);
     }
+
+    struct Mode *mode;
+    SLIST_FOREACH(mode, &modes, modes) {
+        if (strcmp(mode->name, modename) == 0) {
+            ELOG("The binding mode with name \"%s\" is defined at least twice.\n", modename);
+            exit(1);
+        }
+    }
+
     DLOG("\t now in mode %s\n", modename);
     FREE(current_mode);
     current_mode = sstrdup(modename);