evas: Re-fix post-event cb by supporting recursion

The previous patch (b184874fa5) was preventing
post-event callbacks from triggering any form of input event,
including side-effects due to mouse,in. In fact by tracking
which exact events we want to post-process we can support
proper recursion. This fixes crashes in Bryce.

I'm not changing the documentation as this is still a dubious
code design.

Fixes T3144
Fixes T5157
This commit is contained in:
Jean-Philippe Andre 2017-02-16 19:34:08 +09:00
parent b184874fa5
commit 54e5841b2f
6 changed files with 108 additions and 70 deletions

View File

@ -222,19 +222,20 @@ _eo_evas_cb(void *data, const Efl_Event *event)
} }
void void
_evas_post_event_callback_call(Evas *eo_e, Evas_Public_Data *e) _evas_post_event_callback_call(Evas *eo_e, Evas_Public_Data *e, int min_event_id)
{ {
Evas_Post_Callback *pc; Evas_Post_Callback *pc;
Eina_List *l, *l_next; Eina_List *l, *l_next;
int skip = 0; int skip = 0;
if (e->delete_me || e->running_post_events) return; if (e->delete_me) return;
if (!e->post_events) return; if (!e->post_events) return;
_evas_walk(e); _evas_walk(e);
e->running_post_events = EINA_TRUE; e->running_post_events++;
EINA_LIST_FOREACH_SAFE(e->post_events, l, l_next, pc) EINA_LIST_FOREACH_SAFE(e->post_events, l, l_next, pc)
{ {
if ((unsigned int) pc->event_id < (unsigned int) min_event_id) break;
e->post_events = eina_list_remove_list(e->post_events, l); e->post_events = eina_list_remove_list(e->post_events, l);
if ((!skip) && (!e->delete_me) && (!pc->delete_me)) if ((!skip) && (!e->delete_me) && (!pc->delete_me))
{ {
@ -242,8 +243,14 @@ _evas_post_event_callback_call(Evas *eo_e, Evas_Public_Data *e)
} }
EVAS_MEMPOOL_FREE(_mp_pc, pc); EVAS_MEMPOOL_FREE(_mp_pc, pc);
} }
e->running_post_events = EINA_FALSE; e->running_post_events--;
_evas_unwalk(e); _evas_unwalk(e);
if (!e->running_post_events && e->post_events)
{
WRN("Not all post-event callbacks hve been processed!");
_evas_post_event_callback_call(eo_e, e, 0);
}
} }
void void
@ -609,6 +616,8 @@ evas_post_event_callback_push(Evas *eo_e, Evas_Object_Event_Post_Cb func, const
pc->func = func; pc->func = func;
pc->data = data; pc->data = data;
pc->type = e->current_event;
pc->event_id = _evas_event_counter;
e->post_events = eina_list_prepend(e->post_events, pc); e->post_events = eina_list_prepend(e->post_events, pc);
} }

View File

