On Wed, Jun 14, 2017 at 10:04 AM, Mike Blumenkrantz <[email protected]> wrote: > This should not be reverted. It crashes for me as well.
With the commit fix that come after it ? > On Wed, Jun 14, 2017 at 1:00 PM Cedric BAIL <[email protected]> wrote: > >> cedric pushed a commit to branch master. >> >> >> http://git.enlightenment.org/core/efl.git/commit/?id=cbfad5760d7768816403f3daaba7cda06eb30439 >> >> commit cbfad5760d7768816403f3daaba7cda06eb30439 >> Author: Cedric BAIL <[email protected]> >> Date: Tue Jun 13 09:36:33 2017 -0700 >> >> Revert "Revert "evas: put events related pointer into a cow to reduce >> evas_object fat."" >> >> This reverts commit f9d3219c1739d7abea16fecd92fcc0981ddf801c. >> --- >> .../evas/canvas/efl_canvas_object_event_grabber.c | 85 >> ++++++++++++++-------- >> src/lib/evas/canvas/evas_callbacks.c | 4 +- >> src/lib/evas/canvas/evas_events.c | 4 +- >> src/lib/evas/canvas/evas_focus.c | 18 +++-- >> src/lib/evas/canvas/evas_object_main.c | 84 >> ++++++++++++++------- >> src/lib/evas/include/evas_private.h | 32 +++++--- >> 6 files changed, 147 insertions(+), 80 deletions(-) >> >> diff --git a/src/lib/evas/canvas/efl_canvas_object_event_grabber.c >> b/src/lib/evas/canvas/efl_canvas_object_event_grabber.c >> index 12d882dcd2..30d3f88521 100644 >> --- a/src/lib/evas/canvas/efl_canvas_object_event_grabber.c >> +++ b/src/lib/evas/canvas/efl_canvas_object_event_grabber.c >> @@ -31,7 +31,7 @@ >> _efl_canvas_object_event_grabber_efl_canvas_group_group_iterator_next(Efl_Object >> >> if (!eina_clist_next(it->head, it->current)) return EINA_FALSE; >> >> - obj = EINA_CLIST_ENTRY(eina_clist_head(it->current), >> Evas_Object_Protected_Data, event.member); >> + obj = EINA_CLIST_ENTRY(eina_clist_head(it->current), >> Evas_Object_Protected_Data, events->event.member); >> if (data) *data = obj->object; >> >> it->current = eina_clist_next(it->head, it->current); >> @@ -100,6 +100,14 @@ _stacking_verify(Efl_Object_Event_Grabber_Data *pd, >> Evas_Object_Protected_Data * >> } >> >> static void >> +_child_add_after(Evas_Object_Protected_Data *a, Evas_Object_Events_Data >> *events) >> +{ >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, a->events, >> Evas_Object_Events_Data, evs) >> + eina_clist_add_after(&evs->event.member, &events->event.member); >> + EINA_COW_WRITE_END(evas_object_events_cow, a->events, evs); >> +} >> + >> +static void >> _child_insert(Efl_Object_Event_Grabber_Data *pd, >> Evas_Object_Protected_Data *obj) >> { >> Evas_Object_Protected_Data *a, *i; >> @@ -107,38 +115,44 @@ _child_insert(Efl_Object_Event_Grabber_Data *pd, >> Evas_Object_Protected_Data *obj >> if (eina_clist_empty(&pd->contained)) >> { >> /* pd->rect case */ >> - eina_clist_add_head(&pd->contained, &obj->event.member); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + eina_clist_add_head(&pd->contained, &events->event.member); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> return; >> } >> >> if (pd->vis) _stacking_verify(pd, obj); >> - EINA_CLIST_FOR_EACH_ENTRY_REV(a, &pd->contained, >> Evas_Object_Protected_Data, event.member) >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> { >> - if (a->object == pd->rect) >> - { >> - eina_clist_add_after(&a->event.member, &obj->event.member); >> - return; >> - } >> - if (a->layer->layer > obj->layer->layer) continue; >> - if (a->layer->layer < obj->layer->layer) >> - { >> - eina_clist_add_after(&a->event.member, &obj->event.member); >> - return; >> - } >> - EINA_INLIST_FOREACH(EINA_INLIST_GET(a->layer->objects), i) >> + EINA_CLIST_FOR_EACH_ENTRY_REV(a, &pd->contained, >> Evas_Object_Protected_Data, events->event.member) >> { >> - if (a == i) >> + if (a->object == pd->rect) >> { >> - eina_clist_add_after(&a->event.member, >> &obj->event.member); >> + _child_add_after(a, events); >> return; >> } >> - if (obj == i) >> + if (a->layer->layer > obj->layer->layer) continue; >> + if (a->layer->layer < obj->layer->layer) >> { >> - eina_clist_add_before(&a->event.member, >> &obj->event.member); >> + _child_add_after(a, events); >> return; >> } >> + EINA_INLIST_FOREACH(EINA_INLIST_GET(a->layer->objects), i) >> + { >> + if (a == i) >> + { >> + _child_add_after(a, events); >> + return; >> + } >> + if (obj == i) >> + { >> + _child_add_after(a, events); >> + return; >> + } >> + } >> } >> } >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> } >> >> static void >> @@ -147,7 +161,10 @@ _efl_canvas_object_event_grabber_child_restack(void >> *data, const Efl_Event *even >> Efl_Object_Event_Grabber_Data *pd = data; >> Evas_Object_Protected_Data *obj = efl_data_scope_get(event->object, >> EFL_CANVAS_OBJECT_CLASS); >> >> - eina_clist_remove(&obj->event.member); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + eina_clist_remove(&events->event.member); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> _child_insert(pd, obj); >> } >> >> @@ -197,10 +214,12 @@ >> _efl_canvas_object_event_grabber_efl_canvas_group_group_member_add(Eo >> *eo_obj, E >> return; >> } >> } >> - if (obj->event.parent == eo_obj) return; >> + if (obj->events->event.parent == eo_obj) return; >> >> - if (obj->smart.parent || obj->event.parent) >> evas_object_smart_member_del(member); >> - obj->event.parent = eo_obj; >> + if (obj->smart.parent || obj->events->event.parent) >> evas_object_smart_member_del(member); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->event.parent = eo_obj; >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> _child_insert(pd, obj); >> efl_event_callback_add(member, EFL_EVENT_DEL, >> _efl_canvas_object_event_grabber_child_del, pd); >> if (member != pd->rect) >> @@ -214,8 +233,12 @@ >> _efl_canvas_object_event_grabber_efl_canvas_group_group_member_del(Eo >> *eo_obj EI >> >> efl_event_callback_del(member, EFL_EVENT_DEL, >> _efl_canvas_object_event_grabber_child_del, pd); >> efl_event_callback_del(member, EFL_GFX_EVENT_RESTACK, >> _efl_canvas_object_event_grabber_child_restack, pd); >> - eina_clist_remove(&obj->event.member); >> - obj->event.parent = NULL; >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + { >> + eina_clist_remove(&events->event.member); >> + events->event.parent = NULL; >> + } >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> } >> >> EOLIAN static void >> @@ -263,7 +286,7 @@ >> _efl_canvas_object_event_grabber_efl_gfx_visible_set(Eo *eo_obj >> EINA_UNUSED, Efl >> { >> Evas_Object_Protected_Data *obj; >> >> - EINA_CLIST_FOR_EACH_ENTRY(obj, &pd->contained, >> Evas_Object_Protected_Data, event.member) >> + EINA_CLIST_FOR_EACH_ENTRY(obj, &pd->contained, >> Evas_Object_Protected_Data, events->event.member) >> if (obj->object != pd->rect) _stacking_verify(pd, obj); >> } >> pd->vis = !!set; >> @@ -287,11 +310,13 @@ _efl_canvas_object_event_grabber_restack(void *data, >> const Efl_Event *event) >> evas_object_layer_set(pd->rect, evas_object_layer_get(event->object)); >> evas_object_stack_below(pd->rect, event->object); >> >> - EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, >> Evas_Object_Protected_Data, event.member) >> + EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, >> Evas_Object_Protected_Data, events->event.member) >> { >> if (obj->object == pd->rect) continue; >> list = eina_list_append(list, obj); >> - eina_clist_remove(&obj->event.member); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + eina_clist_remove(&events->event.member); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> } >> EINA_LIST_FREE(list, obj) >> _child_insert(pd, obj); >> @@ -301,7 +326,7 @@ EOLIAN static Eo * >> _efl_canvas_object_event_grabber_efl_object_constructor(Eo *eo_obj, >> Efl_Object_Event_Grabber_Data *pd) >> { >> Evas_Object_Protected_Data *obj; >> - >> + >> eo_obj = efl_constructor(efl_super(eo_obj, MY_CLASS)); >> efl_canvas_object_type_set(eo_obj, MY_CLASS_NAME_LEGACY); >> obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); >> @@ -321,7 +346,7 @@ EOLIAN static void >> _efl_canvas_object_event_grabber_efl_object_destructor(Eo *eo_obj, >> Efl_Object_Event_Grabber_Data *pd) >> { >> Evas_Object_Protected_Data *obj, *nobj; >> - EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, >> Evas_Object_Protected_Data, event.member) >> + EINA_CLIST_FOR_EACH_ENTRY_SAFE(obj, nobj, &pd->contained, >> Evas_Object_Protected_Data, events->event.member) >> efl_canvas_group_member_del(eo_obj, obj->object); >> efl_canvas_group_del(eo_obj); >> efl_destructor(efl_super(eo_obj, MY_CLASS)); >> diff --git a/src/lib/evas/canvas/evas_callbacks.c >> b/src/lib/evas/canvas/evas_callbacks.c >> index faf0c483f3..28ca6d2d3e 100644 >> --- a/src/lib/evas/canvas/evas_callbacks.c >> +++ b/src/lib/evas/canvas/evas_callbacks.c >> @@ -436,13 +436,13 @@ evas_object_event_callback_call(Evas_Object *eo_obj, >> Evas_Object_Protected_Data >> nothing_here: >> if (!obj->no_propagate) >> { >> - if ((obj->smart.parent || obj->event.parent) && (type != >> EVAS_CALLBACK_FREE) && >> + if ((obj->smart.parent || obj->events->event.parent) && (type != >> EVAS_CALLBACK_FREE) && >> (type <= EVAS_CALLBACK_KEY_UP)) >> { >> Evas_Object_Protected_Data *parent_obj; >> Eo *parent; >> >> - parent = obj->event.parent ?: obj->smart.parent; >> + parent = obj->events->event.parent ?: obj->smart.parent; >> parent_obj = efl_data_scope_get(parent, >> EFL_CANVAS_OBJECT_CLASS); >> evas_object_event_callback_call(parent, parent_obj, type, >> event_info, event_id, efl_event_desc); >> } >> diff --git a/src/lib/evas/canvas/evas_events.c >> b/src/lib/evas/canvas/evas_events.c >> index a97129d1b4..222169ba89 100644 >> --- a/src/lib/evas/canvas/evas_events.c >> +++ b/src/lib/evas/canvas/evas_events.c >> @@ -387,7 +387,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, >> Eina_List *in, >> obj; >> obj = _EINA_INLIST_CONTAINER(obj, >> EINA_INLIST_GET(obj)->prev)) >> { >> - if (obj->event.parent) continue; >> + if (obj->events->event.parent) continue; >> in = _evas_event_object_list_raw_in_get_single(eo_e, obj, >> in, stop, x, y, no_rep, source >> #ifdef DDD_DO >> ,&spaces >> @@ -398,7 +398,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, >> Eina_List *in, >> } >> else >> { >> - EINA_CLIST_FOR_EACH_ENTRY_SAFE_REV(obj, nobj, clist, >> Evas_Object_Protected_Data, event.member) >> + EINA_CLIST_FOR_EACH_ENTRY_SAFE_REV(obj, nobj, clist, >> Evas_Object_Protected_Data, events->event.member) >> { >> in = _evas_event_object_list_raw_in_get_single(eo_e, obj, >> in, stop, x, y, no_rep, source >> #ifdef DDD_DO >> diff --git a/src/lib/evas/canvas/evas_focus.c >> b/src/lib/evas/canvas/evas_focus.c >> index 0b79bf958c..6ea934a8cd 100644 >> --- a/src/lib/evas/canvas/evas_focus.c >> +++ b/src/lib/evas/canvas/evas_focus.c >> @@ -106,7 +106,10 @@ _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); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->focused_by_seats = >> eina_list_remove(events->focused_by_seats, seat); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> _evas_focus_set(obj->object, seat, EINA_FALSE); >> _evas_focus_dispatch_event(obj, seat, EINA_FALSE); >> _evas_post_event_callback_call(obj->layer->evas->evas, >> obj->layer->evas, event_id); >> @@ -138,7 +141,7 @@ _efl_canvas_object_seat_focus_del(Eo *eo_obj, >> obj->layer->evas->pending_default_focus_obj = NULL; >> } >> >> - EINA_LIST_FOREACH(obj->focused_by_seats, l, dev) >> + EINA_LIST_FOREACH(obj->events->focused_by_seats, l, dev) >> { >> if (dev != seat) >> continue; >> @@ -184,7 +187,7 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj, >> if (!efl_input_seat_event_filter_get(eo_obj, seat)) >> return EINA_FALSE; >> >> - if (_already_focused(obj->focused_by_seats, seat)) >> + if (_already_focused(obj->events->focused_by_seats, seat)) >> goto end; >> >> if (_evas_object_intercept_call_evas(obj, >> EVAS_OBJECT_INTERCEPT_CB_FOCUS_SET, >> @@ -202,7 +205,10 @@ _efl_canvas_object_seat_focus_add(Eo *eo_obj, >> >> efl_event_callback_add(seat, EFL_EVENT_DEL, _evas_focus_device_del_cb, >> obj); >> >> - obj->focused_by_seats = eina_list_append(obj->focused_by_seats, seat); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->focused_by_seats = >> eina_list_append(events->focused_by_seats, seat); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> _evas_focus_set(eo_obj, seat, EINA_TRUE); >> >> _evas_focus_dispatch_event(obj, seat, EINA_TRUE); >> @@ -225,7 +231,7 @@ _efl_canvas_object_seat_focus_check(Eo *eo_obj, >> >> if (!seat) seat = _default_seat_get(eo_obj); >> >> - EINA_LIST_FOREACH(obj->focused_by_seats, l, s) >> + EINA_LIST_FOREACH(obj->events->focused_by_seats, l, s) >> { >> if (s == seat) >> return EINA_TRUE; >> @@ -253,7 +259,7 @@ _efl_canvas_object_seat_focus_get(Eo *eo_obj, >> Evas_Object_Protected_Data *obj) >> return EINA_FALSE; >> MAGIC_CHECK_END(); >> >> - return eina_list_count(obj->focused_by_seats) ? EINA_TRUE : EINA_FALSE; >> + return eina_list_count(obj->events->focused_by_seats) ? EINA_TRUE : >> EINA_FALSE; >> } >> >> EOLIAN Eina_Bool >> diff --git a/src/lib/evas/canvas/evas_object_main.c >> b/src/lib/evas/canvas/evas_object_main.c >> index 9a5ccddfc4..b1547b68c2 100644 >> --- a/src/lib/evas/canvas/evas_object_main.c >> +++ b/src/lib/evas/canvas/evas_object_main.c >> @@ -35,12 +35,16 @@ static const Evas_Object_Protected_State default_state >> = { >> static const Evas_Object_Mask_Data default_mask = { >> NULL, 0, 0, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE >> }; >> +static const Evas_Object_Events_Data default_events = { >> + NULL, NULL, NULL, { NULL, { 0 } } >> +}; >> >> Eina_Cow *evas_object_proxy_cow = NULL; >> Eina_Cow *evas_object_map_cow = NULL; >> Eina_Cow *evas_object_state_cow = NULL; >> Eina_Cow *evas_object_3d_cow = NULL; >> Eina_Cow *evas_object_mask_cow = NULL; >> +Eina_Cow *evas_object_events_cow = NULL; >> >> static Eina_Bool >> _init_cow(void) >> @@ -52,21 +56,24 @@ _init_cow(void) >> evas_object_state_cow = eina_cow_add("Evas Object State", sizeof >> (Evas_Object_Protected_State), 64, &default_state, EINA_FALSE); >> evas_object_3d_cow = eina_cow_add("Evas Object 3D", sizeof >> (Evas_Object_3D_Data), 8, &default_proxy, EINA_TRUE); >> evas_object_mask_cow = eina_cow_add("Evas Mask Data", sizeof >> (Evas_Object_Mask_Data), 8, &default_mask, EINA_TRUE); >> + evas_object_events_cow = eina_cow_add("Evas Events Data", sizeof >> (Evas_Object_Events_Data), 8, &default_events, EINA_TRUE); >> >> if (!(evas_object_map_cow && evas_object_proxy_cow && >> evas_object_state_cow && >> - evas_object_3d_cow && evas_object_mask_cow)) >> + evas_object_3d_cow && evas_object_mask_cow && >> evas_object_events_cow)) >> { >> eina_cow_del(evas_object_proxy_cow); >> eina_cow_del(evas_object_map_cow); >> eina_cow_del(evas_object_state_cow); >> eina_cow_del(evas_object_3d_cow); >> eina_cow_del(evas_object_mask_cow); >> + eina_cow_del(evas_object_events_cow); >> >> evas_object_proxy_cow = NULL; >> evas_object_map_cow = NULL; >> evas_object_state_cow = NULL; >> evas_object_3d_cow = NULL; >> evas_object_mask_cow = NULL; >> + evas_object_events_cow = NULL; >> >> return EINA_FALSE; >> } >> @@ -80,7 +87,7 @@ >> _evas_object_pointer_data_find(Evas_Object_Protected_Data *obj, >> { >> Evas_Object_Pointer_Data *pdata; >> >> - EINA_INLIST_FOREACH(obj->pointer_grabs, pdata) >> + EINA_INLIST_FOREACH(obj->events->pointer_grabs, pdata) >> { >> if (pdata->evas_pdata->pointer == pointer) >> return pdata; >> @@ -113,8 +120,10 @@ >> _evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, >> pdata->evas_pdata->seat->object.in = >> eina_list_remove(pdata->evas_pdata->seat->object.in, obj->object); >> efl_event_callback_del(pdata->evas_pdata->pointer, EFL_EVENT_DEL, >> _evas_device_del_cb, obj); >> - obj->pointer_grabs = eina_inlist_remove(obj->pointer_grabs, >> - EINA_INLIST_GET(pdata)); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->pointer_grabs = eina_inlist_remove(events->pointer_grabs, >> EINA_INLIST_GET(pdata)); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> free(pdata); >> } >> >> @@ -128,8 +137,11 @@ _evas_object_pointer_data_add(Evas_Pointer_Data >> *evas_pdata, >> EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL); >> pdata->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB; >> pdata->evas_pdata = evas_pdata; >> - obj->pointer_grabs = eina_inlist_append(obj->pointer_grabs, >> - EINA_INLIST_GET(pdata)); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->pointer_grabs = eina_inlist_append(events->pointer_grabs, >> + EINA_INLIST_GET(pdata)); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> efl_event_callback_priority_add(evas_pdata->pointer, EFL_EVENT_DEL, >> EFL_CALLBACK_PRIORITY_BEFORE, >> _evas_device_del_cb, obj); >> @@ -177,6 +189,7 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, >> Evas_Object_Protected_Data >> obj->prev = eina_cow_alloc(evas_object_state_cow); >> obj->data_3d = eina_cow_alloc(evas_object_3d_cow); >> obj->mask = eina_cow_alloc(evas_object_mask_cow); >> + obj->events = eina_cow_alloc(evas_object_events_cow); >> >> evas_object_inject(eo_obj, obj, evas); >> evas_object_callback_init(eo_obj, obj); >> @@ -891,7 +904,7 @@ >> _efl_canvas_object_efl_input_interface_seat_event_filter_get(Eo *eo_obj >> EINA_UNU >> //It means this object accept events from any seat. >> if (!obj->events_filter_enabled) >> return EINA_TRUE; >> - return eina_list_data_find(obj->events_whitelist, seat) ? >> + return eina_list_data_find(obj->events->events_whitelist, seat) ? >> EINA_TRUE : EINA_FALSE; >> } >> >> @@ -899,8 +912,11 @@ static void >> _whitelist_events_device_remove_cb(void *data, const Efl_Event *event) >> { >> Evas_Object_Protected_Data *obj = data; >> - obj->events_whitelist = eina_list_remove(obj->events_whitelist, >> - event->object); >> + >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->events_whitelist = eina_list_remove(events->events_whitelist, >> + event->object); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> } >> >> EOLIAN static void >> @@ -916,10 +932,10 @@ >> _efl_canvas_object_efl_input_interface_seat_event_filter_set(Eo *eo_obj, >> obj->events_filter_enabled = EINA_TRUE; >> if (add) >> { >> - if (eina_list_data_find(obj->events_whitelist, seat)) return; >> + if (eina_list_data_find(obj->events->events_whitelist, seat)) >> return; >> /* remove all previously focused seats, if any - it may happen >> since there wasn't a whitelist in place (no restrictions) */ >> - if ((!obj->events_whitelist) && (obj->layer) && >> (obj->layer->evas)) >> + if ((!obj->events->events_whitelist) && (obj->layer) && >> (obj->layer->evas)) >> { >> const Eina_List *devices, *l; >> Efl_Input_Device *dev; >> @@ -932,14 +948,20 @@ >> _efl_canvas_object_efl_input_interface_seat_event_filter_set(Eo *eo_obj, >> efl_canvas_object_seat_focus_del(eo_obj, dev); >> } >> } >> - obj->events_whitelist = eina_list_append(obj->events_whitelist, >> seat); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->events_whitelist = >> eina_list_append(events->events_whitelist, seat); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> efl_event_callback_add(seat, EFL_EVENT_DEL, >> _whitelist_events_device_remove_cb, obj); >> } >> else >> { >> efl_canvas_object_seat_focus_del(eo_obj, seat); >> - obj->events_whitelist = eina_list_remove(obj->events_whitelist, >> seat); >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + events->events_whitelist = >> eina_list_remove(events->events_whitelist, seat); >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> efl_event_callback_del(seat, EFL_EVENT_DEL, >> _whitelist_events_device_remove_cb, obj); >> } >> @@ -1010,24 +1032,30 @@ _efl_canvas_object_efl_object_destructor(Eo >> *eo_obj, Evas_Object_Protected_Data >> >> edata = efl_data_scope_get(evas_object_evas_get(eo_obj), >> EVAS_CANVAS_CLASS); >> evas_object_hide(eo_obj); >> - EINA_LIST_FREE (obj->focused_by_seats, dev) >> - { >> - event_id = _evas_event_counter; >> - efl_event_callback_del(dev, EFL_EVENT_DEL, >> - _evas_focus_device_del_cb, obj); >> - eina_hash_del_by_key(edata->focused_objects, &dev); >> - _evas_focus_dispatch_event(obj, dev, EINA_FALSE); >> - if ((obj->layer) && (obj->layer->evas)) >> - _evas_post_event_callback_call(obj->layer->evas->evas, >> obj->layer->evas, event_id); >> - } >> - EINA_INLIST_FREE(obj->pointer_grabs, pdata) >> - _evas_object_pointer_grab_del(obj, pdata); >> + >> + EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, >> Evas_Object_Events_Data, events) >> + { >> + EINA_LIST_FREE (events->focused_by_seats, dev) >> + { >> + event_id = _evas_event_counter; >> + efl_event_callback_del(dev, EFL_EVENT_DEL, >> + _evas_focus_device_del_cb, obj); >> + eina_hash_del_by_key(edata->focused_objects, &dev); >> + _evas_focus_dispatch_event(obj, dev, EINA_FALSE); >> + if ((obj->layer) && (obj->layer->evas)) >> + _evas_post_event_callback_call(obj->layer->evas->evas, >> obj->layer->evas, event_id); >> + } >> + EINA_INLIST_FREE(events->pointer_grabs, pdata) >> + _evas_object_pointer_grab_del(obj, pdata); >> + EINA_LIST_FREE(events->events_whitelist, dev) >> + efl_event_callback_del(dev, EFL_EVENT_DEL, >> _whitelist_events_device_remove_cb, obj); >> + } >> + EINA_COW_WRITE_END(evas_object_events_cow, obj->events, events); >> + >> 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)) >> _evas_post_event_callback_call(obj->layer->evas->evas, >> obj->layer->evas, event_id); >> - EINA_LIST_FREE(obj->events_whitelist, dev) >> - 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->layer) >> { >> @@ -1737,7 +1765,7 @@ _hide(Evas_Object *eo_obj, >> Evas_Object_Protected_Data *obj) >> { >> Evas_Object_Pointer_Data *obj_pdata; >> >> - EINA_INLIST_FOREACH(obj->pointer_grabs, obj_pdata) >> + EINA_INLIST_FOREACH(obj->events->pointer_grabs, >> obj_pdata) >> { >> if (!obj_pdata->mouse_grabbed && >> evas_object_is_in_output_rect(eo_obj, obj, >> obj_pdata->evas_pdata->seat->x, >> diff --git a/src/lib/evas/include/evas_private.h >> b/src/lib/evas/include/evas_private.h >> index 7780ddb135..d54814a41d 100644 >> --- a/src/lib/evas/include/evas_private.h >> +++ b/src/lib/evas/include/evas_private.h >> @@ -86,6 +86,7 @@ typedef struct _Evas_Post_Callback >> Evas_Post_Callback; >> typedef struct _Evas_Coord_Touch_Point Evas_Coord_Touch_Point; >> typedef struct _Evas_Object_Proxy_Data Evas_Object_Proxy_Data; >> typedef struct _Evas_Object_Map_Data Evas_Object_Map_Data; >> +typedef struct _Evas_Object_Events_Data Evas_Object_Events_Data; >> typedef struct _Evas_Proxy_Render_Data Evas_Proxy_Render_Data; >> typedef struct _Evas_Object_3D_Data Evas_Object_3D_Data; >> typedef struct _Evas_Object_Mask_Data Evas_Object_Mask_Data; >> @@ -1092,6 +1093,23 @@ struct _Evas_Object_Mask_Data >> Eina_Bool is_scaled : 1; >> }; >> >> +struct _Evas_Object_Events_Data >> +{ >> + /* >> + The list below contain the seats (Efl.Input.Devices) which this >> + object allows events to be reported (Mouse, Keybord and focus >> events). >> + */ >> + Eina_List *events_whitelist; >> + >> + Eina_List *focused_by_seats; >> + Eina_Inlist *pointer_grabs; >> + >> + struct { >> + Evas_Object *parent; >> + Eina_Clist member; >> + } event; >> +}; >> + >> struct _Evas_Object_Protected_State >> { >> Evas_Object_Protected_Data *clipper; >> @@ -1147,11 +1165,6 @@ struct _Evas_Object_Protected_Data >> Eina_List *grabs; >> >> Eina_Inlist *callbacks; >> - /* >> - The list below contain the seats (Efl.Input.Devices) which this >> - object allows events to be reported (Mouse, Keybord and focus >> events). >> - */ >> - Eina_List *events_whitelist; >> >> struct { >> Eina_List *clipees; >> @@ -1170,18 +1183,12 @@ struct _Evas_Object_Protected_Data >> Evas_Object_Protected_Data *parent_object_data; >> } smart; >> >> - struct { >> - Evas_Object *parent; >> - Eina_Clist member; >> - } event; >> - >> // Eina_Cow pointer be careful when writing to it >> const Evas_Object_Proxy_Data *proxy; >> const Evas_Object_Map_Data *map; >> const Evas_Object_3D_Data *data_3d; >> const Evas_Object_Mask_Data *mask; >> - Eina_List *focused_by_seats; >> - Eina_Inlist *pointer_grabs; >> + const Evas_Object_Events_Data *events; >> >> // Pointer to the Evas_Object itself >> Evas_Object *object; >> @@ -2077,6 +2084,7 @@ extern Eina_Cow *evas_object_image_pixels_cow; >> extern Eina_Cow *evas_object_image_load_opts_cow; >> extern Eina_Cow *evas_object_image_state_cow; >> extern Eina_Cow *evas_object_mask_cow; >> +extern Eina_Cow *evas_object_events_cow; >> >> # define EINA_COW_STATE_WRITE_BEGIN(Obj, Write, State) \ >> EINA_COW_WRITE_BEGIN(evas_object_state_cow, Obj->State, \ >> >> -- >> >> >> > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > enlightenment-devel mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel -- Cedric BAIL ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ enlightenment-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
