sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 70d9dc0b9ee9639011604a35b38b8ea03983e952
parent 1b88eaee6b14987c585fcf149cc26f665c584d77
Author: Drew DeVault <sir@cmpwn.com>
Date:   Fri, 30 Mar 2018 19:08:39 -0400

Merge pull request #1660 from emersion/client-cursors

Handle set_cursor requests from clients
Diffstat:
Minclude/sway/input/cursor.h | 1+
Msway/input/cursor.c | 31++++++++++++++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/include/sway/input/cursor.h b/include/sway/input/cursor.h @@ -9,6 +9,7 @@ struct sway_cursor { struct wlr_xcursor_manager *xcursor_manager; double x, y; + struct wl_client *image_client; struct wl_listener motion; struct wl_listener motion_absolute; diff --git a/sway/input/cursor.c b/sway/input/cursor.c @@ -81,6 +81,18 @@ static void cursor_send_pointer_motion(struct sway_cursor *cursor, struct sway_container *cont = container_at_cursor(cursor, &surface, &sx, &sy); + // reset cursor if switching between clients + struct wl_client *client = NULL; + if (surface != NULL) { + client = wl_resource_get_client(surface->resource); + } + if (client != cursor->image_client) { + wlr_xcursor_manager_set_cursor_image(cursor->xcursor_manager, + "left_ptr", cursor->cursor); + cursor->image_client = client; + } + + // send pointer enter/leave if (cont != NULL && surface != NULL) { wlr_seat_pointer_notify_enter(seat, surface, sx, sy); wlr_seat_pointer_notify_motion(seat, time, sx, sy); @@ -167,7 +179,24 @@ static void handle_request_set_cursor(struct wl_listener *listener, struct sway_cursor *cursor = wl_container_of(listener, cursor, request_set_cursor); struct wlr_seat_pointer_request_set_cursor_event *event = data; - wlr_log(L_DEBUG, "TODO: handle request set cursor event: %p", event); + + struct wl_client *focused_client = NULL; + struct wlr_surface *focused_surface = + cursor->seat->wlr_seat->pointer_state.focused_surface; + if (focused_surface != NULL) { + focused_client = wl_resource_get_client(focused_surface->resource); + } + + // TODO: check cursor mode + if (focused_client == NULL || + event->seat_client->client != focused_client) { + wlr_log(L_DEBUG, "denying request to set cursor from unfocused client"); + return; + } + + wlr_cursor_set_surface(cursor->cursor, event->surface, event->hotspot_x, + event->hotspot_y); + cursor->image_client = focused_client; } void sway_cursor_destroy(struct sway_cursor *cursor) {