e_comp_wl: send wl_data_device_enter when cursor enter to offer 94/270094/1
authorJunseok, Kim <juns.kim@samsung.com>
Wed, 5 Jan 2022 04:12:38 +0000 (13:12 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Tue, 25 Jan 2022 10:01:17 +0000 (19:01 +0900)
There was a bug that wl_data_device.enter didn't sended to offer client except source client.
It is continued untill the user release their pointer. and It makes the offer client didn't notice cursor entered until drag-and-drop performed.
For fix this problem, check the window that below cursor and send wl_data_device.enter/leave when during the drag performed.

Change-Id: Id5e8902e07371570cc97f0583b3e9b1403be1fa1

src/bin/e_client.c
src/bin/e_comp_wl.c

index 1e0a51922970ecc99e24a3f1039212100055a7d1..fc09b392f32276d13da935e04813b5a4f3f90243 100644 (file)
@@ -1996,6 +1996,7 @@ _e_client_under_pointer_helper(E_Desk *desk, E_Client *exclude, int x, int y)
          * (because it will be closed shortly for example), skip */
         if (e_client_util_ignored_get(cec) || (!e_client_util_desk_visible(cec, desk))) continue;
         if (!evas_object_visible_get(cec->frame)) continue;
+        if (e_policy_client_is_cursor(cec)) continue;
         if ((exclude) && (cec == exclude)) continue;
         if (!E_INSIDE(x, y, cec->x, cec->y, cec->w, cec->h))
           continue;
index f47ad726e8f98865d1d0ba6e6940aaa721bad2b3..d2185a0c3eb8992cf439a451883b9dbe8ab2fff4 100644 (file)
@@ -1071,11 +1071,11 @@ _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
    ev = event;
    if (!(ec = data)) return;
    if (e_object_is_del(E_OBJECT(ec))) return;
-
    if (!ec->comp_data || !ec->comp_data->surface) return;
 
    e_comp_wl->ptr.ec = ec;
-   if (e_comp_wl->drag)
+   if (e_comp_wl->drag &&
+       e_comp_wl->selection.target != ec)
      {
         e_comp_wl_data_device_send_enter(ec);
         return;
@@ -1141,7 +1141,8 @@ _e_comp_wl_evas_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
 
    if (!ec->comp_data || !ec->comp_data->surface) return;
 
-   if (e_comp_wl->drag)
+   if (e_comp_wl->drag &&
+       e_comp_wl->selection.target == ec)
      {
         e_comp_wl_data_device_send_leave(ec);
         return;
@@ -2199,12 +2200,23 @@ _e_comp_wl_cb_mouse_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mou
      {
         struct wl_resource *res;
         int x, y;
+        E_Client *ec = NULL;
+        E_Client *legacy_target = e_comp_wl->selection.target;
 
-        res = e_comp_wl_data_find_for_client(wl_resource_get_client(e_comp_wl->selection.target->comp_data->surface));
+        ec = e_client_under_pointer_get(legacy_target->desk, e_comp_wl->drag_client);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_RENEW);
+        res = e_comp_wl_data_find_for_client(wl_resource_get_client(ec->comp_data->surface));
         EINA_SAFETY_ON_NULL_RETURN_VAL(res, ECORE_CALLBACK_RENEW);
 
-        x = ev->x - e_comp_wl->selection.target->client.x;
-        y = ev->y - e_comp_wl->selection.target->client.y;
+        if ((e_comp_wl->drag_offer != wl_resource_get_user_data(res)) &&
+            (ec != legacy_target))
+          {
+             e_comp_wl_data_device_send_leave(legacy_target);
+             e_comp_wl_data_device_send_enter(ec);
+          }
+
+        x = ev->x - ec->client.x;
+        y = ev->y - ec->client.y;
 
         if (e_comp_wl->drag_client)
           evas_object_move(e_comp_wl->drag_client->frame, ev->x, ev->y);