ecore_evas: add API for finding out if event is used
Summary: ecore_x_dnd_send_status can be used to indicate if a item can be dropped on a client or not. However, we should only indicate that this can be dropped, if there is a object we signaled that a drop is in. Long story short: there is no assertion that after indicating that things can be dropped, that a notify for the data is sent. A drag implementation should always listen to a mouse up event, and abort the drag if no further operations are sent. Depends on D11698 Reviewers: zmike, stefan_schmidt, raster Reviewed By: zmike Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11699
This commit is contained in:
parent
f2ed538d41
commit
0a2db329c8
|
@ -5699,6 +5699,7 @@ ecore_evas_callback_drop_drop_set(Ecore_Evas *ee, Ecore_Evas_Drop_Cb cb)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Eina_Array *available_mime_types;
|
Eina_Array *available_mime_types;
|
||||||
Eina_Position2D pos;
|
Eina_Position2D pos;
|
||||||
|
Eina_Bool last_motion_was_used;
|
||||||
} Ecore_Evas_Active_Dnd;
|
} Ecore_Evas_Active_Dnd;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -5734,18 +5735,34 @@ ecore_evas_dnd_enter(Ecore_Evas *ee, unsigned int seat, Eina_Iterator *available
|
||||||
ee->func.fn_dnd_state_change(ee, seat, pos, EINA_TRUE);
|
ee->func.fn_dnd_state_change(ee, seat, pos, EINA_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI Eina_Bool
|
||||||
ecore_evas_dnd_position_set(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos)
|
ecore_evas_dnd_position_set(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos)
|
||||||
{
|
{
|
||||||
Ecore_Evas_Active_Dnd *dnd;
|
Ecore_Evas_Active_Dnd *dnd;
|
||||||
|
|
||||||
|
ECORE_EVAS_CHECK_GOTO(ee, err);
|
||||||
|
EINA_SAFETY_ON_NULL_GOTO(ee->active_drags, err);
|
||||||
|
dnd = eina_hash_find(ee->active_drags, &seat);
|
||||||
|
EINA_SAFETY_ON_NULL_GOTO(dnd, err);
|
||||||
|
dnd->pos = pos;
|
||||||
|
dnd->last_motion_was_used = EINA_FALSE;
|
||||||
|
if (ee->func.fn_dnd_motion)
|
||||||
|
ee->func.fn_dnd_motion(ee, seat, pos);
|
||||||
|
return dnd->last_motion_was_used;
|
||||||
|
err:
|
||||||
|
return EINA_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
ecore_evas_dnd_mark_motion_used(Ecore_Evas *ee, unsigned int seat)
|
||||||
|
{
|
||||||
|
Ecore_Evas_Active_Dnd *dnd;
|
||||||
|
|
||||||
ECORE_EVAS_CHECK(ee);
|
ECORE_EVAS_CHECK(ee);
|
||||||
EINA_SAFETY_ON_NULL_RETURN(ee->active_drags);
|
EINA_SAFETY_ON_NULL_RETURN(ee->active_drags);
|
||||||
dnd = eina_hash_find(ee->active_drags, &seat);
|
dnd = eina_hash_find(ee->active_drags, &seat);
|
||||||
EINA_SAFETY_ON_NULL_RETURN(dnd);
|
EINA_SAFETY_ON_NULL_RETURN(dnd);
|
||||||
dnd->pos = pos;
|
dnd->last_motion_was_used = EINA_TRUE;
|
||||||
if (ee->func.fn_dnd_motion)
|
|
||||||
ee->func.fn_dnd_motion(ee, seat, pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
|
|
@ -522,8 +522,8 @@ EAPI Eina_Bool ecore_evas_render(Ecore_Evas *ee);
|
||||||
|
|
||||||
EAPI Evas *ecore_evas_evas_new(Ecore_Evas *ee, int w, int h);
|
EAPI Evas *ecore_evas_evas_new(Ecore_Evas *ee, int w, int h);
|
||||||
EAPI void ecore_evas_done(Ecore_Evas *ee, Eina_Bool single_window);
|
EAPI void ecore_evas_done(Ecore_Evas *ee, Eina_Bool single_window);
|
||||||
|
EAPI void ecore_evas_dnd_mark_motion_used(Ecore_Evas *ee, unsigned int seat);
|
||||||
EAPI void ecore_evas_dnd_position_set(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos);
|
EAPI Eina_Bool ecore_evas_dnd_position_set(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos);
|
||||||
EAPI void ecore_evas_dnd_leave(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos);
|
EAPI void ecore_evas_dnd_leave(Ecore_Evas *ee, unsigned int seat, Eina_Position2D pos);
|
||||||
EAPI void ecore_evas_dnd_enter(Ecore_Evas *ee, unsigned int seat, Eina_Iterator *available_types, Eina_Position2D pos);
|
EAPI void ecore_evas_dnd_enter(Ecore_Evas *ee, unsigned int seat, Eina_Iterator *available_types, Eina_Position2D pos);
|
||||||
EAPI Eina_Position2D ecore_evas_dnd_pos_get(Ecore_Evas *ee, unsigned int seat);
|
EAPI Eina_Position2D ecore_evas_dnd_pos_get(Ecore_Evas *ee, unsigned int seat);
|
||||||
|
|
|
@ -9268,15 +9268,18 @@ _motion_cb(Ecore_Evas *ee, unsigned int seat, Eina_Position2D p)
|
||||||
{
|
{
|
||||||
target->currently_inside = EINA_FALSE;
|
target->currently_inside = EINA_FALSE;
|
||||||
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_LEFT, &ev);
|
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_LEFT, &ev);
|
||||||
|
ecore_evas_dnd_mark_motion_used(ee, seat);
|
||||||
}
|
}
|
||||||
else if (!target->currently_inside && inside)
|
else if (!target->currently_inside && inside)
|
||||||
{
|
{
|
||||||
target->currently_inside = EINA_TRUE;
|
target->currently_inside = EINA_TRUE;
|
||||||
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_ENTERED, &ev);
|
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_ENTERED, &ev);
|
||||||
|
ecore_evas_dnd_mark_motion_used(ee, seat);
|
||||||
}
|
}
|
||||||
else if (target->currently_inside && inside)
|
else if (target->currently_inside && inside)
|
||||||
{
|
{
|
||||||
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_POSITION_CHANGED, &ev);
|
efl_event_callback_call(target->obj, EFL_UI_DND_EVENT_DROP_POSITION_CHANGED, &ev);
|
||||||
|
ecore_evas_dnd_mark_motion_used(ee, seat);
|
||||||
}
|
}
|
||||||
eina_accessor_free(ev.available_types);
|
eina_accessor_free(ev.available_types);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4185,8 +4185,9 @@ _ecore_evas_x_dnd_position(void *udata EINA_UNUSED, int type EINA_UNUSED, void *
|
||||||
ee = ecore_event_window_match(pos->win);
|
ee = ecore_event_window_match(pos->win);
|
||||||
EINA_SAFETY_ON_NULL_GOTO(ee, end);
|
EINA_SAFETY_ON_NULL_GOTO(ee, end);
|
||||||
ecore_evas_geometry_get(ee, &x, &y, &w, &h);
|
ecore_evas_geometry_get(ee, &x, &y, &w, &h);
|
||||||
ecore_evas_dnd_position_set(ee, 1, EINA_POSITION2D(pos->position.x - x, pos->position.y - y));
|
Eina_Bool used = ecore_evas_dnd_position_set(ee, 1, EINA_POSITION2D(pos->position.x - x, pos->position.y - y));
|
||||||
ecore_x_dnd_send_status(EINA_TRUE, EINA_FALSE, (Ecore_X_Rectangle){x,y,w,h}, pos->action);
|
if (used)
|
||||||
|
ecore_x_dnd_send_status(EINA_TRUE, EINA_FALSE, (Ecore_X_Rectangle){x,y,w,h}, pos->action);
|
||||||
end:
|
end:
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue