diff options
Diffstat (limited to 'sway/commands/bar/tray_bind.c')
-rw-r--r-- | sway/commands/bar/tray_bind.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sway/commands/bar/tray_bind.c b/sway/commands/bar/tray_bind.c new file mode 100644 index 00000000..48a15462 --- /dev/null +++ b/sway/commands/bar/tray_bind.c @@ -0,0 +1,97 @@ +#include <strings.h> +#include "config.h" +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/input/cursor.h" +#include "log.h" + +static struct cmd_results *tray_bind(int argc, char **argv, bool code) { +#if HAVE_TRAY + const char *command = code ? "bar tray_bindcode" : "bar tray_bindsym"; + struct cmd_results *error = NULL; + if ((error = checkarg(argc, command, EXPECTED_EQUAL_TO, 2))) { + return error; + } + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, "No bar defined."); + } + + struct tray_binding *binding = calloc(1, sizeof(struct tray_binding)); + if (!binding) { + return cmd_results_new(CMD_FAILURE, "Unable to allocate tray binding"); + } + + char *message = NULL; + if (code) { + binding->button = get_mouse_bindcode(argv[0], &message); + } else { + binding->button = get_mouse_bindsym(argv[0], &message); + } + if (message) { + free(binding); + error = cmd_results_new(CMD_INVALID, message); + free(message); + return error; + } else if (!binding->button) { + free(binding); + return cmd_results_new(CMD_INVALID, "Unknown button %s", argv[0]); + } + const char *name = get_mouse_button_name(binding->button); + + static const char *commands[] = { + "ContextMenu", + "Activate", + "SecondaryActivate", + "ScrollDown", + "ScrollLeft", + "ScrollRight", + "ScrollUp", + "nop" + }; + + for (size_t i = 0; i < sizeof(commands) / sizeof(commands[0]); ++i) { + if (strcasecmp(argv[1], commands[i]) == 0) { + binding->command = commands[i]; + } + } + if (!binding->command) { + return cmd_results_new(CMD_INVALID, "[Bar %s] Invalid tray command %s", + config->current_bar->id, argv[1]); + } + + bool overwritten = false; + struct tray_binding *other = NULL; + wl_list_for_each(other, &config->current_bar->tray_bindings, link) { + if (other->button == binding->button) { + overwritten = true; + other->command = binding->command; + free(binding); + binding = other; + wlr_log(WLR_DEBUG, + "[bar %s] Updated tray binding for %u (%s) to %s", + config->current_bar->id, binding->button, name, + binding->command); + break; + } + } + if (!overwritten) { + wl_list_insert(&config->current_bar->tray_bindings, &binding->link); + wlr_log(WLR_DEBUG, "[bar %s] Added tray binding for %u (%s) to %s", + config->current_bar->id, binding->button, name, + binding->command); + } + + return cmd_results_new(CMD_SUCCESS, NULL); +#else + return cmd_results_new(CMD_INVALID, + "Sway has been compiled without tray support"); +#endif +} + +struct cmd_results *bar_cmd_tray_bindcode(int argc, char **argv) { + return tray_bind(argc, argv, true); +} + +struct cmd_results *bar_cmd_tray_bindsym(int argc, char **argv) { + return tray_bind(argc, argv, false); +} |