zmike pushed a commit to branch master.

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

commit 3175690466bc441c3fb2b55145fb0985b0e97f10
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Mon Oct 14 09:29:37 2019 -0400

    evas/smart: inhibit evas-internal smart callbacks when there are no 
subscribers
    
    Summary:
    we know these ahead of time since they're hardcoded, so we can block their
    emission just like we do for eo events
    
    ref T8321
    Depends on D10354
    
    Reviewers: cedric
    
    Reviewed By: cedric
    
    Subscribers: bu5hm4n, cedric, #reviewers, #committers
    
    Tags: #efl
    
    Maniphest Tasks: T8321
    
    Differential Revision: https://phab.enlightenment.org/D10355
---
 src/lib/evas/canvas/evas_callbacks.c    | 15 ++-------
 src/lib/evas/canvas/evas_object_smart.c | 60 +++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 12 deletions(-)

diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index 1f86f63168..65b78f2bcd 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -10,6 +10,7 @@ EVAS_MEMPOOL(_mp_pc);
 extern Eina_Hash* signals_hash_table;
 
 /* Legacy events, do not use anywhere */
+void _evas_object_smart_callback_call_internal(Evas_Object *eo_obj, const 
Efl_Event_Description *efl_event_desc);
 static const Efl_Event_Description _EVAS_OBJECT_EVENT_FREE = 
EFL_EVENT_DESCRIPTION("free");
 static const Efl_Event_Description _EVAS_OBJECT_EVENT_DEL = 
EFL_EVENT_DESCRIPTION("del");
 #define EVAS_OBJECT_EVENT_FREE (&(_EVAS_OBJECT_EVENT_FREE))
@@ -347,17 +348,6 @@ evas_event_callback_call(Evas *eo_e, Evas_Callback_Type 
type, void *event_info)
    efl_event_callback_legacy_call(eo_e, _legacy_evas_callback_table(type), 
event_info);
 }
 
-static void
-_evas_smart_callback_legacy_git_er_done(Evas_Object *eo_obj, const 
Efl_Event_Description *efl_event_desc)
-{
-   if (efl_event_desc == EFL_GFX_ENTITY_EVENT_POSITION_CHANGED)
-     evas_object_smart_callback_call(eo_obj, "move", NULL);
-   else if (efl_event_desc == EFL_GFX_ENTITY_EVENT_SIZE_CHANGED)
-     evas_object_smart_callback_call(eo_obj, "resize", NULL);
-   else if (efl_event_desc == EFL_GFX_ENTITY_EVENT_STACKING_CHANGED)
-     evas_object_smart_callback_call(eo_obj, "restack", NULL);
-}
-
 static void
 _evas_callback_legacy_smart_compatibility_do_it(Evas_Object *eo_obj, const 
Efl_Event_Description *efl_event_desc, void *event_info)
 {
@@ -408,7 +398,8 @@ evas_object_event_callback_call(Evas_Object *eo_obj, 
Evas_Object_Protected_Data
         type == EVAS_CALLBACK_MULTI_UP)
      _efl_canvas_gesture_manager_filter_event(e->gesture_manager, eo_obj, 
event_info);
 
-   _evas_smart_callback_legacy_git_er_done(eo_obj, efl_event_desc);
+   if (obj->is_smart)
+     _evas_object_smart_callback_call_internal(eo_obj, efl_event_desc);
 
    if (!_evas_object_callback_has_by_type(obj, type))
      goto nothing_here;
diff --git a/src/lib/evas/canvas/evas_object_smart.c 
b/src/lib/evas/canvas/evas_object_smart.c
index 3e5cba9771..7950545507 100644
--- a/src/lib/evas/canvas/evas_object_smart.c
+++ b/src/lib/evas/canvas/evas_object_smart.c
@@ -51,6 +51,9 @@ struct _Evas_Smart_Data
    Eina_Bool         clipped : 1; /* If true, smart clipped */
    Eina_Bool         data_nofree : 1; /* If true, do NOT free the data */
    Eina_Bool         constructed : 1; /* constructor finished */
+   Eina_Bool         cb_move : 1; /* has "move" cb added */
+   Eina_Bool         cb_resize : 1; /* has "resize" cb added */
+   Eina_Bool         cb_restack : 1; /* has "restack" cb added */
 };
 
 typedef struct
@@ -983,6 +986,35 @@ evas_object_smart_callback_add(Evas_Object *eo_obj, const 
char *event, Evas_Smar
          EVAS_CALLBACK_PRIORITY_DEFAULT, func, data);
 }
 
+static void
+_smart_cb_check(Evas_Smart_Data *o, const char *event)
+{
+   if (!o->cb_move)
+     {
+        if (eina_streq(event, "move"))
+          {
+             o->cb_move = EINA_TRUE;
+             return;
+          }
+     }
+   if (!o->cb_resize)
+     {
+        if (eina_streq(event, "resize"))
+          {
+             o->cb_resize = EINA_TRUE;
+             return;
+          }
+     }
+   if (!o->cb_restack)
+     {
+        if (eina_streq(event, "restack"))
+          {
+             o->cb_restack = EINA_TRUE;
+             return;
+          }
+     }
+}
+
 EAPI void
 evas_object_smart_callback_priority_add(Evas_Object *eo_obj, const char 
*event, Evas_Callback_Priority priority, Evas_Smart_Cb func, const void *data)
 {
@@ -996,6 +1028,7 @@ evas_object_smart_callback_priority_add(Evas_Object 
*eo_obj, const char *event,
    cb_info->func = func;
    cb_info->data = (void *)data;
    cb_info->event = eo_desc;
+   _smart_cb_check(o, event);
 
    o->callbacks = eina_inlist_append(o->callbacks,
         EINA_INLIST_GET(cb_info));
@@ -1069,6 +1102,33 @@ evas_object_smart_callback_call(Evas_Object *eo_obj, 
const char *event, void *ev
    efl_event_callback_legacy_call(eo_obj, eo_desc, event_info);
 }
 
+void
+_evas_object_smart_callback_call_internal(Evas_Object *eo_obj, const 
Efl_Event_Description *efl_event_desc)
+{
+   const char *event = NULL;
+   EVAS_OBJECT_SMART_GET_OR_RETURN(eo_obj);
+
+   if (efl_event_desc == EFL_GFX_ENTITY_EVENT_POSITION_CHANGED)
+     {
+        if (!o->cb_move) return;
+        event = "move";
+     }
+   else if (efl_event_desc == EFL_GFX_ENTITY_EVENT_SIZE_CHANGED)
+     {
+        if (!o->cb_resize) return;
+        event = "resize";
+     }
+   else if (efl_event_desc == EFL_GFX_ENTITY_EVENT_STACKING_CHANGED)
+     {
+        if (!o->cb_restack) return;
+        event = "restack";
+     }
+   else //invalidate
+     return;
+   const Efl_Event_Description *eo_desc = 
efl_object_legacy_only_event_description_get(event);
+   efl_event_callback_legacy_call(eo_obj, eo_desc, NULL);
+}
+
 EAPI Eina_Bool
 evas_object_smart_callbacks_descriptions_set(Eo *eo_obj, const 
Evas_Smart_Cb_Description *descriptions)
 {

-- 


Reply via email to