aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/bar.c1
-rw-r--r--sway/commands/bar/bind.c106
-rw-r--r--sway/commands/bar/bindsym.c68
-rw-r--r--sway/ipc-json.c29
-rw-r--r--sway/meson.build2
-rw-r--r--sway/sway-bar.5.scd16
6 files changed, 149 insertions, 73 deletions
diff --git a/sway/commands/bar.c b/sway/commands/bar.c
index 3e7c1b0f..2a82d508 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 <libevdev/libevdev.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#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 <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#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 15f89f65..6e5ba4fd 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -1,4 +1,5 @@
#include <json-c/json.h>
+#include <libevdev/libevdev.h>
#include <stdio.h>
#include <ctype.h>
#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 <wlr/backend/libinput.h>
#include <wlr/types/wlr_box.h>
@@ -647,6 +649,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;
@@ -792,6 +819,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 b49d550a..93858336 100644
--- a/sway/meson.build
+++ b/sway/meson.build
@@ -105,8 +105,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 e1a4a937..3f6b4298 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* <height>
Sets the height of the bar. Default height (0) will match the font size.
-*bindsym* [--release] button<n> <command>
- 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] <event-code> <command>
+ 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]|<event-name> <command>
+ 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