check_for_duplicate_bindings

next
Radek Tříška 2011-08-04 13:24:59 +02:00 committed by Michael Stapelberg
parent e9395149b9
commit 9d101d8473
1 changed files with 31 additions and 0 deletions

View 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);
}