diff options
-rw-r--r-- | include/sway/input/cursor.h | 8 | ||||
-rw-r--r-- | sway/input/cursor.c | 65 |
2 files changed, 73 insertions, 0 deletions
diff --git a/include/sway/input/cursor.h b/include/sway/input/cursor.h index 22e278b0..4636bf6b 100644 --- a/include/sway/input/cursor.h +++ b/include/sway/input/cursor.h | |||
@@ -86,4 +86,12 @@ void cursor_warp_to_container(struct sway_cursor *cursor, | |||
86 | 86 | ||
87 | void cursor_warp_to_workspace(struct sway_cursor *cursor, | 87 | void cursor_warp_to_workspace(struct sway_cursor *cursor, |
88 | struct sway_workspace *workspace); | 88 | struct sway_workspace *workspace); |
89 | |||
90 | uint32_t get_mouse_bindsym(const char *name, char **error); | ||
91 | |||
92 | uint32_t get_mouse_bindcode(const char *name, char **error); | ||
93 | |||
94 | // Considers both bindsym and bindcode | ||
95 | uint32_t get_mouse_button(const char *name, char **error); | ||
96 | |||
89 | #endif | 97 | #endif |
diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 96feb47d..0d5e9361 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c | |||
@@ -2,8 +2,10 @@ | |||
2 | #include <math.h> | 2 | #include <math.h> |
3 | #include <libevdev/libevdev.h> | 3 | #include <libevdev/libevdev.h> |
4 | #include <linux/input-event-codes.h> | 4 | #include <linux/input-event-codes.h> |
5 | #include <errno.h> | ||
5 | #include <float.h> | 6 | #include <float.h> |
6 | #include <limits.h> | 7 | #include <limits.h> |
8 | #include <strings.h> | ||
7 | #include <wlr/types/wlr_cursor.h> | 9 | #include <wlr/types/wlr_cursor.h> |
8 | #include <wlr/types/wlr_xcursor_manager.h> | 10 | #include <wlr/types/wlr_xcursor_manager.h> |
9 | #include <wlr/types/wlr_idle.h> | 11 | #include <wlr/types/wlr_idle.h> |
@@ -1527,3 +1529,66 @@ void cursor_warp_to_workspace(struct sway_cursor *cursor, | |||
1527 | 1529 | ||
1528 | wlr_cursor_warp(cursor->cursor, NULL, x, y); | 1530 | wlr_cursor_warp(cursor->cursor, NULL, x, y); |
1529 | } | 1531 | } |
1532 | |||
1533 | uint32_t get_mouse_bindsym(const char *name, char **error) { | ||
1534 | if (strncasecmp(name, "button", strlen("button")) == 0) { | ||
1535 | // Map to x11 mouse buttons | ||
1536 | int number = name[strlen("button")] - '0'; | ||
1537 | if (number < 1 || number > 9 || strlen(name) > strlen("button0")) { | ||
1538 | *error = strdup("Only buttons 1-9 are supported. For other mouse " | ||
1539 | "buttons, use the name of the event code."); | ||
1540 | return 0; | ||
1541 | } | ||
1542 | static const uint32_t buttons[] = {BTN_LEFT, BTN_MIDDLE, BTN_RIGHT, | ||
1543 | SWAY_SCROLL_UP, SWAY_SCROLL_DOWN, SWAY_SCROLL_LEFT, | ||
1544 | SWAY_SCROLL_RIGHT, BTN_SIDE, BTN_EXTRA}; | ||
1545 | return buttons[number - 1]; | ||
1546 | } else if (strncmp(name, "BTN_", strlen("BTN_")) == 0) { | ||
1547 | // Get event code from name | ||
1548 | int code = libevdev_event_code_from_name(EV_KEY, name); | ||
1549 | if (code == -1) { | ||
1550 | size_t len = snprintf(NULL, 0, "Unknown event %s", name) + 1; | ||
1551 | *error = malloc(len); | ||
1552 | if (*error) { | ||
1553 | snprintf(*error, len, "Unknown event %s", name); | ||
1554 | } | ||
1555 | return 0; | ||
1556 | } | ||
1557 | return code; | ||
1558 | } | ||
1559 | return 0; | ||
1560 | } | ||
1561 | |||
1562 | uint32_t get_mouse_bindcode(const char *name, char **error) { | ||
1563 | // Validate event code | ||
1564 | errno = 0; | ||
1565 | char *endptr; | ||
1566 | int code = strtol(name, &endptr, 10); | ||
1567 | if (endptr == name && code <= 0) { | ||
1568 | *error = strdup("Button event code must be a positive integer."); | ||
1569 | return 0; | ||
1570 | } else if (errno == ERANGE) { | ||
1571 | *error = strdup("Button event code out of range."); | ||
1572 | return 0; | ||
1573 | } | ||
1574 | const char *event = libevdev_event_code_get_name(EV_KEY, code); | ||
1575 | if (!event || strncmp(event, "BTN_", strlen("BTN_")) != 0) { | ||
1576 | size_t len = snprintf(NULL, 0, "Event code %d (%s) is not a button", | ||
1577 | code, event) + 1; | ||
1578 | *error = malloc(len); | ||
1579 | if (*error) { | ||
1580 | snprintf(*error, len, "Event code %d (%s) is not a button", | ||
1581 | code, event); | ||
1582 | } | ||
1583 | return 0; | ||
1584 | } | ||
1585 | return code; | ||
1586 | } | ||
1587 | |||
1588 | uint32_t get_mouse_button(const char *name, char **error) { | ||
1589 | uint32_t button = get_mouse_bindsym(name, error); | ||
1590 | if (!button && !error) { | ||
1591 | button = get_mouse_bindcode(name, error); | ||
1592 | } | ||
1593 | return button; | ||
1594 | } | ||