From 7c7c88683c9ec9f7e8036754d306103c8d18552e Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Thu, 31 Oct 2019 09:17:46 -0400 Subject: [PATCH] edje: load edje seat callback only when necessary. Summary: This reduce in elementary_test the number of callback registered on the canvas from hundreds to around 10. Depends on D10486 Reviewers: zmike, raster, bu5hm4n, Hermet Reviewed By: zmike Subscribers: #reviewers, #committers Tags: #efl Maniphest Tasks: T8321 Differential Revision: https://phab.enlightenment.org/D10487 --- src/lib/edje/edje_cache.c | 37 ++++++++++++++++++++++++++++--------- src/lib/edje/edje_legacy.c | 2 +- src/lib/edje/edje_load.c | 7 +++++-- src/lib/edje/edje_private.h | 15 ++++++++++----- src/lib/edje/edje_program.c | 15 ++++++++++++--- 5 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/lib/edje/edje_cache.c b/src/lib/edje/edje_cache.c index 6353306..18a8c89 100644 --- a/src/lib/edje/edje_cache.c +++ b/src/lib/edje/edje_cache.c @@ -140,9 +140,9 @@ _edje_programs_patterns_init(Edje_Part_Collection *edc) j = 0; /* FIXME: Build specialized data type for each case */ -#define EDJE_LOAD_PROGRAMS_ADD(Array, Edc, It, Git, All) \ - for (It = 0; It < Edc->programs.Array##_count; ++It, ++Git) \ - All[Git] = Edc->programs.Array[It]; +#define EDJE_LOAD_PROGRAMS_ADD(Array, Edc, It, Git, All) \ + for (It = 0; It < Edc->programs.Array##_count; ++It, ++Git) \ + All[Git] = Edc->programs.Array[It]; EDJE_LOAD_PROGRAMS_ADD(fnmatch, edc, i, j, all); EDJE_LOAD_PROGRAMS_ADD(strncmp, edc, i, j, all); @@ -369,12 +369,14 @@ _edje_file_coll_open(Edje_File *edf, const char *coll) { edc->patterns.table_programs_size = n; -#define EDJE_LOAD_BUILD_TABLE(Array, Edc, It, Tmp) \ - for (It = 0; It < Edc->programs.Array##_count; ++It) \ - { \ - Tmp = Edc->programs.Array[It]; \ - Edc->patterns.table_programs[Tmp->id] = Tmp; \ - } +#define EDJE_LOAD_BUILD_TABLE(Array, Edc, It, Tmp) \ + for (It = 0; It < Edc->programs.Array##_count; ++It) \ + { \ + Tmp = Edc->programs.Array[It]; \ + Edc->patterns.table_programs[Tmp->id] = Tmp; \ + if (!Edc->need_seat && Tmp->signal && !strncmp(Tmp->signal, "seat,", 5)) \ + Edc->need_seat = EINA_TRUE; \ + } EDJE_LOAD_BUILD_TABLE(fnmatch, edc, i, pr); EDJE_LOAD_BUILD_TABLE(strcmp, edc, i, pr); @@ -384,6 +386,23 @@ _edje_file_coll_open(Edje_File *edf, const char *coll) } } + /* Search for the use of allowed seat used by part if we still do not know if seat are needed. */ + if (!edc->need_seat) + { + unsigned int i; + + for (i = 0; i < edc->parts_count; i++) + { + Edje_Part *part = edc->parts[i]; + + if (part->allowed_seats) + { + edc->need_seat = EINA_TRUE; + break; + } + } + } + _edje_part_collection_fix(edc); traceTaskEnd(); diff --git a/src/lib/edje/edje_legacy.c b/src/lib/edje/edje_legacy.c index a72b951..5ac97c7 100644 --- a/src/lib/edje/edje_legacy.c +++ b/src/lib/edje/edje_legacy.c @@ -78,7 +78,7 @@ edje_object_signal_callback_add(Evas_Object *obj, const char *emission, const ch ed = _edje_fetch(obj); if (!ed || ed->delete_me) return; - _edje_object_signal_callback_add(ed, emission, source, func, NULL, NULL, data); + _edje_object_signal_callback_add(obj, ed, emission, source, func, NULL, NULL, data); } EAPI void * diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index d82319a..268aaf3 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -672,12 +672,14 @@ _edje_device_canvas_del(void *data, const Efl_Event *event) efl_event_callback_array_del(event->object, edje_device_callbacks(), ed); } -static void +void _edje_devices_add(Edje *ed, Evas *tev) { const Eina_List *devices, *l; Efl_Input_Device *dev; + ed->need_seat = EINA_TRUE; + devices = evas_device_list(tev, NULL); EINA_LIST_FOREACH(devices, l, dev) { @@ -870,7 +872,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch } /* handle multiseat stuff */ - _edje_devices_add(ed, tev); + if (ed->collection->need_seat || ed->need_seat) + _edje_devices_add(ed, tev); /* colorclass stuff */ _edje_process_colorclass(ed); diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 15d2b37..d376cd6 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -1211,6 +1211,7 @@ struct _Edje_Part_Collection unsigned char script_recursion; /* permits unsafe Embryo->EDC->Embryo scripting */ unsigned char use_custom_seat_names; unsigned char checked : 1; + unsigned char need_seat : 1; /* will be one when the collection use seat in any of its part */ }; struct _Edje_Part_Dragable @@ -1871,10 +1872,6 @@ struct _Edje Eina_Bool has_entries : 1; Eina_Bool entries_inited : 1; -#ifdef EDJE_CALC_CACHE - Eina_Bool text_part_change : 1; - Eina_Bool all_part_change : 1; -#endif Eina_Bool have_mapped_part : 1; Eina_Bool recalc_call : 1; Eina_Bool update_hints : 1; @@ -1883,7 +1880,13 @@ struct _Edje Eina_Bool canvas_animator : 1; Eina_Bool has_state_clip : 1; Eina_Bool has_recalc_event_cb : 1; + Eina_Bool has_content_change_event_cb : 1; + Eina_Bool need_seat : 1; /* Will be true when an event handler that expect seat is registered on the object. */ +#ifdef EDJE_CALC_CACHE + Eina_Bool text_part_change : 1; + Eina_Bool all_part_change : 1; +#endif }; struct _Edje_Calc_Params_Map @@ -2597,7 +2600,8 @@ const Eina_Inarray *edje_match_signal_source_hash_get(const char *signal, const char *source, const Eina_Rbtree *tree); void edje_match_signal_source_free(Edje_Signal_Source_Char *key, void *data); -Eina_Bool _edje_object_signal_callback_add(Edje *ed, const char *emission, const char *source, +Eina_Bool _edje_object_signal_callback_add(Evas_Object *obj, Edje *ed, + const char *emission, const char *source, Edje_Signal_Cb func_legacy, Efl_Signal_Cb func_eo, Eina_Free_Cb func_free_cb, void *data); @@ -2788,6 +2792,7 @@ void _edje_focused_part_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp) Edje_Real_Part *_edje_focused_part_get(Edje *ed, const char *seat_name); void _edje_part_focus_set(Edje *ed, const char *seat_name, Edje_Real_Part *rp); +void _edje_devices_add(Edje *ed, Evas *tev); Eina_Stringshare *_edje_seat_name_get(Edje *ed, Efl_Input_Device *device); Efl_Input_Device *_edje_seat_get(Edje *ed, Eina_Stringshare *name); Eina_Bool _edje_part_allowed_seat_find(Edje_Real_Part *rp, const char *seat_name); diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c index 5fce736..cd6d87a 100644 --- a/src/lib/edje/edje_program.c +++ b/src/lib/edje/edje_program.c @@ -237,7 +237,8 @@ edje_transition_duration_factor_set(double scale) } Eina_Bool -_edje_object_signal_callback_add(Edje *ed, const char *emission, const char *source, +_edje_object_signal_callback_add(Evas_Object *obj, Edje *ed, + const char *emission, const char *source, Edje_Signal_Cb func_legacy, Efl_Signal_Cb func_eo, Eina_Free_Cb func_free_cb, void *data) { @@ -253,6 +254,14 @@ _edje_object_signal_callback_add(Edje *ed, const char *emission, const char *sou sig = eina_stringshare_add(emission); src = eina_stringshare_add(source); + // Only load seat callbacks and trigger events just before we might need them. + if (!ed->need_seat && sig && !strncmp(sig, "seat,", 5)) + { + ed->need_seat = EINA_TRUE; + if (ed->collection) + _edje_devices_add(ed, evas_object_evas_get(obj)); + } + gp = (Edje_Signal_Callback_Group *) ed->callbacks; ok = _edje_signal_callback_push(gp, sig, src, func_legacy, func_eo, func_free_cb, data, EINA_TRUE); @@ -269,13 +278,13 @@ edje_object_propagate_callback_add(Evas_Object *obj, Efl_Signal_Cb func, void *d ed = _edje_fetch(obj); if (!ed || ed->delete_me) return; - _edje_object_signal_callback_add(ed, "*", "*", func, NULL, NULL, data); + _edje_object_signal_callback_add(obj, ed, "*", "*", func, NULL, NULL, data); } Eina_Bool _efl_canvas_layout_efl_layout_signal_signal_callback_add(Eo *obj EINA_UNUSED, Edje *ed, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb) { - return _edje_object_signal_callback_add(ed, emission, source, NULL, func, func_free_cb, func_data); + return _edje_object_signal_callback_add(obj, ed, emission, source, NULL, func, func_free_cb, func_data); } Eina_Bool -- 2.7.4