From 72256990fcfd025566f7fd7d441fced25b33f769 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Wed, 17 Aug 2022 13:40:50 +0900 Subject: [PATCH] data_device, tinyds: Handle focus at data_device when a drag starts This reverts commit "a0b0f5148126278f3a3a9f1770cc746222f97a3, "tinyds: Call ds_seat_pointer_notify_enter() before notify_motion()". Plus, ds_seat_pointer_notify_enter() is called by drag implementation. Change-Id: Ib648df2f45c8274956bbc3ab557ba506002a3a91 --- examples/tinyds.c | 26 +++++++++++++++----------- src/data_device/drag.c | 8 ++++++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/examples/tinyds.c b/examples/tinyds.c index 40f996d..91f2965 100644 --- a/examples/tinyds.c +++ b/examples/tinyds.c @@ -1005,20 +1005,24 @@ pointer_handle_motion_absolute(struct wl_listener *listener, void *data) pointer->y = event->y * OUTPUT_HEIGHT; view = server_view_at(pointer->server, pointer->x, pointer->y, &sx, &sy); - if (view) { - ds_dbg("Set pointer focus to view(%p)", view); - ds_seat_pointer_notify_enter(pointer->server->seat, - ds_xdg_surface_get_surface(view->xdg_surface), sx, sy); - ds_seat_pointer_notify_motion(pointer->server->seat, event->time_msec, - sx, sy); - pointer->focused_view = view; + if (pointer->focused_view != view) { + if (pointer->focused_view) { + ds_dbg("Clear pointer focus from view(%p)", pointer->focused_view); + ds_seat_pointer_notify_clear_focus(pointer->server->seat); + pointer->focused_view = NULL; + } + if (view) { + ds_dbg("Set pointer focus to view(%p)", view); + ds_seat_pointer_notify_enter(pointer->server->seat, + ds_xdg_surface_get_surface(view->xdg_surface), sx, sy); + pointer->focused_view = view; + } } - else { - ds_dbg("Clear pointer focus from view(%p)", pointer->focused_view); - ds_seat_pointer_notify_clear_focus(pointer->server->seat); - pointer->focused_view = NULL; + if (view) { + ds_seat_pointer_notify_motion(pointer->server->seat, + event->time_msec, sx, sy); } } diff --git a/src/data_device/drag.c b/src/data_device/drag.c index fc99c13..066e93e 100644 --- a/src/data_device/drag.c +++ b/src/data_device/drag.c @@ -34,11 +34,19 @@ ds_drag_destroy(struct ds_drag *drag) WL_EXPORT void ds_drag_start_pointer_drag(struct ds_drag *drag, uint32_t serial) { + struct ds_surface *surface; + double sy, sx; + drag->grab_type = DS_DRAG_GRAB_KEYBOARD_POINTER; + surface = ds_seat_pointer_get_focused_surface(drag->seat, &sx, &sy); + ds_seat_pointer_clear_focus(drag->seat); ds_seat_pointer_start_grab(drag->seat, &drag->pointer_grab); + if (surface) + ds_seat_pointer_notify_enter(drag->seat, surface, sx, sy); + drag_start(drag, serial); } -- 2.7.4