aboutsummaryrefslogtreecommitdiffstats
path: root/sway/commands/bind.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2018-12-23 10:54:54 -0500
committerLibravatar emersion <contact@emersion.fr>2018-12-25 13:27:08 +0100
commita223030b70c8e360f81b820244705e007e3ac1ec (patch)
tree4e38abb2e27cb567760bab659546ff7176fe49fa /sway/commands/bind.c
parentsway(5): document tiling_drag (diff)
downloadsway-a223030b70c8e360f81b820244705e007e3ac1ec.tar.gz
sway-a223030b70c8e360f81b820244705e007e3ac1ec.tar.zst
sway-a223030b70c8e360f81b820244705e007e3ac1ec.zip
Change mouse buttons to x11 map and libevdev names
This modifies the way mouse bindings are parsed. Instead of adding to BTN_LEFT, which results in button numbers that may not be expected, buttons will be parsed in one of the following ways: 1. `button[1-9]` will now map to their x11 equivalents. This is already the case for bar bindings. This adds support for binding to axis events, which was not possible in the previous approach. 2. Anything that starts with `BTN_` will be parsed as an event code name using `libevdev_event_code_from_name`. This allows for any button to be mapped to instead of limiting usage to the ones near BTN_LEFT. This also adds a dependency on libevdev, but since libevdev is already a dependency of libinput, this should be fine. If needed, this option can have dependency guards added. Binding changes: - button1: BTN_LEFT -> BTN_LEFT - button2: BTN_RIGHT -> BTN_MIDDLE - button3: BTN_MIDDLE -> BTN_RIGHT - button4: BTN_SIDE -> SWAY_SCROLL_UP - button5: BTN_EXTRA -> SWAY_SCROLL_DOWN - button6: BTN_FORWARD -> SWAY_SCROLL_LEFT - button7: BTN_BACK -> SWAY_SCROLL_RIGHT - button8: BTN_TASK -> BTN_SIDE - button9: BTN_JOYSTICK -> BTN_EXTRA Since the axis events need to be mapped to an event code, this uses the following mappings to avoid any conflicts: - SWAY_SCROLL_UP: KEY_MAX + 1 - SWAY_SCROLL_DOWN: KEY_MAX + 2 - SWAY_SCROLL_LEFT: KEY_MAX + 3 - SWAY_SCROLL_RIGHT: KEY_MAX + 4
Diffstat (limited to 'sway/commands/bind.c')
-rw-r--r--sway/commands/bind.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/sway/commands/bind.c b/sway/commands/bind.c
index 01a35cf2..5990166a 100644
--- a/sway/commands/bind.c
+++ b/sway/commands/bind.c
@@ -1,4 +1,5 @@
1#define _POSIX_C_SOURCE 200809L 1#define _POSIX_C_SOURCE 200809L
2#include <libevdev/libevdev.h>
2#ifdef __linux__ 3#ifdef __linux__
3#include <linux/input-event-codes.h> 4#include <linux/input-event-codes.h>
4#elif __FreeBSD__ 5#elif __FreeBSD__
@@ -10,6 +11,7 @@
10#include <strings.h> 11#include <strings.h>
11#include "sway/commands.h" 12#include "sway/commands.h"
12#include "sway/config.h" 13#include "sway/config.h"
14#include "sway/input/cursor.h"
13#include "sway/ipc-server.h" 15#include "sway/ipc-server.h"
14#include "list.h" 16#include "list.h"
15#include "log.h" 17#include "log.h"
@@ -102,9 +104,26 @@ static struct cmd_results *identify_key(const char* name, bool first_key,
102 104
103 // Check for mouse binding 105 // Check for mouse binding
104 uint32_t button = 0; 106 uint32_t button = 0;
105 if (strncasecmp(name, "button", strlen("button")) == 0 && 107 if (strncasecmp(name, "button", strlen("button")) == 0) {
106 strlen(name) == strlen("button0")) { 108 // Map to x11 mouse buttons
107 button = name[strlen("button")] - '1' + BTN_LEFT; 109 button = name[strlen("button")] - '0';
110 if (button < 1 || button > 9 || strlen(name) > strlen("button0")) {
111 return cmd_results_new(CMD_INVALID, "bindsym",
112 "Only buttons 1-9 are supported. For other mouse "
113 "buttons, use the name of the event code.");
114 }
115 uint32_t buttons[] = {BTN_LEFT, BTN_MIDDLE, BTN_RIGHT,
116 SWAY_SCROLL_UP, SWAY_SCROLL_DOWN, SWAY_SCROLL_LEFT,
117 SWAY_SCROLL_RIGHT, BTN_SIDE, BTN_EXTRA};
118 button = buttons[button - 1];
119 } else if (strncmp(name, "BTN_", strlen("BTN_")) == 0) {
120 // Get event code
121 int code = libevdev_event_code_from_name(EV_KEY, name);
122 if (code == -1) {
123 return cmd_results_new(CMD_INVALID, "bindsym",
124 "Invalid event code name %s", name);
125 }
126 button = code;
108 } 127 }
109 128
110 if (*type == BINDING_KEYSYM) { 129 if (*type == BINDING_KEYSYM) {