zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e502da834592b5e13b09a509fd5c9c0ac9d093d7

commit e502da834592b5e13b09a509fd5c9c0ac9d093d7
Author: Cedric Bail <cedric.b...@free.fr>
Date:   Thu Oct 31 09:17:46 2019 -0400

    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 20ae174f5d..64eb6ad5ec 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);
@@ -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;
diff --git a/src/lib/edje/edje_legacy.c b/src/lib/edje/edje_legacy.c
index a72b951058..5ac97c706c 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 0c43475bf5..92713a2325 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -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);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index f6ffa481c6..d12c1d128f 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -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);
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index d1a398d89a..b047031da1 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

-- 


Reply via email to