diff options
Diffstat (limited to 'sway/commands/bar/bind.c')
-rw-r--r-- | sway/commands/bar/bind.c | 106 |
1 files changed, 77 insertions, 29 deletions
diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c index 17030a05..f94b4811 100644 --- a/sway/commands/bar/bind.c +++ b/sway/commands/bar/bind.c @@ -9,10 +9,70 @@ #include "log.h" #include "stringop.h" -static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) { - const char *command = code ? "bar bindcode" : "bar bindsym"; +static struct cmd_results *binding_add(struct bar_binding *binding, + list_t *mode_bindings) { + const char *name = get_mouse_button_name(binding->button); + bool overwritten = false; + for (int i = 0; i < mode_bindings->length; i++) { + struct bar_binding *other = mode_bindings->items[i]; + if (other->button == binding->button && + other->release == binding->release) { + overwritten = true; + mode_bindings->items[i] = binding; + free_bar_binding(other); + sway_log(SWAY_DEBUG, "[bar %s] Updated binding for %u (%s)%s", + config->current_bar->id, binding->button, name, + binding->release ? " - release" : ""); + break; + } + } + if (!overwritten) { + list_add(mode_bindings, binding); + sway_log(SWAY_DEBUG, "[bar %s] Added binding for %u (%s)%s", + config->current_bar->id, binding->button, name, + binding->release ? " - release" : ""); + } + return cmd_results_new(CMD_SUCCESS, NULL); +} + +static struct cmd_results *binding_remove(struct bar_binding *binding, + list_t *mode_bindings) { + const char *name = get_mouse_button_name(binding->button); + for (int i = 0; i < mode_bindings->length; i++) { + struct bar_binding *other = mode_bindings->items[i]; + if (other->button == binding->button && + other->release == binding->release) { + sway_log(SWAY_DEBUG, "[bar %s] Unbound binding for %u (%s)%s", + config->current_bar->id, binding->button, name, + binding->release ? " - release" : ""); + free_bar_binding(other); + free_bar_binding(binding); + list_del(mode_bindings, i); + return cmd_results_new(CMD_SUCCESS, NULL); + } + } + + struct cmd_results *error = cmd_results_new(CMD_FAILURE, "Could not " + "find binding for [bar %s]" " Button %u (%s)%s", + config->current_bar->id, binding->button, name, + binding->release ? " - release" : ""); + free_bar_binding(binding); + return error; +} + +static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code, + bool unbind) { + int minargs = 2; + const char *command; + if (unbind) { + minargs--; + command = code ? "bar unbindcode" : "bar unbindsym"; + } else { + command = code ? "bar bindcode" : "bar bindsym"; + } + struct cmd_results *error = NULL; - if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, 2))) { + if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, minargs))) { return error; } if (!config->current_bar) { @@ -46,39 +106,27 @@ static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) { free_bar_binding(binding); return cmd_results_new(CMD_INVALID, "Unknown button %s", argv[0]); } - const char *name = get_mouse_button_name(binding->button); - - binding->command = join_args(argv + 1, argc - 1); - list_t *bindings = config->current_bar->bindings; - bool overwritten = false; - for (int i = 0; i < bindings->length; i++) { - struct bar_binding *other = bindings->items[i]; - if (other->button == binding->button && - other->release == binding->release) { - overwritten = true; - bindings->items[i] = binding; - free_bar_binding(other); - sway_log(SWAY_DEBUG, "[bar %s] Updated binding for %u (%s)%s", - config->current_bar->id, binding->button, name, - binding->release ? " - release" : ""); - break; - } - } - if (!overwritten) { - list_add(bindings, binding); - sway_log(SWAY_DEBUG, "[bar %s] Added binding for %u (%s)%s", - config->current_bar->id, binding->button, name, - binding->release ? " - release" : ""); + if (unbind) { + return binding_remove(binding, bindings); } - return cmd_results_new(CMD_SUCCESS, NULL); + binding->command = join_args(argv + 1, argc - 1); + return binding_add(binding, bindings); } struct cmd_results *bar_cmd_bindcode(int argc, char **argv) { - return bar_cmd_bind(argc, argv, true); + return bar_cmd_bind(argc, argv, true, false); } struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { - return bar_cmd_bind(argc, argv, false); + return bar_cmd_bind(argc, argv, false, false); +} + +struct cmd_results *bar_cmd_unbindcode(int argc, char **argv) { + return bar_cmd_bind(argc, argv, true, true); +} + +struct cmd_results *bar_cmd_unbindsym(int argc, char **argv) { + return bar_cmd_bind(argc, argv, false, true); } |