@ -30,16 +30,14 @@ static void
_canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y, _canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y,
unsigned int timestamp, const void *data); unsigned int timestamp, const void *data);
static inline Eina_Bool static inline void
_evas_event_feed_allow(Evas_Public_Data *e) _evas_event_feed_check(Evas_Public_Data *e)
{ {
if (EINA_LIKELY(!e->running_post_events)) return EINA_TRUE; if (EINA_LIKELY(!e->running_post_events)) return;
ERR("Can not feed input events while running post-event callbacks!"); DBG("Feeding new input events from a post-event callback is risky!");
return EINA_FALSE;
} }
#define EVAS_EVENT_FEED_SAFETY_CHECK(evas, ...) do { \ #define EVAS_EVENT_FEED_SAFETY_CHECK(evas) _evas_event_feed_check(evas)
if (!_evas_event_feed_allow(evas)) return __VA_ARGS__; } while (0)
static void static void
_evas_event_havemap_adjust_f(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Vector2 *point, Eina_Bool mouse_grabbed) _evas_event_havemap_adjust_f(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Vector2 *point, Eina_Bool mouse_grabbed)
@ -1500,7 +1498,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
} }
if (copy) eina_list_free(copy); if (copy) eina_list_free(copy);
e->last_mouse_down_counter++; e->last_mouse_down_counter++;
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
/* update touch point's state to EVAS_TOUCH_POINT_STILL */ /* update touch point's state to EVAS_TOUCH_POINT_STILL */
_evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_STILL); _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_STILL);
_evas_unwalk(e); _evas_unwalk(e);
@ -1508,7 +1506,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (ev->device) efl_unref(ev->device); if (ev->device) efl_unref(ev->device);
} }
static int static void
_post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
Evas_Pointer_Data *pdata) Evas_Pointer_Data *pdata)
{ {
@ -1517,14 +1515,13 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
Efl_Input_Pointer *evt; Efl_Input_Pointer *evt;
Evas_Object *eo_obj; Evas_Object *eo_obj;
Evas *eo_e = e->evas; Evas *eo_e = e->evas;
int post_called = 0;
Evas_Object_Pointer_Data *obj_pdata; Evas_Object_Pointer_Data *obj_pdata;
int event_id; int event_id;
/* Duplicating UP event */ /* Duplicating UP event */
evt = efl_input_dup(parent_ev); evt = efl_input_dup(parent_ev);
ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS); ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
if (!ev) return 0; if (!ev) return;
event_id = _evas_object_event_new(); event_id = _evas_object_event_new();
@ -1562,7 +1559,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
} }
} }
} }
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
eina_list_free(copy); eina_list_free(copy);
@ -1599,8 +1596,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
if (e->delete_me) break; if (e->delete_me) break;
} }
} }
post_called = 1; _evas_post_event_callback_call(eo_e, e, event_id);
_evas_post_event_callback_call(eo_e, e);
} }
else else
{ {
@ -1623,8 +1619,6 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
_evas_canvas_event_pointer_move_event_dispatch(e, pdata, ev->data); _evas_canvas_event_pointer_move_event_dispatch(e, pdata, ev->data);
efl_del(evt); efl_del(evt);
return post_called;
} }
static void static void
@ -1721,7 +1715,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
} }
eina_list_free(copy); eina_list_free(copy);
e->last_mouse_up_counter++; e->last_mouse_up_counter++;
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
if (pdata->mouse_grabbed == 0) if (pdata->mouse_grabbed == 0)
_post_up_handle(e, evt, pdata); _post_up_handle(e, evt, pdata);
@ -1944,7 +1938,7 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
} }
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
efl_del(evt); efl_del(evt);
_evas_unwalk(e); _evas_unwalk(e);
@ -2086,7 +2080,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (e->delete_me) break; if (e->delete_me) break;
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
/* Send mouse out events */ /* Send mouse out events */
@ -2118,7 +2112,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
_evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id); _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
} }
} }
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
} }
else else
{ {
@ -2186,7 +2180,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
} }
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
/* new event id for mouse in */ /* new event id for mouse in */
event_id = _evas_object_event_new(); event_id = _evas_object_event_new();
@ -2233,7 +2227,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* free our cur ins */ /* free our cur ins */
eina_list_free(ins); eina_list_free(ins);
} }
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
} }
nogrep: nogrep:
@ -2330,7 +2324,7 @@ nogrep:
if (e->delete_me) break; if (e->delete_me) break;
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
event_id = _evas_object_event_new(); event_id = _evas_object_event_new();
@ -2366,7 +2360,7 @@ nogrep:
/* and set up the new one */ /* and set up the new one */
pdata->object.in = newin; pdata->object.in = newin;
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
} }
_evas_unwalk(e); _evas_unwalk(e);
@ -2485,7 +2479,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
pdata->object.in = eina_list_free(pdata->object.in); pdata->object.in = eina_list_free(pdata->object.in);
/* and set up the new one */ /* and set up the new one */
pdata->object.in = ins; pdata->object.in = ins;
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
_canvas_event_feed_mouse_move_internal(e, ev); _canvas_event_feed_mouse_move_internal(e, ev);
_evas_unwalk(e); _evas_unwalk(e);
@ -2564,7 +2558,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
/* free our old list of ins */ /* free our old list of ins */
pdata->object.in = eina_list_free(pdata->object.in); pdata->object.in = eina_list_free(pdata->object.in);
pdata->mouse_grabbed = 0; pdata->mouse_grabbed = 0;
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
_evas_unwalk(e); _evas_unwalk(e);
if (ev->device) efl_unref(ev->device); if (ev->device) efl_unref(ev->device);
@ -2693,7 +2687,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
/* update touch point's state to EVAS_TOUCH_POINT_STILL */ /* update touch point's state to EVAS_TOUCH_POINT_STILL */
_evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_STILL); _evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_STILL);
_evas_unwalk(e); _evas_unwalk(e);
@ -2773,8 +2767,12 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
if (e->delete_me || e->is_frozen) break; if (e->delete_me || e->is_frozen) break;
} }
eina_list_free(copy); eina_list_free(copy);
if ((pdata->mouse_grabbed == 0) && !_post_up_handle(e, evt, pdata)) if (pdata->mouse_grabbed == 0)
_evas_post_event_callback_call(eo_e, e); {
_post_up_handle(e, evt, pdata);
_evas_post_event_callback_call(eo_e, e, event_id);
}
/* remove released touch point from the touch point list */ /* remove released touch point from the touch point list */
_evas_touch_point_remove(eo_e, ev->tool); _evas_touch_point_remove(eo_e, ev->tool);
_evas_unwalk(e); _evas_unwalk(e);
@ -2955,7 +2953,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
} }
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
} }
else else
{ {
@ -3013,7 +3011,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* free our cur ins */ /* free our cur ins */
eina_list_free(ins); eina_list_free(ins);
} }
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
} }
_evas_unwalk(e); _evas_unwalk(e);
@ -3089,10 +3087,13 @@ _canvas_event_feed_key_down_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev
Eina_Bool exclusive = EINA_FALSE; Eina_Bool exclusive = EINA_FALSE;
Efl_Input_Pointer *evt; Efl_Input_Pointer *evt;
int event_id = 0; int event_id = 0;
Eo *eo_e;
if (!e || !ev) return; if (!e || !ev) return;
if (e->is_frozen) return; if (e->is_frozen) return;
EVAS_EVENT_FEED_SAFETY_CHECK(e); EVAS_EVENT_FEED_SAFETY_CHECK(e);
eo_e = e->evas;
e->last_timestamp = ev->timestamp; e->last_timestamp = ev->timestamp;
_evas_walk(e); _evas_walk(e);
@ -3164,7 +3165,7 @@ _canvas_event_feed_key_down_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev
if (!exclusive) if (!exclusive)
_key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_DOWN, _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_DOWN,
EVAS_CALLBACK_KEY_DOWN, event_id); EVAS_CALLBACK_KEY_DOWN, event_id);
_evas_post_event_callback_call(e->evas, e); _evas_post_event_callback_call(eo_e, e, event_id);
_evas_unwalk(e); _evas_unwalk(e);
if (ev->device) efl_unref(ev->device); if (ev->device) efl_unref(ev->device);
@ -3176,10 +3177,13 @@ _canvas_event_feed_key_up_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
Eina_Bool exclusive = EINA_FALSE; Eina_Bool exclusive = EINA_FALSE;
Efl_Input_Pointer *evt; Efl_Input_Pointer *evt;
int event_id = 0; int event_id = 0;
Eo *eo_e;
if (!e || !ev) return; if (!e || !ev) return;
if (e->is_frozen) return; if (e->is_frozen) return;
EVAS_EVENT_FEED_SAFETY_CHECK(e); EVAS_EVENT_FEED_SAFETY_CHECK(e);
eo_e = e->evas;
e->last_timestamp = ev->timestamp; e->last_timestamp = ev->timestamp;
_evas_walk(e); _evas_walk(e);
@ -3252,7 +3256,7 @@ _canvas_event_feed_key_up_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
if (!exclusive) if (!exclusive)
_key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_UP, _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_UP,
EVAS_CALLBACK_KEY_UP, event_id); EVAS_CALLBACK_KEY_UP, event_id);
_evas_post_event_callback_call(e->evas, e); _evas_post_event_callback_call(eo_e, e, event_id);
_evas_unwalk(e); _evas_unwalk(e);
if (ev->device) efl_unref(ev->device); if (ev->device) efl_unref(ev->device);
@ -3372,7 +3376,7 @@ evas_event_feed_hold(Eo *eo_e, int hold, unsigned int timestamp, const void *dat
if (e->delete_me || e->is_frozen) break; if (e->delete_me || e->is_frozen) break;
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
_evas_unwalk(e); _evas_unwalk(e);
_evas_object_event_new(); _evas_object_event_new();
@ -3423,7 +3427,7 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D
} }
} }
eina_list_free(copy); eina_list_free(copy);
_evas_post_event_callback_call(eo_e, e); _evas_post_event_callback_call(eo_e, e, event_id);
_evas_unwalk(e); _evas_unwalk(e);
if (ev->device) efl_unref(ev->device); if (ev->device) efl_unref(ev->device);

