aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/commands.h2
-rw-r--r--sway/commands/bar.c2
-rw-r--r--sway/commands/bar/bind.c106
-rw-r--r--sway/sway-bar.5.scd6
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] <event-code>
+ Removes the binding with the given <event-code>.
+
+*unbindsym* [--release] button[1-9]|<event-name>
+ Removes the binding with the given <button> or <event-name>.
+
## TRAY
Swaybar provides a system tray where third-party applications may place icons.