diff options
Diffstat (limited to 'sway/input/cursor.c')
-rw-r--r-- | sway/input/cursor.c | 59 |
1 files changed, 53 insertions, 6 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c index ad9b9835..444fe81d 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c | |||
@@ -1,5 +1,6 @@ | |||
1 | #define _POSIX_C_SOURCE 200809L | 1 | #define _POSIX_C_SOURCE 200809L |
2 | #include <math.h> | 2 | #include <math.h> |
3 | #include <libevdev/libevdev.h> | ||
3 | #ifdef __linux__ | 4 | #ifdef __linux__ |
4 | #include <linux/input-event-codes.h> | 5 | #include <linux/input-event-codes.h> |
5 | #elif __FreeBSD__ | 6 | #elif __FreeBSD__ |
@@ -982,6 +983,18 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) { | |||
982 | transaction_commit_dirty(); | 983 | transaction_commit_dirty(); |
983 | } | 984 | } |
984 | 985 | ||
986 | static uint32_t wl_axis_to_button(struct wlr_event_pointer_axis *event) { | ||
987 | switch (event->orientation) { | ||
988 | case WLR_AXIS_ORIENTATION_VERTICAL: | ||
989 | return event->delta < 0 ? SWAY_SCROLL_UP : SWAY_SCROLL_DOWN; | ||
990 | case WLR_AXIS_ORIENTATION_HORIZONTAL: | ||
991 | return event->delta < 0 ? SWAY_SCROLL_LEFT : SWAY_SCROLL_RIGHT; | ||
992 | default: | ||
993 | wlr_log(WLR_DEBUG, "Unknown axis orientation"); | ||
994 | return 0; | ||
995 | } | ||
996 | } | ||
997 | |||
985 | static void dispatch_cursor_axis(struct sway_cursor *cursor, | 998 | static void dispatch_cursor_axis(struct sway_cursor *cursor, |
986 | struct wlr_event_pointer_axis *event) { | 999 | struct wlr_event_pointer_axis *event) { |
987 | struct sway_seat *seat = cursor->seat; | 1000 | struct sway_seat *seat = cursor->seat; |
@@ -998,11 +1011,32 @@ static void dispatch_cursor_axis(struct sway_cursor *cursor, | |||
998 | enum wlr_edges edge = cont ? find_edge(cont, cursor) : WLR_EDGE_NONE; | 1011 | enum wlr_edges edge = cont ? find_edge(cont, cursor) : WLR_EDGE_NONE; |
999 | bool on_border = edge != WLR_EDGE_NONE; | 1012 | bool on_border = edge != WLR_EDGE_NONE; |
1000 | bool on_titlebar = cont && !on_border && !surface; | 1013 | bool on_titlebar = cont && !on_border && !surface; |
1014 | bool on_contents = cont && !on_border && surface; | ||
1001 | float scroll_factor = | 1015 | float scroll_factor = |
1002 | (ic == NULL || ic->scroll_factor == FLT_MIN) ? 1.0f : ic->scroll_factor; | 1016 | (ic == NULL || ic->scroll_factor == FLT_MIN) ? 1.0f : ic->scroll_factor; |
1003 | 1017 | ||
1004 | // Scrolling on a tabbed or stacked title bar | 1018 | bool handled = false; |
1005 | if (on_titlebar) { | 1019 | |
1020 | // Gather information needed for mouse bindings | ||
1021 | struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->wlr_seat); | ||
1022 | uint32_t modifiers = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; | ||
1023 | struct wlr_input_device *device = input_device->wlr_device; | ||
1024 | char *dev_id = device ? input_device_get_identifier(device) : strdup("*"); | ||
1025 | uint32_t button = wl_axis_to_button(event); | ||
1026 | |||
1027 | // Handle mouse bindings - x11 mouse buttons 4-7 - press event | ||
1028 | struct sway_binding *binding = NULL; | ||
1029 | state_add_button(cursor, button); | ||
1030 | binding = get_active_mouse_binding(cursor, | ||
1031 | config->current_mode->mouse_bindings, modifiers, false, | ||
1032 | on_titlebar, on_border, on_contents, dev_id); | ||
1033 | if (binding) { | ||
1034 | seat_execute_command(seat, binding); | ||
1035 | handled = true; | ||
1036 | } | ||
1037 | |||
1038 | // Scrolling on a tabbed or stacked title bar (handled as press event) | ||
1039 | if (!handled && on_titlebar) { | ||
1006 | enum sway_container_layout layout = container_parent_layout(cont); | 1040 | enum sway_container_layout layout = container_parent_layout(cont); |
1007 | if (layout == L_TABBED || layout == L_STACKED) { | 1041 | if (layout == L_TABBED || layout == L_STACKED) { |
1008 | struct sway_node *tabcontainer = node_get_parent(node); | 1042 | struct sway_node *tabcontainer = node_get_parent(node); |
@@ -1029,13 +1063,26 @@ static void dispatch_cursor_axis(struct sway_cursor *cursor, | |||
1029 | seat_set_raw_focus(seat, new_focus); | 1063 | seat_set_raw_focus(seat, new_focus); |
1030 | seat_set_raw_focus(seat, old_focus); | 1064 | seat_set_raw_focus(seat, old_focus); |
1031 | } | 1065 | } |
1032 | return; | 1066 | handled = true; |
1033 | } | 1067 | } |
1034 | } | 1068 | } |
1035 | 1069 | ||
1036 | wlr_seat_pointer_notify_axis(cursor->seat->wlr_seat, event->time_msec, | 1070 | // Handle mouse bindings - x11 mouse buttons 4-7 - release event |
1037 | event->orientation, scroll_factor * event->delta, | 1071 | binding = get_active_mouse_binding(cursor, |
1038 | round(scroll_factor * event->delta_discrete), event->source); | 1072 | config->current_mode->mouse_bindings, modifiers, true, |
1073 | on_titlebar, on_border, on_contents, dev_id); | ||
1074 | state_erase_button(cursor, button); | ||
1075 | if (binding) { | ||
1076 | seat_execute_command(seat, binding); | ||
1077 | handled = true; | ||
1078 | } | ||
1079 | free(dev_id); | ||
1080 | |||
1081 | if (!handled) { | ||
1082 | wlr_seat_pointer_notify_axis(cursor->seat->wlr_seat, event->time_msec, | ||
1083 | event->orientation, scroll_factor * event->delta, | ||
1084 | round(scroll_factor * event->delta_discrete), event->source); | ||
1085 | } | ||
1039 | } | 1086 | } |
1040 | 1087 | ||
1041 | static void handle_cursor_axis(struct wl_listener *listener, void *data) { | 1088 | static void handle_cursor_axis(struct wl_listener *listener, void *data) { |