data_device, tinyds: Handle focus at data_device when a drag starts 18/280018/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 17 Aug 2022 04:40:50 +0000 (13:40 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 22 Aug 2022 09:08:16 +0000 (18:08 +0900)
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
src/data_device/drag.c

index 40f996d..91f2965 100644 (file)
@@ -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);
     }
 }
 
index fc99c13..066e93e 100644 (file)
@@ -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);
 }