From 35ddd9aab3c386345176d7ea1f5814f152ba16bd Mon Sep 17 00:00:00 2001 From: Alex Maese Date: Fri, 12 Apr 2019 11:30:36 -0500 Subject: Add unbindsym/unbindcode command for swaybar --- include/sway/commands.h | 2 + sway/commands/bar.c | 2 + sway/commands/bar/bind.c | 106 ++++++++++++++++++++++++++++++++++------------- sway/sway-bar.5.scd | 6 +++ 4 files changed, 87 insertions(+), 29 deletions(-) diff --git a/include/sway/commands.h b/include/sway/commands.h index 0347ad5e..cfe2aa07 100644 --- a/include/sway/commands.h +++ b/include/sway/commands.h @@ -217,6 +217,8 @@ sway_cmd bar_cmd_tray_bindcode; sway_cmd bar_cmd_tray_bindsym; sway_cmd bar_cmd_tray_output; sway_cmd bar_cmd_tray_padding; +sway_cmd bar_cmd_unbindcode; +sway_cmd bar_cmd_unbindsym; sway_cmd bar_cmd_wrap_scroll; sway_cmd bar_cmd_workspace_buttons; diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 82441f9e..73be7040 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -32,6 +32,8 @@ static struct cmd_handler bar_handlers[] = { { "tray_bindsym", bar_cmd_tray_bindsym }, { "tray_output", bar_cmd_tray_output }, { "tray_padding", bar_cmd_tray_padding }, + { "unbindcode", bar_cmd_unbindcode }, + { "unbindsym", bar_cmd_unbindsym }, { "workspace_buttons", bar_cmd_workspace_buttons }, { "wrap_scroll", bar_cmd_wrap_scroll }, }; 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); } diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index 1f4ceaf2..a3df1160 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd @@ -112,6 +112,12 @@ Sway allows configuring swaybar in the sway configuration file. the bar. This value will be multiplied by the output scale. The default is _3_. +*unbindcode* [--release] + Removes the binding with the given . + +*unbindsym* [--release] button[1-9]| + Removes the binding with the given