return;
}
+ bool has_errors = false;
Binding *bind;
TAILQ_FOREACH(bind, bindings, bindings) {
if (bind->input_type == B_MOUSE) {
sasprintf(&tmp, "%s %d", keycodes, bind->translated_to[n]);
free(keycodes);
keycodes = tmp;
+
+ /* check for duplicate bindings */
+ Binding *check;
+ TAILQ_FOREACH(check, bindings, bindings) {
+ if (check == bind)
+ continue;
+ if (check->symbol != NULL)
+ continue;
+ if (check->keycode != bind->translated_to[n] ||
+ check->event_state_mask != bind->event_state_mask ||
+ check->release != bind->release)
+ continue;
+ has_errors = true;
+ ELOG("Duplicate keybinding in config file:\n keysym = %s, keycode = %d, state_mask = 0x%x\n", bind->symbol, check->keycode, bind->event_state_mask);
+ }
}
DLOG("state=0x%x, cfg=\"%s\", sym=0x%x → keycodes%s (%d)\n",
bind->event_state_mask, bind->symbol, keysym, keycodes, bind->number_keycodes);
}
xkb_state_unref(dummy_state);
+
+ if (has_errors) {
+ start_config_error_nagbar(current_configpath, true);
+ }
}
/*
/* Check if one is using keysym while the other is using bindsym.
* If so, skip. */
- /* XXX: It should be checked at a later place (when translating the
- * keysym to keycodes) if there are any duplicates */
if ((bind->symbol == NULL && current->symbol != NULL) ||
(bind->symbol != NULL && current->symbol == NULL))
continue;
return converted;
}
+/**
+ * Launch nagbar to indicate errors in the configuration file.
+ */
+void start_config_error_nagbar(const char *configpath, bool has_errors) {
+ char *editaction, *pageraction;
+ sasprintf(&editaction, "i3-sensible-editor \"%s\" && i3-msg reload\n", configpath);
+ sasprintf(&pageraction, "i3-sensible-pager \"%s\"\n", errorfilename);
+ char *argv[] = {
+ NULL, /* will be replaced by the executable path */
+ "-f",
+ (config.font.pattern ? config.font.pattern : "fixed"),
+ "-t",
+ (has_errors ? "error" : "warning"),
+ "-m",
+ (has_errors ? "You have an error in your i3 config file!" : "Your config is outdated. Please fix the warnings to make sure everything works."),
+ "-b",
+ "edit config",
+ editaction,
+ (errorfilename ? "-b" : NULL),
+ (has_errors ? "show errors" : "show warnings"),
+ pageraction,
+ NULL};
+
+ start_nagbar(&config_error_nagbar_pid, argv);
+ free(editaction);
+ free(pageraction);
+}
+
/*
* Parses the given file by first replacing the variables, then calling
* parse_config and possibly launching i3-nagbar.
if (version == 3)
ELOG("Please convert your configfile first, then fix any remaining errors (see above).\n");
- char *editaction,
- *pageraction;
- sasprintf(&editaction, "i3-sensible-editor \"%s\" && i3-msg reload\n", f);
- sasprintf(&pageraction, "i3-sensible-pager \"%s\"\n", errorfilename);
- char *argv[] = {
- NULL, /* will be replaced by the executable path */
- "-f",
- (config.font.pattern ? config.font.pattern : "fixed"),
- "-t",
- (context->has_errors ? "error" : "warning"),
- "-m",
- (context->has_errors ? "You have an error in your i3 config file!" : "Your config is outdated. Please fix the warnings to make sure everything works."),
- "-b",
- "edit config",
- editaction,
- (errorfilename ? "-b" : NULL),
- (context->has_errors ? "show errors" : "show warnings"),
- pageraction,
- NULL};
-
- start_nagbar(&config_error_nagbar_pid, argv);
- free(editaction);
- free(pageraction);
+ start_config_error_nagbar(f, context->has_errors);
}
bool has_errors = context->has_errors;