View File

@ -102,12 +102,12 @@ _evas_focus_dispatch_event(Evas_Object_Protected_Data *obj, Efl_Input_Device *se
static void static void
_evas_object_unfocus(Evas_Object_Protected_Data *obj, Efl_Input_Device *seat) _evas_object_unfocus(Evas_Object_Protected_Data *obj, Efl_Input_Device *seat)
{ {
int event_id = _evas_event_counter;
obj->focused_by_seats = eina_list_remove(obj->focused_by_seats, seat); obj->focused_by_seats = eina_list_remove(obj->focused_by_seats, seat);
_evas_focus_set(obj->object, seat, EINA_FALSE); _evas_focus_set(obj->object, seat, EINA_FALSE);
_evas_focus_dispatch_event(obj, seat, EINA_FALSE); _evas_focus_dispatch_event(obj, seat, EINA_FALSE);
_evas_post_event_callback_call(obj->layer->evas->evas, _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
obj->layer->evas);
} }
void void
@ -156,11 +156,13 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj,
Efl_Input_Device *seat) Efl_Input_Device *seat)
{ {
Eo *current_focus; Eo *current_focus;
int event_id;
MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
return EINA_FALSE; return EINA_FALSE;
MAGIC_CHECK_END(); MAGIC_CHECK_END();
event_id = _evas_event_counter;
if (!seat) seat = _default_seat_get(eo_obj); if (!seat) seat = _default_seat_get(eo_obj);
EINA_SAFETY_ON_NULL_RETURN_VAL(seat, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(seat, EINA_FALSE);
@ -193,7 +195,7 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj,
_evas_focus_dispatch_event(obj, seat, EINA_TRUE); _evas_focus_dispatch_event(obj, seat, EINA_TRUE);
end: end:
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -8,78 +8,94 @@ void
evas_object_inform_call_show(Evas_Object *eo_obj) evas_object_inform_call_show(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
int event_id = _evas_object_event_new();
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_SHOW, NULL, _evas_object_event_new(), EFL_GFX_EVENT_SHOW); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_SHOW, NULL, event_id, EFL_GFX_EVENT_SHOW);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_hide(Evas_Object *eo_obj) evas_object_inform_call_hide(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
int event_id = _evas_object_event_new();
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_HIDE, NULL, _evas_object_event_new(), EFL_GFX_EVENT_HIDE); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_HIDE, NULL, event_id, EFL_GFX_EVENT_HIDE);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_move(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_inform_call_move(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOVE, NULL, _evas_object_event_new(), EFL_GFX_EVENT_MOVE); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOVE, NULL, event_id, EFL_GFX_EVENT_MOVE);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_resize(Evas_Object *eo_obj) evas_object_inform_call_resize(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_RESIZE, NULL, _evas_object_event_new(), EFL_GFX_EVENT_RESIZE); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_RESIZE, NULL, event_id, EFL_GFX_EVENT_RESIZE);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_restack(Evas_Object *eo_obj) evas_object_inform_call_restack(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_RESTACK, NULL, _evas_object_event_new(), EFL_GFX_EVENT_RESTACK); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_RESTACK, NULL, event_id, EFL_GFX_EVENT_RESTACK);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_changed_size_hints(Evas_Object *eo_obj) evas_object_inform_call_changed_size_hints(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, NULL, _evas_object_event_new(), EFL_GFX_EVENT_CHANGE_SIZE_HINTS); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, NULL, event_id, EFL_GFX_EVENT_CHANGE_SIZE_HINTS);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_image_preloaded(Evas_Object *eo_obj) evas_object_inform_call_image_preloaded(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
EINA_SAFETY_ON_NULL_RETURN(obj); int event_id;
EINA_SAFETY_ON_NULL_RETURN(obj);
if (!_evas_object_image_preloading_get(eo_obj)) return; if (!_evas_object_image_preloading_get(eo_obj)) return;
_evas_image_load_post_update(eo_obj, obj); _evas_image_load_post_update(eo_obj, obj);
_evas_object_image_preloading_check(eo_obj); _evas_object_image_preloading_check(eo_obj);
_evas_object_image_preloading_set(eo_obj, 0); _evas_object_image_preloading_set(eo_obj, 0);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_PRELOADED, NULL, _evas_object_event_new(), EFL_IMAGE_EVENT_PRELOAD); event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_PRELOADED, NULL, event_id, EFL_IMAGE_EVENT_PRELOAD);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_image_unloaded(Evas_Object *eo_obj) evas_object_inform_call_image_unloaded(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_UNLOADED, NULL, _evas_object_event_new(), EFL_IMAGE_EVENT_UNLOAD); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_UNLOADED, NULL, event_id, EFL_IMAGE_EVENT_UNLOAD);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
void void
evas_object_inform_call_image_resize(Evas_Object *eo_obj) evas_object_inform_call_image_resize(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_RESIZE, NULL, _evas_object_event_new(), EFL_IMAGE_EVENT_RESIZE); int event_id = _evas_object_event_new();
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_IMAGE_RESIZE, NULL, event_id, EFL_IMAGE_EVENT_RESIZE);
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }

