efl_ui_widget: remove self reference

as an example: elm_test uses roughly 500 widgets, this pointer takes 8
bytes, this is wasting quite some time, which can be perfectly safed by
just structuring the code a little bit more. In some callbacks we need
to call one more time efl_data_scope_get but that is not a that big
issue, as most calls after that are also doing a eo call on that object,
so the eo_id is already cached.

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D9683
This commit is contained in:
Marcel Hollerbach 2019-08-21 17:26:03 +02:00 committed by Cedric BAIL
parent bedb6df973
commit 4cede693a5
6 changed files with 54 additions and 57 deletions

View File

@ -377,15 +377,15 @@ _efl_ui_image_zoomable_pan_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Imag
evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
_image_place(
wd->obj, psd->wsd->pan_x, psd->wsd->pan_y,
psd->wobj, psd->wsd->pan_x, psd->wsd->pan_y,
ox - psd->wsd->g_layer_zoom.imx, oy - psd->wsd->g_layer_zoom.imy, ow,
oh);
EINA_LIST_FOREACH(psd->wsd->grids, l, g)
{
_grid_load(wd->obj, g);
_grid_load(psd->wobj, g);
_grid_place(
wd->obj, g, psd->wsd->pan_x,
psd->wobj, g, psd->wsd->pan_x,
psd->wsd->pan_y, ox - psd->wsd->g_layer_zoom.imx,
oy - psd->wsd->g_layer_zoom.imy, ow, oh);
}
@ -536,7 +536,7 @@ _tile_preloaded_cb(void *data,
"efl");
efl_event_callback_legacy_call
(wd->obj, EFL_UI_IMAGE_ZOOMABLE_EVENT_LOADED_DETAIL, NULL);
(git->obj, EFL_UI_IMAGE_ZOOMABLE_EVENT_LOADED_DETAIL, NULL);
}
}
}

View File

