e_comp_wl: Use drag pointer position as ecore event instead of seat.ptr 00/302100/1
authorJunseok Kim <juns.kim@samsung.com>
Thu, 30 Nov 2023 02:31:58 +0000 (11:31 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 30 Nov 2023 08:11:14 +0000 (17:11 +0900)
There was a bug that drag_data_enter/leave is abnormal when using input generator.
The input generator generates virtual pointer as Ecore event.
But the drag function uses seat.ptr to get client that under pointer.
For such a reason, mismatch occured between cursor position and data_device_enter/leave.

For fix this issue, use drag pointer position as the Ecore event.

Change-Id: Ida46a8d61bf22fc748ed1540f0d2c47a57abb23a

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

index 75e1737..211eac3 100644 (file)
@@ -1735,6 +1735,7 @@ _e_client_under_pointer_helper_ignore_client(E_Desk *desk, E_Client *client)
    if (e_client_util_ignored_get(client) || (!e_desk_has_ec(desk, client))) return EINA_TRUE;
    if (!evas_object_visible_get(client->frame)) return EINA_TRUE;
    if (e_policy_client_is_cursor(client)) return EINA_TRUE;
+   if (e_comp_wl->drag_client == client) return EINA_TRUE;
 
    return EINA_FALSE;
 }
index 64e583a..a0047c7 100644 (file)
@@ -2541,7 +2541,7 @@ _e_comp_wl_cb_mouse_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mou
              return ECORE_CALLBACK_RENEW;
           }
 
-        ec = e_client_input_rect_under_pointer_get(legacy_target->desk, e_comp_wl->drag_client);
+        ec = e_client_under_position_input_get(legacy_target->desk, ev->x, ev->y);
         EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_RENEW);
 
         struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
index 5ffaa4a..9a1e3cb 100644 (file)
@@ -970,7 +970,7 @@ _e_comp_wl_data_device_cb_drag_start(struct wl_client *client, struct wl_resourc
    e_drag_start(e_comp_wl->drag, x, y);
 
    desk = e_desk_current_get(e_comp_zone_find_by_ec(ec));
-   ec_under_pointer = e_client_input_rect_under_pointer_get(desk, e_comp_wl->drag_client);
+   ec_under_pointer = e_client_under_position_input_get(desk, x, y);
    if (ec_under_pointer)
      e_comp_wl_data_device_send_enter(ec_under_pointer);