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
This commit is contained in:
Cedric Bail 2019-10-31 09:17:46 -04:00 committed by Mike Blumenkrantz
parent 27e1bf2fe3
commit e502da8345
5 changed files with 56 additions and 20 deletions

View File

@ -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);
@ -367,12 +367,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);
@ -382,6 +384,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);
return edc;

View File

@ -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 *

View File

@ -670,12 +670,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)
{
@ -868,7 +870,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);

View File

@ -1178,6 +1178,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
@ -1790,10 +1791,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;
@ -1802,7 +1799,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
@ -2444,7 +2447,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);
@ -2631,6 +2635,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);

View File

@ -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