Add unbindsym/unbindcode command for swaybar

master
Alex Maese 6 years ago committed by Brian Ashworth
parent 8d4f8aea46
commit 35ddd9aab3

@ -217,6 +217,8 @@ sway_cmd bar_cmd_tray_bindcode;
sway_cmd bar_cmd_tray_bindsym; sway_cmd bar_cmd_tray_bindsym;
sway_cmd bar_cmd_tray_output; sway_cmd bar_cmd_tray_output;
sway_cmd bar_cmd_tray_padding; 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_wrap_scroll;
sway_cmd bar_cmd_workspace_buttons; sway_cmd bar_cmd_workspace_buttons;

@ -32,6 +32,8 @@ static struct cmd_handler bar_handlers[] = {
{ "tray_bindsym", bar_cmd_tray_bindsym }, { "tray_bindsym", bar_cmd_tray_bindsym },
{ "tray_output", bar_cmd_tray_output }, { "tray_output", bar_cmd_tray_output },
{ "tray_padding", bar_cmd_tray_padding }, { "tray_padding", bar_cmd_tray_padding },
{ "unbindcode", bar_cmd_unbindcode },
{ "unbindsym", bar_cmd_unbindsym },
{ "workspace_buttons", bar_cmd_workspace_buttons }, { "workspace_buttons", bar_cmd_workspace_buttons },
{ "wrap_scroll", bar_cmd_wrap_scroll }, { "wrap_scroll", bar_cmd_wrap_scroll },
}; };

@ -9,10 +9,70 @@
#include "log.h" #include "log.h"
#include "stringop.h" #include "stringop.h"
static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code) { static struct cmd_results *binding_add(struct bar_binding *binding,
const char *command = code ? "bar bindcode" : "bar bindsym"; 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; 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; return error;
} }
if (!config->current_bar) { 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); free_bar_binding(binding);
return cmd_results_new(CMD_INVALID, "Unknown button %s", argv[0]); 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; list_t *bindings = config->current_bar->bindings;
bool overwritten = false; if (unbind) {
for (int i = 0; i < bindings->length; i++) { return binding_remove(binding, bindings);
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" : "");
} }
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) { 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) { 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);
} }

@ -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 the bar. This value will be multiplied by the output scale. The default is
_3_. _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 ## TRAY
Swaybar provides a system tray where third-party applications may place icons. Swaybar provides a system tray where third-party applications may place icons.

Loading…
Cancel
Save