View File

@ -1027,23 +1027,26 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data
Efl_Input_Device *dev; Efl_Input_Device *dev;
Evas_Public_Data *edata; Evas_Public_Data *edata;
Evas_Object_Pointer_Data *pdata; Evas_Object_Pointer_Data *pdata;
int event_id;
edata = efl_data_scope_get(evas_object_evas_get(eo_obj), EVAS_CANVAS_CLASS); edata = efl_data_scope_get(evas_object_evas_get(eo_obj), EVAS_CANVAS_CLASS);
evas_object_hide(eo_obj); evas_object_hide(eo_obj);
EINA_LIST_FREE (obj->focused_by_seats, dev) EINA_LIST_FREE (obj->focused_by_seats, dev)
{ {
event_id = _evas_event_counter;
efl_event_callback_del(dev, EFL_EVENT_DEL, efl_event_callback_del(dev, EFL_EVENT_DEL,
_evas_focus_device_del_cb, obj); _evas_focus_device_del_cb, obj);
eina_hash_del_by_key(edata->focused_objects, &dev); eina_hash_del_by_key(edata->focused_objects, &dev);
_evas_focus_dispatch_event(obj, dev, EINA_FALSE); _evas_focus_dispatch_event(obj, dev, EINA_FALSE);
if ((obj->layer) && (obj->layer->evas)) if ((obj->layer) && (obj->layer->evas))
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
} }
EINA_INLIST_FREE(obj->pointer_grabs, pdata) EINA_INLIST_FREE(obj->pointer_grabs, pdata)
_evas_object_pointer_grab_del(obj, pdata); _evas_object_pointer_grab_del(obj, pdata);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_DEL, NULL, _evas_object_event_new(), NULL); event_id = _evas_object_event_new();
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_DEL, NULL, event_id, NULL);
if ((obj->layer) && (obj->layer->evas)) if ((obj->layer) && (obj->layer->evas))
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
EINA_LIST_FREE(obj->events_whitelist, dev) EINA_LIST_FREE(obj->events_whitelist, dev)
efl_event_callback_del(dev, EFL_EVENT_DEL, _whitelist_events_device_remove_cb, obj); efl_event_callback_del(dev, EFL_EVENT_DEL, _whitelist_events_device_remove_cb, obj);
if (obj->name) evas_object_name_set(eo_obj, NULL); if (obj->name) evas_object_name_set(eo_obj, NULL);
@ -1095,9 +1098,10 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data
evas_object_map_set(eo_obj, NULL); evas_object_map_set(eo_obj, NULL);
if (obj->is_smart) evas_object_smart_del(eo_obj); if (obj->is_smart) evas_object_smart_del(eo_obj);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_FREE, NULL, _evas_object_event_new(), NULL); event_id = _evas_object_event_new();
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_FREE, NULL, event_id, NULL);
if ((obj->layer) && (obj->layer->evas)) if ((obj->layer) && (obj->layer->evas))
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas, event_id);
evas_object_smart_cleanup(eo_obj); evas_object_smart_cleanup(eo_obj);
obj->delete_me = 1; obj->delete_me = 1;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
@ -1788,8 +1792,9 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
ev.locks = &(obj->layer->evas->locks); ev.locks = &(obj->layer->evas->locks);
ev.timestamp = obj->layer->evas->last_timestamp; ev.timestamp = obj->layer->evas->last_timestamp;
ev.event_flags = EVAS_EVENT_FLAG_NONE; ev.event_flags = EVAS_EVENT_FLAG_NONE;
event_id = _evas_object_event_new();
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
_evas_post_event_callback_call(obj->layer->evas, obj->layer->evas); _evas_post_event_callback_call(obj->layer->evas, obj->layer->evas, event_id);
} }
*/ */
} }

