]> git.sur5r.net Git - i3/i3/commitdiff
check_for_duplicate_bindings
authorRadek Tříška <radek@fastlinux.eu>
Thu, 4 Aug 2011 11:24:59 +0000 (13:24 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 4 Aug 2011 18:37:01 +0000 (20:37 +0200)
src/cfgparse.y

index 59b22c6c9ef15a9188e8e9f35fb4b97ece1772e8..226363cce2201d42ff3d484e0ecfe978927073a1 100644 (file)
@@ -310,6 +310,35 @@ void kill_configerror_nagbar(bool wait_for_it) {
     waitpid(configerror_pid, NULL, 0);
 }
 
+/*
+    check_for_duplicate_bindings is function looking for duplicated
+    key bindings loaded from configuration file. It goes trought all bindings
+    and tests if exists same key mapping in bindings visited before.
+    If exists, message is printed to "stderr" and error warning is set.
+*/
+static bool check_for_duplicate_bindings(struct context *context) {
+    bool retval = true;
+    Binding *bind, *current;
+    TAILQ_FOREACH(current, bindings, bindings) {
+        bind = TAILQ_FIRST(bindings);
+        // test only bindings visited up to current binding
+        while ((bind != TAILQ_END(bindings)) && (bind != current)) {
+            // testing is not case sensitive
+            if ((strcasecmp(bind->symbol, current->symbol) == 0) && (bind->keycode == current->keycode) && (bind->mods == current->mods)) {
+                context->has_errors = true;
+                fprintf(stderr, "Duplicated keybinding in config file:  mod%d with key %s", current->mods, current->symbol);
+                // if keycode is 0, it´s not necessary to print it.
+                if(current->keycode != 0)
+                    fprintf(stderr, " and keycode %d", current->keycode);
+                fprintf(stderr, "\n");
+                retval = false;
+            }
+            bind = TAILQ_NEXT(bind, bindings);
+        }
+    }
+    return retval;
+}
+
 void parse_file(const char *f) {
     SLIST_HEAD(variables_head, Variable) variables = SLIST_HEAD_INITIALIZER(&variables);
     int fd, ret, read_bytes = 0;
@@ -463,6 +492,8 @@ void parse_file(const char *f) {
         exit(1);
     }
 
+    check_for_duplicate_bindings(context);
+
     if (context->has_errors) {
         start_configerror_nagbar(f);
     }