diff options
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/bar.c | 1 | ||||
-rw-r--r-- | sway/commands/bar/bind.c | 22 | ||||
-rw-r--r-- | sway/commands/bar/tray_bind.c | 97 | ||||
-rw-r--r-- | sway/commands/bar/tray_bindsym.c | 55 |
4 files changed, 99 insertions, 76 deletions
diff --git a/sway/commands/bar.c b/sway/commands/bar.c index b19d9574..2cfc538f 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -28,6 +28,7 @@ static struct cmd_handler bar_handlers[] = { { "status_padding", bar_cmd_status_padding }, { "strip_workspace_name", bar_cmd_strip_workspace_name }, { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, + { "tray_bindcode", bar_cmd_tray_bindcode }, { "tray_bindsym", bar_cmd_tray_bindsym }, { "tray_output", bar_cmd_tray_output }, { "tray_padding", bar_cmd_tray_padding }, diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c index 71adced8..4b0be804 100644 --- a/sway/commands/bar/bind.c +++ b/sway/commands/bar/bind.c @@ -46,27 +46,7 @@ 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 = libevdev_event_code_get_name(EV_KEY, binding->button); - if (!name) { - switch (binding->button) { - case SWAY_SCROLL_UP: - name = "SWAY_SCROLL_UP"; - break; - case SWAY_SCROLL_DOWN: - name = "SWAY_SCROLL_DOWN"; - break; - case SWAY_SCROLL_LEFT: - name = "SWAY_SCROLL_LEFT"; - break; - case SWAY_SCROLL_RIGHT: - name = "SWAY_SCROLL_RIGHT"; - break; - default: - // Unreachable - break; - } - } + const char *name = get_mouse_button_name(binding->button); binding->command = join_args(argv + 1, argc - 1); 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); +} diff --git a/sway/commands/bar/tray_bindsym.c b/sway/commands/bar/tray_bindsym.c deleted file mode 100644 index 4e57e35e..00000000 --- a/sway/commands/bar/tray_bindsym.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <strings.h> -#include "config.h" -#include "sway/commands.h" -#include "sway/config.h" -#include "log.h" - -struct cmd_results *bar_cmd_tray_bindsym(int argc, char **argv) { -#if HAVE_TRAY - struct cmd_results *error = NULL; - if ((error = checkarg(argc, "tray_bindsym", EXPECTED_EQUAL_TO, 2))) { - return error; - } - - if (!config->current_bar) { - return cmd_results_new(CMD_FAILURE, "No bar defined."); - } - - int button = 0; - if (strncasecmp(argv[0], "button", strlen("button")) == 0 && - strlen(argv[0]) == strlen("button0")) { - button = argv[0][strlen("button")] - '0'; - } - if (button < 1 || button > 9) { - return cmd_results_new(CMD_FAILURE, - "[Bar %s] Only buttons 1 to 9 are supported", - config->current_bar->id); - } - - 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) { - wlr_log(WLR_DEBUG, "[Bar %s] Binding button %d to %s", - config->current_bar->id, button, commands[i]); - config->current_bar->tray_bindings[button] = commands[i]; - return cmd_results_new(CMD_SUCCESS, NULL); - } - } - - return cmd_results_new(CMD_INVALID, - "[Bar %s] Invalid command %s", config->current_bar->id, argv[1]); -#else - return cmd_results_new(CMD_INVALID, - "Sway has been compiled without tray support"); -#endif -} |