edje: load edje seat callback only when necessary.
authorCedric Bail <cedric.bail@free.fr>
Thu, 31 Oct 2019 13:17:46 +0000 (09:17 -0400)
committerWonki Kim <wonki_.kim@samsung.com>
Mon, 11 Nov 2019 02:20:41 +0000 (11:20 +0900)
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
src/lib/edje/edje_legacy.c
src/lib/edje/edje_load.c
src/lib/edje/edje_private.h
src/lib/edje/edje_program.c

index 6353306..18a8c89 100644 (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);
@@ -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();
index a72b951..5ac97c7 100644 (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 *
index d82319a..268aaf3 100644 (file)
@@ -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);
index 15d2b37..d376cd6 100644 (file)
@@ -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);
index 5fce736..cd6d87a 100644 (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