View File

@ -787,6 +787,8 @@ struct _Evas_Post_Callback
{ {
Evas_Object_Event_Post_Cb func; Evas_Object_Event_Post_Cb func;
const void *data; const void *data;
int event_id;
Evas_Callback_Type type;
unsigned char delete_me : 1; unsigned char delete_me : 1;
}; };
@ -930,6 +932,7 @@ struct _Evas_Public_Data
int nochange; int nochange;
Evas_Font_Hinting_Flags hinting; Evas_Font_Hinting_Flags hinting;
Evas_Callback_Type current_event; Evas_Callback_Type current_event;
int running_post_events;
Eina_List *touch_points; Eina_List *touch_points;
Eina_List *devices; Eina_List *devices;
@ -949,7 +952,6 @@ struct _Evas_Public_Data
Eina_Bool rendering : 1; Eina_Bool rendering : 1;
Eina_Bool render2 : 1; Eina_Bool render2 : 1;
Eina_Bool common_init : 1; Eina_Bool common_init : 1;
Eina_Bool running_post_events : 1;
}; };
struct _Evas_Layer struct _Evas_Layer
@ -1684,7 +1686,7 @@ void evas_object_smart_need_bounding_box_update(Evas_Object *eo_obj, Evas_Smart_
Eina_Bool evas_object_smart_changed_get(Evas_Object *eo_obj); Eina_Bool evas_object_smart_changed_get(Evas_Object *eo_obj);
void evas_object_smart_attach(Evas_Object *eo_obj, Evas_Smart *s); void evas_object_smart_attach(Evas_Object *eo_obj, Evas_Smart *s);
void *evas_mem_calloc(int size); void *evas_mem_calloc(int size);
void _evas_post_event_callback_call(Evas *e, Evas_Public_Data* e_pd); void _evas_post_event_callback_call(Evas *e, Evas_Public_Data* e_pd, int min_event_id);
void _evas_post_event_callback_free(Evas *e); void _evas_post_event_callback_free(Evas *e);
void evas_event_callback_list_post_free(Eina_Inlist **list); void evas_event_callback_list_post_free(Eina_Inlist **list);
void evas_object_event_callback_all_del(Evas_Object *obj); void evas_object_event_callback_all_del(Evas_Object *obj);