From afa299c080faa3894a9940d68db61b5db87f3dc0 Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Sun, 28 Nov 2021 22:14:23 +0000 Subject: [PATCH] cursor.c: rebase cursor when exiting interactive mode cursor_rebase() sets the cursor icon and sends a motion-event to the surface below the cursor. It is made public in anticipation of using it in various view_* functions. --- include/labwc.h | 12 ++++++++++++ src/cursor.c | 24 +++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/labwc.h b/include/labwc.h index 448a5a29..3eb8338a 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -424,6 +424,18 @@ struct view *desktop_surface_and_view_at(struct server *server, double lx, struct view *desktop_view_at_cursor(struct server *server); +/** + * cursor_rebase - set cursor icon for and send motion-event to surface below it + * @seat - current seat + * @time_msec - time now + */ +void cursor_rebase(struct seat *seat, uint32_t time_msec); + +/** + * cursor_set - set cursor icon + * @seat - current seat + * @cursor_name - name of cursor, for example "left_ptr" or "grab" + */ void cursor_set(struct seat *seat, const char *cursor_name); void cursor_init(struct seat *seat); diff --git a/src/cursor.c b/src/cursor.c index e9c55559..690e0454 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -3,12 +3,32 @@ #include #include #include +#include #include "labwc.h" #include "menu/menu.h" #include "resistance.h" #include "ssd.h" #include "config/mousebind.h" -#include + +void +cursor_rebase(struct seat *seat, uint32_t time_msec) +{ + double sx, sy; + struct wlr_surface *surface; + int view_area = LAB_SSD_NONE; + + desktop_surface_and_view_at(seat->server, seat->cursor->x, + seat->cursor->y, &surface, &sx, &sy, &view_area); + + if (surface) { + wlr_seat_pointer_notify_clear_focus(seat->seat); + wlr_seat_pointer_notify_enter(seat->seat, surface, sx, sy); + wlr_seat_pointer_notify_motion(seat->seat, time_msec, sx, sy); + } else { + cursor_set(seat, "left_ptr"); + wlr_seat_pointer_notify_clear_focus(seat->seat); + } +} static void request_cursor_notify(struct wl_listener *listener, void *data) @@ -530,6 +550,7 @@ cursor_button(struct wl_listener *listener, void *data) if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH) { /* Exit interactive move/resize/menu mode. */ server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; + cursor_rebase(&server->seat, event->time_msec); return; } goto mousebindings; @@ -538,6 +559,7 @@ cursor_button(struct wl_listener *listener, void *data) if (server->input_mode == LAB_INPUT_STATE_MENU) { menu_action_selected(server, server->rootmenu); server->input_mode = LAB_INPUT_STATE_PASSTHROUGH; + cursor_rebase(&server->seat, event->time_msec); return; } -- 2.52.0