aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/seatop_default.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/seatop_default.c')
-rw-r--r--sway/input/seatop_default.c57
1 files changed, 20 insertions, 37 deletions
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,
91 * If the cursor is over a _resizable_ edge, return the edge. 91 * If the cursor is over a _resizable_ edge, return the edge.
92 * Edges that can't be resized are edges of the workspace. 92 * Edges that can't be resized are edges of the workspace.
93 */ 93 */
94static enum wlr_edges find_resize_edge(struct sway_container *cont, 94enum wlr_edges find_resize_edge(struct sway_container *cont,
95 struct wlr_surface *surface, struct sway_cursor *cursor) { 95 struct wlr_surface *surface, struct sway_cursor *cursor) {
96 enum wlr_edges edge = find_edge(cont, surface, cursor); 96 enum wlr_edges edge = find_edge(cont, surface, cursor);
97 if (edge && !container_is_floating(cont) && edge_is_external(cont, edge)) { 97 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) {
192 e->pressed_button_count++; 192 e->pressed_button_count++;
193} 193}
194 194
195static void cursor_do_rebase(struct sway_cursor *cursor, uint32_t time_msec,
196 struct sway_node *node, struct wlr_surface *surface,
197 double sx, double sy) {
198 struct wlr_seat *wlr_seat = cursor->seat->wlr_seat;
199 if (surface) {
200 if (seat_is_input_allowed(cursor->seat, surface)) {
201 wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, sy);
202 }
203 } else if (node && node->type == N_CONTAINER) {
204 // Try a node's resize edge
205 enum wlr_edges edge = find_resize_edge(node->sway_container, surface, cursor);
206 if (edge == WLR_EDGE_NONE) {
207 cursor_set_image(cursor, "left_ptr", NULL);
208 } else if (container_is_floating(node->sway_container)) {
209 cursor_set_image(cursor, wlr_xcursor_get_resize_name(edge), NULL);
210 } else {
211 if (edge & (WLR_EDGE_LEFT | WLR_EDGE_RIGHT)) {
212 cursor_set_image(cursor, "col-resize", NULL);
213 } else {
214 cursor_set_image(cursor, "row-resize", NULL);
215 }
216 }
217 } else {
218 cursor_set_image(cursor, "left_ptr", NULL);
219 }
220
221 if (surface == NULL) {
222 wlr_seat_pointer_notify_enter(wlr_seat, NULL, 0, 0);
223 wlr_seat_pointer_clear_focus(wlr_seat);
224 }
225}
226
227/*----------------------------------\ 195/*----------------------------------\
228 * Functions used by handle_button / 196 * Functions used by handle_button /
229 *--------------------------------*/ 197 *--------------------------------*/
@@ -483,9 +451,15 @@ static void handle_motion(struct sway_seat *seat, uint32_t time_msec,
483 check_focus_follows_mouse(seat, e, node); 451 check_focus_follows_mouse(seat, e, node);
484 } 452 }
485 453
486 cursor_do_rebase(cursor, time_msec, node, surface, sx, sy); 454 if (surface) {
487 if (surface && seat_is_input_allowed(cursor->seat, surface)) { 455 if (seat_is_input_allowed(seat, surface)) {
488 wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy); 456 wlr_seat_pointer_notify_enter(seat->wlr_seat, surface, sx, sy);
457 wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy);
458 }
459 } else {
460 cursor_update_image(cursor, node);
461 wlr_seat_pointer_notify_enter(seat->wlr_seat, NULL, 0, 0);
462 wlr_seat_pointer_clear_focus(seat->wlr_seat);
489 } 463 }
490 464
491 struct sway_drag_icon *drag_icon; 465 struct sway_drag_icon *drag_icon;
@@ -622,7 +596,16 @@ static void handle_rebase(struct sway_seat *seat, uint32_t time_msec) {
622 double sx = 0.0, sy = 0.0; 596 double sx = 0.0, sy = 0.0;
623 e->previous_node = node_at_coords(seat, 597 e->previous_node = node_at_coords(seat,
624 cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); 598 cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
625 cursor_do_rebase(cursor, time_msec, e->previous_node, surface, sx, sy); 599
600 if (surface) {
601 if (seat_is_input_allowed(seat, surface)) {
602 wlr_seat_pointer_notify_enter(seat->wlr_seat, surface, sx, sy);
603 }
604 } else {
605 cursor_update_image(cursor, e->previous_node);
606 wlr_seat_pointer_notify_enter(seat->wlr_seat, NULL, 0, 0);
607 wlr_seat_pointer_clear_focus(seat->wlr_seat);
608 }
626} 609}
627 610
628static const struct sway_seatop_impl seatop_impl = { 611static const struct sway_seatop_impl seatop_impl = {