From 5e5d86df3614043d8e62f19a658ba3249cdee442 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 30 Jul 2012 07:14:33 +0000 Subject: [PATCH] elementary: add thaw/freeze to Elm_Layout and use it in Elm_Calendar. NOTE: This improve calendar performance quite a lot, but a better improvement would be to populate the object when we really need it. I don't know how to do that in current Elementary source code. Reason for another expected massive improvement is that every time you set a property on an Elm_Calendar trigger a populate and that one is costly (Around 6 populates call per Elm_Calendar in our code example, meaning doing it could give us a 6 times boost...). SVN revision: 74553 --- legacy/elementary/ChangeLog | 3 ++ legacy/elementary/NEWS | 1 + legacy/elementary/src/lib/elm_calendar.c | 21 +++++++++++ legacy/elementary/src/lib/elm_layout.c | 44 +++++++++++++++++++++++- legacy/elementary/src/lib/elm_layout.h | 28 +++++++++++++++ legacy/elementary/src/lib/elm_widget.h | 2 ++ 6 files changed, 98 insertions(+), 1 deletion(-) diff --git a/legacy/elementary/ChangeLog b/legacy/elementary/ChangeLog index ff5d0a07ee..e982ae050e 100644 --- a/legacy/elementary/ChangeLog +++ b/legacy/elementary/ChangeLog @@ -354,3 +354,6 @@ * Patch in incomplete access supoprt in popup. +2012-07-30 Cedric Bail + + * Allow freeze/thaw on Elm_Layout and reduce number of object update. diff --git a/legacy/elementary/NEWS b/legacy/elementary/NEWS index 679088db9f..9ed0fa8438 100644 --- a/legacy/elementary/NEWS +++ b/legacy/elementary/NEWS @@ -31,6 +31,7 @@ Fixes: Improvements: * Allocate once and reuse Evas_Map. + * Allow freeze/thaw on Elm_Layout and reduce number of object update. Removal: diff --git a/legacy/elementary/src/lib/elm_calendar.c b/legacy/elementary/src/lib/elm_calendar.c index 0820bb6048..a172e38b4b 100644 --- a/legacy/elementary/src/lib/elm_calendar.c +++ b/legacy/elementary/src/lib/elm_calendar.c @@ -269,6 +269,8 @@ _populate(Evas_Object *obj) ELM_CALENDAR_DATA_GET(obj, sd); + elm_layout_freeze(obj); + if (sd->today_it > 0) _not_today(sd); maxdays = _maxdays_get(&sd->shown_time); @@ -433,6 +435,8 @@ _populate(Evas_Object *obj) break; } } + + elm_layout_thaw(obj); } static void @@ -442,12 +446,16 @@ _set_headers(Evas_Object *obj) int i; ELM_CALENDAR_DATA_GET(obj, sd); + elm_layout_freeze(obj); + for (i = 0; i < ELM_DAY_LAST; i++) { part[3] = i + '0'; elm_layout_text_set (obj, part, sd->weekdays[(i + sd->first_week_day) % ELM_DAY_LAST]); } + + elm_layout_thaw(obj); } static Eina_Bool @@ -458,9 +466,13 @@ _elm_calendar_smart_theme(Evas_Object *obj) if (!ELM_WIDGET_CLASS(_elm_calendar_parent_sc)->theme(obj)) return EINA_FALSE; + elm_layout_freeze(obj); + _set_headers(obj); _populate(obj); + elm_layout_thaw(obj); + edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj); elm_layout_sizing_eval(obj); @@ -803,11 +815,15 @@ _elm_calendar_smart_add(Evas_Object *obj) elm_widget_can_focus_set(obj, EINA_TRUE); + elm_layout_freeze(obj); + elm_layout_theme_set(obj, "calendar", "base", elm_object_style_get(obj)); _set_headers(obj); _populate(obj); + elm_layout_thaw(obj); + elm_layout_sizing_eval(obj); } @@ -1086,8 +1102,13 @@ elm_calendar_first_day_of_week_set(Evas_Object *obj, if (sd->first_week_day != day) { sd->first_week_day = day; + + elm_layout_freeze(obj); + _set_headers(obj); _populate(obj); + + elm_layout_thaw(obj); } } diff --git a/legacy/elementary/src/lib/elm_layout.c b/legacy/elementary/src/lib/elm_layout.c index 63990a50e6..5410fab047 100644 --- a/legacy/elementary/src/lib/elm_layout.c +++ b/legacy/elementary/src/lib/elm_layout.c @@ -108,6 +108,7 @@ _on_sub_object_size_hint_change(void *data, void *event_info __UNUSED__) { ELM_LAYOUT_DATA_GET(data, sd); + if (ELM_WIDGET_DATA(sd)->frozen) return ; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(data); } @@ -451,6 +452,7 @@ _elm_layout_smart_sub_object_del(Evas_Object *obj, break; } + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -655,7 +657,10 @@ _elm_layout_smart_text_set(Evas_Object *obj, _text_signal_emit(sd, sub_d, !!text); - ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); + if (!ELM_WIDGET_DATA(sd)->frozen) + { + ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); + } if (_elm_config->access_mode == ELM_ACCESS_MODE_ON && ELM_WIDGET_DATA(sd)->can_access && !(sub_d->obj)) @@ -734,6 +739,7 @@ _elm_layout_smart_content_set(Evas_Object *obj, _icon_signal_emit(sd, sub_d, EINA_TRUE); } + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -827,6 +833,7 @@ _elm_layout_smart_box_append(Evas_Object *obj, sub_d->obj = child; sd->subs = eina_list_append(sd->subs, sub_d); + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -862,6 +869,7 @@ _elm_layout_smart_box_prepend(Evas_Object *obj, sub_d->obj = child; sd->subs = eina_list_prepend(sd->subs, sub_d); + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -913,6 +921,7 @@ _elm_layout_smart_box_insert_before(Evas_Object *obj, evas_object_event_callback_add ((Evas_Object *)reference, EVAS_CALLBACK_DEL, _box_reference_del, sub_d); + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -951,6 +960,7 @@ _elm_layout_smart_box_insert_at(Evas_Object *obj, sub_d->p.box.pos = pos; sd->subs = eina_list_append(sd->subs, sub_d); + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -1093,6 +1103,7 @@ _elm_layout_smart_table_pack(Evas_Object *obj, sub_d->p.table.rowspan = rowspan; sd->subs = eina_list_append(sd->subs, sub_d); + if (ELM_WIDGET_DATA(sd)->frozen) return EINA_TRUE; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); return EINA_TRUE; @@ -1199,6 +1210,7 @@ _elm_layout_smart_add(Evas_Object *obj) (ELM_WIDGET_DATA(priv)->resize_obj, "size,eval", "elm", _on_size_evaluate_signal, obj); + if (ELM_WIDGET_DATA(priv)->frozen) return ; ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(priv)->api)->sizing_eval(obj); } @@ -1603,6 +1615,36 @@ elm_layout_sizing_eval(Evas_Object *obj) ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); } +EAPI int +elm_layout_freeze(Evas_Object *obj) +{ + ELM_LAYOUT_CHECK(obj) 0; + ELM_LAYOUT_DATA_GET(obj, sd); + + if ((ELM_WIDGET_DATA(sd)->frozen)++ != 0) + return ELM_WIDGET_DATA(sd)->frozen; + + edje_object_freeze(ELM_WIDGET_DATA(sd)->resize_obj); + + return 1; +} + +EAPI int +elm_layout_thaw(Evas_Object *obj) +{ + ELM_LAYOUT_CHECK(obj) 0; + ELM_LAYOUT_DATA_GET(obj, sd); + + if (--(ELM_WIDGET_DATA(sd)->frozen) != 0) + return ELM_WIDGET_DATA(sd)->frozen; + + edje_object_thaw(ELM_WIDGET_DATA(sd)->resize_obj); + + ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); + + return 0; +} + EAPI Eina_Bool elm_layout_part_cursor_set(Evas_Object *obj, const char *part_name, diff --git a/legacy/elementary/src/lib/elm_layout.h b/legacy/elementary/src/lib/elm_layout.h index e36d810f0a..0f367d4981 100644 --- a/legacy/elementary/src/lib/elm_layout.h +++ b/legacy/elementary/src/lib/elm_layout.h @@ -189,6 +189,34 @@ EAPI Evas_Object *elm_layout_add(Evas_Object *parent); */ EAPI Eina_Bool elm_layout_file_set(Evas_Object *obj, const char *file, const char *group); +/** + * @brief Freezes the Elementary layout object. + * + * @param obj A handle to an Elementary layout object. + * @return The frozen state or 0 on Error + * + * This function puts all changes on hold. Successive freezes will + * nest, requiring an equal number of thaws. + * + * @see elm_layout_thaw() + */ +EAPI int elm_layout_freeze(Evas_Object *obj); + +/** + * @brief Thaws the Elementary object. + * + * @param obj A handle to an Elementary layout object. + * @return The frozen state or 0 if the object is not frozen or on error. + * + * This function thaws the given Edje object and the Elementary sizing calc. + * + * @note: If sucessives freezes were done, an equal number of + * thaws will be required. + * + * @see elm_layout_freeze() + */ +EAPI int elm_layout_thaw(Evas_Object *obj); + /** * Set the edje group from the elementary theme that will be used as layout * diff --git a/legacy/elementary/src/lib/elm_widget.h b/legacy/elementary/src/lib/elm_widget.h index 672e6d5f9e..6f9133e3f6 100644 --- a/legacy/elementary/src/lib/elm_widget.h +++ b/legacy/elementary/src/lib/elm_widget.h @@ -487,6 +487,8 @@ typedef struct _Elm_Widget_Smart_Data Evas_Coord *w, Evas_Coord *h); + int frozen; + Eina_Bool drag_x_locked : 1; Eina_Bool drag_y_locked : 1;