* (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;
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;
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;
{
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);