jpeg pushed a commit to branch master.

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

commit fd9cf1d3b628f70d66ec85a4f2433c675d9ad243
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Jul 6 16:29:20 2017 +0900

    evas: Make all EO canvas objects visible by default
    
    All legacy objects remain invisible by default. Any call to
    visible_set() will prevent the automatic show() to happen.
    
    show() will be done just before render time, which may be a
    bit too late in order to propagate the necessary changes.
    
    This may break some things where some objects are created
    internally using efl_add() instead of the legacy API, and
    the intent was not to show the object.
    
    @feature
---
 src/lib/evas/canvas/efl_canvas_object.eo |  1 +
 src/lib/evas/canvas/evas_object_image.c  |  2 +-
 src/lib/evas/canvas/evas_object_main.c   | 36 +++++++++++++++++++++++++++++---
 src/lib/evas/canvas/evas_render.c        | 25 ++++++++++++++++++++++
 src/lib/evas/include/evas_private.h      | 10 +++++++--
 5 files changed, 68 insertions(+), 6 deletions(-)

diff --git a/src/lib/evas/canvas/efl_canvas_object.eo 
b/src/lib/evas/canvas/efl_canvas_object.eo
index a284a43e93..b49a42addf 100644
--- a/src/lib/evas/canvas/efl_canvas_object.eo
+++ b/src/lib/evas/canvas/efl_canvas_object.eo
@@ -660,6 +660,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, 
Efl.Gfx.Stack, Efl.Animator,
    implements {
       Efl.Object.constructor;
       Efl.Object.destructor;
+      Efl.Object.finalize;
       Efl.Object.provider_find;
       Efl.Gfx.visible { get; set; }
       Efl.Gfx.color { get; set; }
diff --git a/src/lib/evas/canvas/evas_object_image.c 
b/src/lib/evas/canvas/evas_object_image.c
index 9d1440573d..269898c6b2 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -1443,7 +1443,7 @@ _efl_canvas_image_internal_efl_object_destructor(Eo 
*eo_obj, Evas_Image_Data *o
 {
    Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, 
EFL_CANVAS_OBJECT_CLASS);
 
-   if (obj->legacy)
+   if (obj->legacy.ctor)
      evas_object_image_video_surface_set(eo_obj, NULL);
    evas_object_image_free(eo_obj, obj);
    efl_destructor(efl_super(eo_obj, MY_CLASS));
diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index e0a3013edf..f1fef26b00 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -197,6 +197,27 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, 
Evas_Object_Protected_Data
    return eo_obj;
 }
 
+EOLIAN static Eo *
+_efl_canvas_object_efl_object_finalize(Eo *eo_obj, Evas_Object_Protected_Data 
*obj)
+{
+   Evas_Public_Data *e;
+
+   if (!EVAS_OBJECT_DATA_ALIVE(obj)) goto end;
+   if (obj->legacy.ctor) goto end;
+
+   if (obj->legacy.visible_set /* && ... */)
+     {
+        obj->legacy.finalized = EINA_TRUE;
+        goto end;
+     }
+
+   e = obj->layer->evas;
+   e->finalize_objects = eina_list_prepend(e->finalize_objects, eo_obj);
+
+end:
+   return efl_finalize(efl_super(eo_obj, MY_CLASS));
+}
+
 void
 evas_object_change_reset(Evas_Object_Protected_Data *obj)
 {
@@ -1833,6 +1854,9 @@ EOLIAN static void
 _efl_canvas_object_efl_gfx_visible_set(Eo *eo_obj, Evas_Object_Protected_Data 
*obj,
                                        Eina_Bool vis)
 {
+   if (!obj->legacy.visible_set)
+     obj->legacy.visible_set = EINA_TRUE;
+
    if (_evas_object_intercept_call_evas(obj, EVAS_OBJECT_INTERCEPT_CB_VISIBLE, 
1, vis))
      return;
 
@@ -1840,11 +1864,17 @@ _efl_canvas_object_efl_gfx_visible_set(Eo *eo_obj, 
Evas_Object_Protected_Data *o
    else _hide(eo_obj, obj);
 }
 
-static Eina_Bool
+EOLIAN static Eina_Bool
 _efl_canvas_object_efl_gfx_visible_get(Eo *eo_obj EINA_UNUSED,
                                        Evas_Object_Protected_Data *obj)
 {
-   if (obj->delete_me) return EINA_FALSE;
+   if (!EVAS_OBJECT_DATA_ALIVE(obj)) return EINA_FALSE;
+#if 0
+   // Try to return TRUE when an object is an EO object but not yet finalized.
+   // This is disabled as it leads to render bugs.
+   if (!obj->legacy.ctor && !obj->legacy.finalized && !obj->legacy.visible_set)
+     return EINA_TRUE;
+#endif
    return obj->cur->visible;
 }
 
@@ -2506,7 +2536,7 @@ EOLIAN static void
 _efl_canvas_object_legacy_ctor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
 {
    EINA_SAFETY_ON_FALSE_RETURN(!efl_finalized_get(eo_obj));
-   obj->legacy = EINA_TRUE;
+   obj->legacy.ctor = EINA_TRUE;
 }
 
 
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index 7d66296f01..aaa519b36d 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -2860,6 +2860,29 @@ end:
    eina_tiler_free(tiler);
 }
 
+static void
+evas_render_pre(Evas *eo_e, Evas_Public_Data *evas)
+{
+   Eo *eo_obj;
+
+   // Finalize EO objects now
+   eina_evlog("+render_pre_objects_finalize", eo_e, 0.0, NULL);
+
+   EINA_LIST_FREE(evas->finalize_objects, eo_obj)
+     {
+        Evas_Object_Protected_Data *obj;
+
+        obj = efl_data_scope_safe_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+        if (!EVAS_OBJECT_DATA_ALIVE(obj)) continue;
+        obj->legacy.finalized = EINA_TRUE;
+
+        if (!obj->legacy.visible_set)
+          efl_gfx_visible_set(eo_obj, EINA_TRUE);
+     }
+
+   eina_evlog("-render_pre_objects_finalize", eo_e, 0.0, NULL);
+}
+
 static Eina_Bool
 evas_render_updates_internal_loop(Evas *eo_e, Evas_Public_Data *evas,
                                   void *surface, void *context,
@@ -2881,6 +2904,8 @@ evas_render_updates_internal_loop(Evas *eo_e, 
Evas_Public_Data *evas,
    eina_evlog("+render_setup", eo_e, 0.0, NULL);
    RD(level, "  [--- UPDATE %i %i %ix%i\n", ux, uy, uw, uh);
 
+   evas_render_pre(eo_e, evas);
+
    off_x = cx - ux;
    off_y = cy - uy;
    /* build obscuring objects list (in order from bottom to top) */
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 3124f83c5c..5fc8e8486d 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -627,7 +627,7 @@ MAGIC_CHECK_FAILED(o, t, m)
 #define EVAS_OBJECT_LEGACY_API(_eo, ...) \
    do { Evas_Object_Protected_Data *_o = efl_data_scope_get(_eo, 
EFL_CANVAS_OBJECT_CLASS); \
       if (EINA_UNLIKELY(!_o)) return __VA_ARGS__; \
-      if (EINA_UNLIKELY(!_o->legacy)) { \
+      if (EINA_UNLIKELY(!_o->legacy.ctor)) { \
          char buf[1024]; snprintf(buf, sizeof(buf), "Calling legacy API on EO 
object '%s' is not permitted!", efl_class_name_get(_o->object)); \
          EINA_SAFETY_ERROR(buf); \
    } } while (0)
@@ -919,6 +919,7 @@ struct _Evas_Public_Data
    Eina_Array     image_unref_queue;
    Eina_Array     glyph_unref_queue;
    Eina_Array     texts_unref_queue;
+   Eina_List     *finalize_objects;
 
    struct {
       Evas_Post_Render_Job *jobs;
@@ -1249,7 +1250,6 @@ struct _Evas_Object_Protected_Data
    Eina_Bool                   child_has_map : 1;
    Eina_Bool                   efl_del_called : 1;
    Eina_Bool                   no_render : 1; // since 1.15
-   Eina_Bool                   legacy : 1; // used legacy constructor
    Eina_Bool                   clean_layer : 1; // destructor option
 
    Eina_Bool                   snapshot_needs_redraw : 1;
@@ -1258,6 +1258,12 @@ struct _Evas_Object_Protected_Data
    Eina_Bool                   gfx_map_has : 1;
    Eina_Bool                   gfx_map_update : 1;
 
+   struct {
+      Eina_Bool                ctor : 1; // used legacy constructor
+      Eina_Bool                visible_set : 1; // visibility manually set
+      Eina_Bool                finalized : 1; // object fully constructed
+   } legacy;
+
    struct  {
       Eina_Bool                pass_events : 1;
       Eina_Bool                pass_events_valid : 1;

-- 


Reply via email to