From 3d6440ec26f2b39c54fd03aa3a3c822a8a2bbc72 Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Thu, 10 Jan 2019 12:43:10 -0500 Subject: bar_cmd_bind: utilize mouse button helpers This modifies `bar_cmd_bindsym` to use `get_mouse_bindsym` for parsing mouse buttons. This also introduces `cmd_bar_bindcode`, which will use `get_mouse_bindcode` for parsing mouse buttons. Like sway bindings, the two commands are encapsulated in a single file with shared code. This also modifies swaybar to operate off of event codes rather than x11 button numbers, which allows for any mouse button to be used. This introduces two new IPC properties: - For `get_bar_config`, `event_code` has been added to the `bindings` section and will include to event code for the button. If the event code can be mapped to a x11 button, `input_code` will still be the x11 button number. Otherwise, `input_code` will be `0`. - Likewise for `click_events`, `event` has been added and will include the event code for the button clicked. If the event code can be mapped to a x11 button, `button` will still be the x11 button number. Otherwise, `button` will be `0`. --- sway/commands/bar.c | 1 + sway/commands/bar/bind.c | 106 ++++++++++++++++++++++++++++++++++++++++++++ sway/commands/bar/bindsym.c | 68 ---------------------------- sway/ipc-json.c | 29 ++++++++++++ sway/meson.build | 2 +- sway/sway-bar.5.scd | 16 +++++-- 6 files changed, 149 insertions(+), 73 deletions(-) create mode 100644 sway/commands/bar/bind.c delete mode 100644 sway/commands/bar/bindsym.c (limited to 'sway') diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 507ee10a..ee5a8ebf 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c @@ -8,6 +8,7 @@ // Must be in alphabetical order for bsearch static struct cmd_handler bar_handlers[] = { + { "bindcode", bar_cmd_bindcode }, { "binding_mode_indicator", bar_cmd_binding_mode_indicator }, { "bindsym", bar_cmd_bindsym }, { "colors", bar_cmd_colors }, diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c new file mode 100644 index 00000000..a4c65ec4 --- /dev/null +++ b/sway/commands/bar/bind.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/input/cursor.h" +#include "list.h" +#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"; + struct cmd_results *error = NULL; + if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, 2))) { + return error; + } + if (!config->current_bar) { + return cmd_results_new(CMD_FAILURE, command, "No bar defined."); + } + + struct bar_binding *binding = calloc(1, sizeof(struct bar_binding)); + if (!binding) { + return cmd_results_new(CMD_FAILURE, command, + "Unable to allocate bar binding"); + } + + binding->release = false; + if (strcmp("--release", argv[0]) == 0) { + binding->release = true; + argv++; + argc--; + } + + 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_bar_binding(binding); + error = cmd_results_new(CMD_INVALID, command, message); + free(message); + return error; + } else if (!binding->button) { + free_bar_binding(binding); + return cmd_results_new(CMD_INVALID, command, + "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; + } + } + + 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); + wlr_log(WLR_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); + wlr_log(WLR_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, NULL); +} + +struct cmd_results *bar_cmd_bindcode(int argc, char **argv) { + return bar_cmd_bind(argc, argv, true); +} + +struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { + return bar_cmd_bind(argc, argv, false); +} diff --git a/sway/commands/bar/bindsym.c b/sway/commands/bar/bindsym.c deleted file mode 100644 index e6d6220e..00000000 --- a/sway/commands/bar/bindsym.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include "sway/commands.h" -#include "sway/config.h" -#include "list.h" -#include "log.h" -#include "stringop.h" - -struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { - struct cmd_results *error = NULL; - if ((error = checkarg(argc, "bar bindsym", EXPECTED_AT_LEAST, 2))) { - return error; - } - if (!config->current_bar) { - return cmd_results_new(CMD_FAILURE, "bar bindsym", "No bar defined."); - } - - struct bar_binding *binding = calloc(1, sizeof(struct bar_binding)); - if (!binding) { - return cmd_results_new(CMD_FAILURE, "bar bindsym", - "Unable to allocate bar binding"); - } - - binding->release = false; - if (strcmp("--release", argv[0]) == 0) { - binding->release = true; - argv++; - argc--; - } - - binding->button = 0; - if (strncasecmp(argv[0], "button", strlen("button")) == 0 && - strlen(argv[0]) == strlen("button0")) { - binding->button = argv[0][strlen("button")] - '0'; - } - if (binding->button < 1 || binding->button > 9) { - free_bar_binding(binding); - return cmd_results_new(CMD_FAILURE, "bar bindsym", - "Only button<1-9> is supported"); - } - - 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); - wlr_log(WLR_DEBUG, "[bar %s] Updated binding for button%u%s", - config->current_bar->id, binding->button, - binding->release ? " (release)" : ""); - break; - } - } - if (!overwritten) { - list_add(bindings, binding); - wlr_log(WLR_DEBUG, "[bar %s] Added binding for button%u%s", - config->current_bar->id, binding->button, - binding->release ? " (release)" : ""); - } - - return cmd_results_new(CMD_SUCCESS, NULL, NULL); -} diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 53e0e335..61602343 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -1,4 +1,5 @@ #include +#include #include #include #include "config.h" @@ -10,6 +11,7 @@ #include "sway/tree/workspace.h" #include "sway/output.h" #include "sway/input/input-manager.h" +#include "sway/input/cursor.h" #include "sway/input/seat.h" #include #include @@ -626,6 +628,31 @@ json_object *ipc_json_describe_seat(struct sway_seat *seat) { return object; } +static uint32_t event_to_x11_button(uint32_t event) { + switch (event) { + case BTN_LEFT: + return 1; + case BTN_MIDDLE: + return 2; + case BTN_RIGHT: + return 3; + case SWAY_SCROLL_UP: + return 4; + case SWAY_SCROLL_DOWN: + return 5; + case SWAY_SCROLL_LEFT: + return 6; + case SWAY_SCROLL_RIGHT: + return 7; + case BTN_SIDE: + return 8; + case BTN_EXTRA: + return 9; + default: + return 0; + } +} + json_object *ipc_json_describe_bar_config(struct bar_config *bar) { if (!sway_assert(bar, "Bar must not be NULL")) { return NULL; @@ -767,6 +794,8 @@ json_object *ipc_json_describe_bar_config(struct bar_config *bar) { struct bar_binding *binding = bar->bindings->items[i]; json_object *bind = json_object_new_object(); json_object_object_add(bind, "input_code", + json_object_new_int(event_to_x11_button(binding->button))); + json_object_object_add(bind, "event_code", json_object_new_int(binding->button)); json_object_object_add(bind, "command", json_object_new_string(binding->command)); diff --git a/sway/meson.build b/sway/meson.build index 98676ce0..9518c62b 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -100,8 +100,8 @@ sway_sources = files( 'commands/workspace_layout.c', 'commands/ws_auto_back_and_forth.c', + 'commands/bar/bind.c', 'commands/bar/binding_mode_indicator.c', - 'commands/bar/bindsym.c', 'commands/bar/colors.c', 'commands/bar/font.c', 'commands/bar/gaps.c', diff --git a/sway/sway-bar.5.scd b/sway/sway-bar.5.scd index 2357591d..ac1949b7 100644 --- a/sway/sway-bar.5.scd +++ b/sway/sway-bar.5.scd @@ -71,10 +71,18 @@ Sway allows configuring swaybar in the sway configuration file. *height* Sets the height of the bar. Default height will match the font size. -*bindsym* [--release] button - Executes _command_ when mouse button _n_ has been pressed (or if _released_ - is given, when mouse button _n_ has been released). To disable the default - behavior for a button, use the command _nop_. +*bindcode* [--release] + Executes _command_ when the mouse button has been pressed (or if _released_ + is given, when the button has been released). The buttons can be given as + an event code, which can be obtaining from `libinput debug-events`. To + disable the default behavior for a button, use the command _nop_. + +*bindsym* [--release] button[1-9]| + Executes _command_ when the mouse button has been pressed (or if _released_ + is given, when the button has been released). The buttons can be given as a + x11 button number or an event name, which can be obtained from `libinput + debug-events`. To disable the default behavior for a button, use the + command _nop_. *mode* dock|hide|invisible Specifies the visibility of the bar. In _dock_ mode, it is permanently -- cgit v1.2.3-54-g00ecf