aboutsummaryrefslogtreecommitdiff
path: root/sway/commands/bar/bind.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands/bar/bind.c')
-rw-r--r--sway/commands/bar/bind.c106
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);
}