aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorTudor Brindus <me@tbrindus.ca>2020-04-25 15:07:17 -0400
committerSimon Ser <contact@emersion.fr>2020-05-02 13:32:28 +0200
commit0dc1863dce163622371dc3ffb2c6073cbda17075 (patch)
tree4f0ff981ba6b2d513acb48b355c5c79d613f6909 /sway
parent5e5e5f2ee54b7139fafe6b55efce0c276c6cc39a (diff)
input/cursor: make cursor rebasing cursor type-agnostic
This commit refactors `cursor_rebase` into `cursor_update_image`, and moves sending pointer events to the two existing call sites. This will enable this code to be reused for tablets. Refs #5232
Diffstat (limited to 'sway')
-rw-r--r--sway/input/cursor.c21
-rw-r--r--sway/input/seatop_default.c57
2 files changed, 41 insertions, 37 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index a28da999..f7a3c54e 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -212,6 +212,27 @@ void cursor_rebase_all(void) {
}
}
+void cursor_update_image(struct sway_cursor *cursor,
+ struct sway_node *node) {
+ if (node && node->type == N_CONTAINER) {
+ // Try a node's resize edge
+ enum wlr_edges edge = find_resize_edge(node->sway_container, NULL, cursor);
+ if (edge == WLR_EDGE_NONE) {
+ cursor_set_image(cursor, "left_ptr", NULL);
+ } else if (container_is_floating(node->sway_container)) {
+ cursor_set_image(cursor, wlr_xcursor_get_resize_name(edge), NULL);
+ } else {
+ if (edge & (WLR_EDGE_LEFT | WLR_EDGE_RIGHT)) {
+ cursor_set_image(cursor, "col-resize", NULL);
+ } else {
+ cursor_set_image(cursor, "row-resize", NULL);
+ }
+ }
+ } else {
+ cursor_set_image(cursor, "left_ptr", NULL);
+ }
+}
+
static void cursor_hide(struct sway_cursor *cursor) {
wlr_cursor_set_image(cursor->cursor, NULL, 0, 0, 0, 0, 0, 0);
cursor->hidden = true;
diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c
index 8513e314..d9f9e371 100644
--- a/sway/input/seatop_default.c
+++ b/sway/input/seatop_default.c
@@ -91,7 +91,7 @@ static enum wlr_edges find_edge(struct sway_container *cont,
* If the cursor is over a _resizable_ edge, return the edge.
* Edges that can't be resized are edges of the workspace.
*/
-static enum wlr_edges find_resize_edge(struct sway_container *cont,
+enum wlr_edges find_resize_edge(struct sway_container *cont,
struct wlr_surface *surface, struct sway_cursor *cursor) {
enum wlr_edges edge = find_edge(cont, surface, cursor);
if (edge && !container_is_floating(cont) && edge_is_external(cont, edge)) {
@@ -192,38 +192,6 @@ static void state_add_button(struct seatop_default_event *e, uint32_t button) {
e->pressed_button_count++;
}
-static void cursor_do_rebase(struct sway_cursor *cursor, uint32_t time_msec,
- struct sway_node *node, struct wlr_surface *surface,
- double sx, double sy) {
- struct wlr_seat *wlr_seat = cursor->seat->wlr_seat;
- if (surface) {
- if (seat_is_input_allowed(cursor->seat, surface)) {
- wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, sy);
- }
- } else if (node && node->type == N_CONTAINER) {
- // Try a node's resize edge
- enum wlr_edges edge = find_resize_edge(node->sway_container, surface, cursor);
- if (edge == WLR_EDGE_NONE) {
- cursor_set_image(cursor, "left_ptr", NULL);
- } else if (container_is_floating(node->sway_container)) {
- cursor_set_image(cursor, wlr_xcursor_get_resize_name(edge), NULL);
- } else {
- if (edge & (WLR_EDGE_LEFT | WLR_EDGE_RIGHT)) {
- cursor_set_image(cursor, "col-resize", NULL);
- } else {
- cursor_set_image(cursor, "row-resize", NULL);
- }
- }
- } else {
- cursor_set_image(cursor, "left_ptr", NULL);
- }
-
- if (surface == NULL) {
- wlr_seat_pointer_notify_enter(wlr_seat, NULL, 0, 0);
- wlr_seat_pointer_clear_focus(wlr_seat);
- }
-}
-
/*----------------------------------\
* Functions used by handle_button /
*--------------------------------*/
@@ -483,9 +451,15 @@ static void handle_motion(struct sway_seat *seat, uint32_t time_msec,
check_focus_follows_mouse(seat, e, node);
}
- cursor_do_rebase(cursor, time_msec, node, surface, sx, sy);
- if (surface && seat_is_input_allowed(cursor->seat, surface)) {
- wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy);
+ if (surface) {
+ if (seat_is_input_allowed(seat, surface)) {
+ wlr_seat_pointer_notify_enter(seat->wlr_seat, surface, sx, sy);
+ wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy);
+ }
+ } else {
+ cursor_update_image(cursor, node);
+ wlr_seat_pointer_notify_enter(seat->wlr_seat, NULL, 0, 0);
+ wlr_seat_pointer_clear_focus(seat->wlr_seat);
}
struct sway_drag_icon *drag_icon;
@@ -622,7 +596,16 @@ static void handle_rebase(struct sway_seat *seat, uint32_t time_msec) {
double sx = 0.0, sy = 0.0;
e->previous_node = node_at_coords(seat,
cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
- cursor_do_rebase(cursor, time_msec, e->previous_node, surface, sx, sy);
+
+ if (surface) {
+ if (seat_is_input_allowed(seat, surface)) {
+ wlr_seat_pointer_notify_enter(seat->wlr_seat, surface, sx, sy);
+ }
+ } else {
+ cursor_update_image(cursor, e->previous_node);
+ wlr_seat_pointer_notify_enter(seat->wlr_seat, NULL, 0, 0);
+ wlr_seat_pointer_clear_focus(seat->wlr_seat);
+ }
}
static const struct sway_seatop_impl seatop_impl = {