Add unbindsym/unbindcode command for swaybar

This commit is contained in:
Alex Maese 2019-04-12 11:30:36 -05:00 committed by Brian Ashworth
parent 8d4f8aea46
commit 35ddd9aab3
4 changed files with 88 additions and 30 deletions

View file

@ -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;

View file

@ -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 },
}; };

View file

@ -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); list_t *bindings = config->current_bar->bindings;
if (unbind) {
return binding_remove(binding, bindings);
}
binding->command = join_args(argv + 1, argc - 1); binding->command = join_args(argv + 1, argc - 1);
return binding_add(binding, bindings);
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" : "");
}
return cmd_results_new(CMD_SUCCESS, NULL);
} }
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);
} }

View file

@ -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.