Move check_for_duplicate_bindings to bindings.[ch]
Additionally add a check for the same input_type (mouse or keyboard). Bindings with different input types cannot be duplicates.
This commit is contained in:
parent
ea551e4d99
commit
02ff10aadb
|
@ -48,3 +48,12 @@ void translate_keysyms(void);
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void switch_mode(const char *new_mode);
|
void switch_mode(const char *new_mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for duplicate key bindings (the same keycode or keysym is configured
|
||||||
|
* more than once). If a duplicate binding is found, a message is printed to
|
||||||
|
* stderr and the has_errors variable is set to true, which will start
|
||||||
|
* i3-nagbar.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void check_for_duplicate_bindings(struct context *context);
|
||||||
|
|
|
@ -259,3 +259,56 @@ void switch_mode(const char *new_mode) {
|
||||||
|
|
||||||
ELOG("ERROR: Mode not found\n");
|
ELOG("ERROR: Mode not found\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checks for duplicate key bindings (the same keycode or keysym is configured
|
||||||
|
* more than once). If a duplicate binding is found, a message is printed to
|
||||||
|
* stderr and the has_errors variable is set to true, which will start
|
||||||
|
* i3-nagbar.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void check_for_duplicate_bindings(struct context *context) {
|
||||||
|
Binding *bind, *current;
|
||||||
|
TAILQ_FOREACH(current, bindings, bindings) {
|
||||||
|
TAILQ_FOREACH(bind, bindings, bindings) {
|
||||||
|
/* Abort when we reach the current keybinding, only check the
|
||||||
|
* bindings before */
|
||||||
|
if (bind == current)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Check if the input types are different */
|
||||||
|
if (bind->input_type != current->input_type)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
/* If bind is NULL, current has to be NULL, too (see above).
|
||||||
|
* If the keycodes differ, it can't be a duplicate. */
|
||||||
|
if (bind->symbol != NULL &&
|
||||||
|
strcasecmp(bind->symbol, current->symbol) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Check if the keycodes or modifiers are different. If so, they
|
||||||
|
* can't be duplicate */
|
||||||
|
if (bind->keycode != current->keycode ||
|
||||||
|
bind->mods != current->mods ||
|
||||||
|
bind->release != current->release)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
context->has_errors = true;
|
||||||
|
if (current->keycode != 0) {
|
||||||
|
ELOG("Duplicate keybinding in config file:\n modmask %d with keycode %d, command \"%s\"\n",
|
||||||
|
current->mods, current->keycode, current->command);
|
||||||
|
} else {
|
||||||
|
ELOG("Duplicate keybinding in config file:\n modmask %d with keysym %s, command \"%s\"\n",
|
||||||
|
current->mods, current->symbol, current->command);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -843,55 +843,6 @@ static char *migrate_config(char *input, off_t size) {
|
||||||
return converted;
|
return converted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Checks for duplicate key bindings (the same keycode or keysym is configured
|
|
||||||
* more than once). If a duplicate binding is found, a message is printed to
|
|
||||||
* stderr and the has_errors variable is set to true, which will start
|
|
||||||
* i3-nagbar.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void check_for_duplicate_bindings(struct context *context) {
|
|
||||||
Binding *bind, *current;
|
|
||||||
TAILQ_FOREACH(current, bindings, bindings) {
|
|
||||||
TAILQ_FOREACH(bind, bindings, bindings) {
|
|
||||||
/* Abort when we reach the current keybinding, only check the
|
|
||||||
* bindings before */
|
|
||||||
if (bind == current)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
|
|
||||||
/* If bind is NULL, current has to be NULL, too (see above).
|
|
||||||
* If the keycodes differ, it can't be a duplicate. */
|
|
||||||
if (bind->symbol != NULL &&
|
|
||||||
strcasecmp(bind->symbol, current->symbol) != 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Check if the keycodes or modifiers are different. If so, they
|
|
||||||
* can't be duplicate */
|
|
||||||
if (bind->keycode != current->keycode ||
|
|
||||||
bind->mods != current->mods ||
|
|
||||||
bind->release != current->release)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
context->has_errors = true;
|
|
||||||
if (current->keycode != 0) {
|
|
||||||
ELOG("Duplicate keybinding in config file:\n modmask %d with keycode %d, command \"%s\"\n",
|
|
||||||
current->mods, current->keycode, current->command);
|
|
||||||
} else {
|
|
||||||
ELOG("Duplicate keybinding in config file:\n modmask %d with keysym %s, command \"%s\"\n",
|
|
||||||
current->mods, current->symbol, current->command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parses the given file by first replacing the variables, then calling
|
* Parses the given file by first replacing the variables, then calling
|
||||||
* parse_config and possibly launching i3-nagbar.
|
* parse_config and possibly launching i3-nagbar.
|
||||||
|
|
Loading…
Reference in New Issue