@ -620,12 +620,12 @@ _on_sub_obj_del(void *data, const Efl_Event *event)
if (_elm_widget_is(event->object))
{
if (_is_focused(event->object)) _parents_unfocus(sd->obj);
if (_is_focused(event->object)) _parents_unfocus(data);
}
if (event->object == sd->resize_obj)
{
/* already dels sub object */
elm_widget_resize_object_set(sd->obj, NULL);
elm_widget_resize_object_set(data, NULL);
}
else if (event->object == sd->hover_obj)
{
@ -633,8 +633,8 @@ _on_sub_obj_del(void *data, const Efl_Event *event)
}
else
{
if (!elm_widget_sub_object_del(sd->obj, event->object))
ERR("failed to remove sub object %p from %p\n", event->object, sd->obj);
if (!elm_widget_sub_object_del(data, event->object))
ERR("failed to remove sub object %p from %p\n", event->object, data);
}
}
@ -715,8 +715,6 @@ _obj_mouse_in(void *data,
EOLIAN static void
_efl_ui_widget_efl_canvas_group_group_add(Eo *obj, Elm_Widget_Smart_Data *priv)
{
priv->obj = obj;
priv->mirrored_auto_mode = EINA_TRUE; /* will follow system locale
* settings */
priv->focus_move_policy_auto_mode = EINA_TRUE;
@ -791,9 +789,9 @@ _efl_ui_widget_efl_canvas_group_group_del(Eo *obj, Elm_Widget_Smart_Data *sd)
}
static void
_smart_reconfigure(Elm_Widget_Smart_Data *sd)
_smart_reconfigure(Eo *obj, Elm_Widget_Smart_Data *sd)
{
Eina_Rect geom = efl_gfx_entity_geometry_get(sd->obj);
Eina_Rect geom = efl_gfx_entity_geometry_get(obj);
if (sd->resize_obj)
{
@ -808,7 +806,7 @@ _smart_reconfigure(Elm_Widget_Smart_Data *sd)
efl_gfx_entity_geometry_set(sd->bg, geom);
}
if (sd->has_shadow)
_elm_widget_shadow_update(sd->obj);
_elm_widget_shadow_update(obj);
}
EOLIAN static void
@ -825,7 +823,7 @@ _efl_ui_widget_efl_gfx_entity_position_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart
efl_gfx_entity_position_set(sd->bg, pos);
if (sd->has_shadow)
_elm_widget_shadow_update(sd->obj);
_elm_widget_shadow_update(obj);
efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
}
@ -844,7 +842,7 @@ _efl_ui_widget_efl_gfx_entity_size_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Dat
efl_gfx_entity_size_set(sd->bg, sz);
if (sd->has_shadow)
_elm_widget_shadow_update(sd->obj);
_elm_widget_shadow_update(obj);
efl_gfx_entity_size_set(efl_super(obj, MY_CLASS), sz);
}
@ -1642,7 +1640,7 @@ _efl_ui_widget_resize_object_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eo *sobj)
elm_widget_sub_object_add(obj, sobj);
evas_object_smart_member_add(sobj, obj);
_smart_reconfigure(sd);
_smart_reconfigure(obj, sd);
}
/*
@ -1666,7 +1664,7 @@ elm_widget_hover_object_set(Eo *obj, Evas_Object *sobj)
if (sd->hover_obj)
{
_callbacks_add(sobj, obj);
_smart_reconfigure(sd);
_smart_reconfigure(obj, sd);
}
}
@ -5201,11 +5199,10 @@ elm_widget_show_region_set(Eo *obj, Eina_Rect sr, Eina_Bool forceshow)
}
}
}
child_obj = obj;
do
{
parent_obj = sd->parent_obj;
child_obj = sd->obj;
if ((!parent_obj) || (!_elm_widget_is(parent_obj))) break;
sd = efl_data_scope_get(parent_obj, MY_CLASS);
if (!sd) break;
@ -5219,6 +5216,7 @@ elm_widget_show_region_set(Eo *obj, Eina_Rect sr, Eina_Bool forceshow)
if (sd->on_show_region)
sd->on_show_region(sd->on_show_region_data, parent_obj, sr);
child_obj = parent_obj;
}
while (parent_obj);
}
@ -5664,7 +5662,7 @@ _efl_ui_widget_bg_get(const Efl_Ui_Widget *obj)
sd->bg = bg_obj;
efl_canvas_group_member_add((Eo *)obj, sd->bg);
evas_object_stack_below(sd->bg, sd->resize_obj);
_smart_reconfigure(sd);
_smart_reconfigure((Eo*)obj, sd);
}
return bg_obj;
@ -5796,7 +5794,7 @@ _efl_ui_property_bind_clean(Eo *obj EINA_UNUSED,
}
static void
_efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
_efl_ui_property_bind_get(Eo *obj, Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
{
Eina_Value *value;
Eina_Future *f;
@ -5807,7 +5805,7 @@ _efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
if (!pd->properties.model) return ;
value = efl_model_property_get(pd->properties.model, prop->property);
target = prop->part ? efl_part(pd->obj, prop->part) : pd->obj;
target = prop->part ? efl_part(obj, prop->part) : obj;
fprintf(stderr, "setting: %s for %s from %s\n",
eina_value_to_string(value), prop->property, efl_debug_name_get(pd->properties.model));
@ -5820,22 +5818,22 @@ _efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
if (prop->f) eina_future_cancel(prop->f);
f = efl_model_property_set(pd->properties.model, prop->property,
eina_value_error_new(err));
prop->f = efl_future_then(pd->obj, f, .free = _efl_ui_property_bind_clean, .data = prop);
prop->f = efl_future_then(obj, f, .free = _efl_ui_property_bind_clean, .data = prop);
}
static void
_efl_ui_property_bind_set(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
_efl_ui_property_bind_set(Eo *obj, Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
{
Eina_Value value;
Eina_Future *f;
Eo *target;
target = prop->part ? efl_part(pd->obj, prop->part) : pd->obj;
target = prop->part ? efl_part(obj, prop->part) : obj;
value = efl_property_reflection_get(target, prop->key);
if (prop->f) eina_future_cancel(prop->f);
f = efl_model_property_set(pd->properties.model, prop->property, eina_value_dup(&value));
prop->f = efl_future_then(pd->obj, f, .free = _efl_ui_property_bind_clean, .data = prop);
prop->f = efl_future_then(obj, f, .free = _efl_ui_property_bind_clean, .data = prop);
eina_value_flush(&value);
}
@ -5843,7 +5841,7 @@ static void
_efl_ui_model_property_bind_changed(void *data, const Efl_Event *event)
{
Efl_Model_Property_Event *evt = event->info;
Efl_Ui_Widget_Data *pd = data;
ELM_WIDGET_DATA_GET(data, pd);
Eina_Array_Iterator it;
const char *prop;
unsigned int i;
@ -5853,7 +5851,7 @@ _efl_ui_model_property_bind_changed(void *data, const Efl_Event *event)
Efl_Ui_Property_Bound *lookup;
lookup = eina_hash_find(pd->properties.model_lookup, prop);
if (lookup) _efl_ui_property_bind_get(pd, lookup);
if (lookup) _efl_ui_property_bind_get(data, pd, lookup);
}
}
@ -5861,7 +5859,7 @@ static void
_efl_ui_view_property_bind_changed(void *data, const Efl_Event *event)
{
Efl_Ui_Property_Event *evt = event->info;
Efl_Ui_Widget_Data *pd = data;
ELM_WIDGET_DATA_GET(data, pd);
Eina_Array_Iterator it;
Eina_Stringshare *prop;
unsigned int i;
@ -5871,19 +5869,19 @@ _efl_ui_view_property_bind_changed(void *data, const Efl_Event *event)
Efl_Ui_Property_Bound *lookup;
lookup = eina_hash_find(pd->properties.view_lookup, prop);
if (lookup) _efl_ui_property_bind_set(pd, lookup);
if (lookup) _efl_ui_property_bind_set(data, pd, lookup);
}
}
static void
_efl_ui_widget_model_update(Efl_Ui_Widget_Data *pd)
_efl_ui_widget_model_update(Eo *obj, Efl_Ui_Widget_Data *pd)
{
Efl_Ui_Property_Bound *property;
Eina_Iterator *it;
it = eina_hash_iterator_data_new(pd->properties.model_lookup);
EINA_ITERATOR_FOREACH(it, property)
_efl_ui_property_bind_get(pd, property);
_efl_ui_property_bind_get(obj, pd, property);
eina_iterator_free(it);
}
@ -5897,23 +5895,23 @@ EFL_CALLBACKS_ARRAY_DEFINE(efl_ui_widget_model_provider_callbacks,
static void
_efl_ui_widget_model_provider_model_change(void *data, const Efl_Event *event)
{
Efl_Ui_Widget_Data *pd = data;
ELM_WIDGET_DATA_GET(data, pd);
efl_replace(&pd->properties.model,
efl_ui_view_model_get(pd->properties.provider));
_efl_ui_widget_model_update(pd);
_efl_ui_widget_model_update(data, pd);
efl_event_callback_call(pd->obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, event->info);
efl_event_callback_call(data, EFL_UI_VIEW_EVENT_MODEL_CHANGED, event->info);
}
static void
_efl_ui_widget_model_provider_invalidate(void *data, const Efl_Event *event EINA_UNUSED)
{
Efl_Ui_Widget_Data *pd = data;
ELM_WIDGET_DATA_GET(data, pd);
efl_event_callback_array_del(pd->properties.provider,
efl_ui_widget_model_provider_callbacks(),
pd);
data);
efl_replace(&pd->properties.provider, NULL);
efl_replace(&pd->properties.model, NULL);
}
@ -5932,7 +5930,7 @@ _efl_ui_widget_model_register(Eo *obj, Efl_Ui_Widget_Data *pd)
if (!pd->properties.provider) return ;
efl_event_callback_array_add(pd->properties.provider,
efl_ui_widget_model_provider_callbacks(),
pd);
obj);
efl_replace(&pd->properties.model,
efl_ui_view_model_get(pd->properties.provider));
@ -5948,9 +5946,9 @@ _efl_ui_widget_model_register(Eo *obj, Efl_Ui_Widget_Data *pd)
if (!pd->properties.model_lookup) return ;
efl_event_callback_add(pd->properties.model, EFL_MODEL_EVENT_PROPERTIES_CHANGED,
_efl_ui_model_property_bind_changed, pd);
_efl_ui_model_property_bind_changed, obj);
efl_event_callback_add(obj, EFL_UI_PROPERTY_BIND_EVENT_PROPERTIES_CHANGED,
_efl_ui_view_property_bind_changed, pd);
_efl_ui_view_property_bind_changed, obj);
pd->properties.registered = EINA_TRUE;
}
@ -5961,15 +5959,15 @@ _efl_ui_widget_model_unregister(Eo *obj, Efl_Ui_Widget_Data *pd)
{
// Remove any existing handler that might exist for any reason
efl_event_callback_del(pd->properties.model, EFL_MODEL_EVENT_PROPERTIES_CHANGED,
_efl_ui_model_property_bind_changed, pd);
_efl_ui_model_property_bind_changed, obj);
efl_event_callback_del(obj, EFL_UI_PROPERTY_BIND_EVENT_PROPERTIES_CHANGED,
_efl_ui_view_property_bind_changed, pd);
_efl_ui_view_property_bind_changed, obj);
pd->properties.registered = EINA_FALSE;
}
// Invalidate must be called before setting a new model and even if no model is registered
if (pd->properties.provider)
_efl_ui_widget_model_provider_invalidate(pd, NULL);
_efl_ui_widget_model_provider_invalidate(obj, NULL);
}
static Eina_Error
@ -6001,7 +5999,7 @@ _efl_ui_property_bind(Eo *widget, Eo *target, Efl_Ui_Widget_Data *pd,
eina_hash_direct_add(pd->properties.model_lookup, prop->property, prop);
eina_hash_direct_add(pd->properties.view_lookup, prop->key, prop);
_efl_ui_property_bind_get(pd, prop);
_efl_ui_property_bind_get(widget, pd, prop);
efl_event_callback_call(widget, EFL_UI_PROPERTY_BIND_EVENT_PROPERTY_BOUND, (void*) prop->key);
// In case of part, we emit it also on the part so that the part too can act on it
@ -6040,7 +6038,7 @@ _efl_ui_widget_efl_ui_view_model_set(Eo *obj,
if (ev.current == pd->properties.model)
efl_event_callback_call(obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, &ev);
if (pd->properties.model) _efl_ui_widget_model_update(pd);
if (pd->properties.model) _efl_ui_widget_model_update(obj, pd);
efl_unref(ev.current);
efl_unref(ev.previous);

View File

@ -3192,18 +3192,18 @@ _name_list_cb(void *data,
sd->src_name->name_list_parse_cb(name_list);
INF("Name List request success address");
if (name_list->cb)
name_list->cb(name_list->data, wd->obj,
name_list->cb(name_list->data, sd->obj,
name_list->names);
efl_event_callback_legacy_call
(wd->obj, ELM_MAP_EVENT_NAME_LOADED, NULL);
(sd->obj, ELM_MAP_EVENT_NAME_LOADED, NULL);
}
else
{
ERR("Name List request failed: %d", status);
if (name_list->cb)
name_list->cb(name_list->data, wd->obj, NULL);
name_list->cb(name_list->data, sd->obj, NULL);
efl_event_callback_legacy_call
(wd->obj, ELM_MAP_EVENT_NAME_LOADED_FAIL, NULL);
(sd->obj, ELM_MAP_EVENT_NAME_LOADED_FAIL, NULL);
}
edje_object_signal_emit(wd->resize_obj,
@ -3306,7 +3306,7 @@ _name_list_request(const Evas_Object *obj,
fname = _prepare_download();
url = sd->src_name->url_cb
(wd->obj, method, address, lon, lat);
(obj, method, address, lon, lat);
if (!url)
{
ERR("Name URL is NULL");
@ -3335,7 +3335,7 @@ _name_list_request(const Evas_Object *obj,
free(fname);
efl_event_callback_legacy_call
(wd->obj, ELM_MAP_EVENT_NAME_LOAD, name_list->names);
((Eo*)obj, ELM_MAP_EVENT_NAME_LOAD, name_list->names);
edje_object_signal_emit(wd->resize_obj,
"elm,state,busy,start", "elm");
return name_list->names;

View File

@ -395,7 +395,7 @@ _parent_del_cb(void *data,
ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
evas_object_event_callback_del_full
(obj, EVAS_CALLBACK_RESIZE, _parent_resize_cb, wd->obj);
(obj, EVAS_CALLBACK_RESIZE, _parent_resize_cb, data);
sd->parent = NULL;
}

View File

@ -139,7 +139,7 @@ _elm_prefs_save(void *data)
elm_prefs_data_save(sd->prefs_data, NULL, NULL);
efl_event_callback_legacy_call
(wd->obj, ELM_PREFS_EVENT_PAGE_SAVED, (char *)sd->root->name);
(data, ELM_PREFS_EVENT_PAGE_SAVED, (char *)sd->root->name);
}
sd->dirty = EINA_FALSE;
@ -303,7 +303,7 @@ _elm_prefs_item_changed_report(Eo *obj,
snprintf(buf, sizeof(buf), "%s:%s", it->page->name, it->name);
efl_event_callback_legacy_call
(wd->obj, ELM_PREFS_EVENT_ITEM_CHANGED, buf);
(obj, ELM_PREFS_EVENT_ITEM_CHANGED, buf);
}
static Elm_Prefs_Item_Node *
@ -403,7 +403,7 @@ _prefs_data_autosaved_cb(void *cb_data,
ELM_WIDGET_DATA_GET_OR_RETURN(cb_data, wd);
efl_event_callback_legacy_call
(wd->obj, ELM_PREFS_EVENT_PAGE_SAVED, event_info);
(cb_data, ELM_PREFS_EVENT_PAGE_SAVED, event_info);
sd->dirty = EINA_FALSE;
}
@ -533,7 +533,7 @@ _item_changed_cb(Evas_Object *it_obj)
if (it->type == ELM_PREFS_TYPE_ACTION)
{
efl_event_callback_legacy_call
(wd->obj, ELM_PREFS_EVENT_ACTION, buf);
(it->prefs, ELM_PREFS_EVENT_ACTION, buf);
return;
}

View File

@ -321,7 +321,6 @@ typedef void (*Elm_Access_On_Highlight_Cb)(void *data);
*/
typedef struct _Elm_Widget_Smart_Data
{
Evas_Object *obj; /**< object pointer for this widget smart data */
Evas_Object *parent_obj; /**< parent object of a widget in the elementary tree */
Eina_List *subobjs; /**< list of widgets' sub objects in the elementary tree */
Evas_Object *resize_obj; /**< an unique object for each widget that shows the look of a widget. Resize object's geometry is same as the widget. This resize object is different from that of window's resize object. */