e_comp_object: introduce e_comp_object_render_update_lock/unlock 46/280346/2
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 16 Aug 2022 11:05:57 +0000 (20:05 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 29 Aug 2022 01:53:25 +0000 (01:53 +0000)
if e_comp_object_render_update_lock is called, enlightenment does not
update evas image object in job callback of compositing(_e_comp_cb_update)
until render_update_lock count is decreased zero.

this api does not prevent updating evas image object when
e_comp_object_dirty is directly called.

Change-Id: Ic0cec29a9c43ed9659b14e5bac88e276e66d5642

src/bin/e_comp_object.c
src/bin/e_comp_object.h

index 42cbd8fe3b05eb302330465c28e4ce614d1aec30..c7140e197b38e029b4c288e588592058924902c5 100644 (file)
@@ -167,6 +167,8 @@ typedef struct _E_Comp_Object
    tbm_surface_h        tbm_surface;
    E_Comp_Image_Filter  image_filter;
    Eina_Bool            set_mouse_callbacks;
+
+   int                  render_update_lock;
 } E_Comp_Object;
 
 typedef struct _E_Input_Rect_Data
@@ -206,6 +208,7 @@ static Eina_Inlist *_e_comp_object_hooks[] =
    [E_COMP_OBJECT_HOOK_LAYER_SET] = NULL,
    [E_COMP_OBJECT_HOOK_MASK_OBJECT_SET] = NULL,
    [E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET] = NULL,
+   [E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET] = NULL,
 };
 
 #ifdef _F_E_COMP_OBJECT_INTERCEPT_HOOK_
@@ -272,7 +275,8 @@ _e_comp_object_hook_call(E_Comp_Object_Hook_Point hookpoint, E_Client *ec)
             (hookpoint != E_COMP_OBJECT_HOOK_LAYER_SET) &&
             (hookpoint != E_COMP_OBJECT_HOOK_RESTACK) &&
             (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_SET) &&
-            (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET))
+            (hookpoint != E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET) &&
+            (hookpoint != E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET))
           {
              return ret;
           }
@@ -4547,6 +4551,7 @@ e_comp_object_render_update_add(Evas_Object *obj)
    API_ENTRY;
 
    if (cw->ec->input_only || (!cw->updates) || (!cw->redirected)) return;
+   if (cw->render_update_lock) return;
    if (e_object_is_del(E_OBJECT(cw->ec)))
      CRI("CAN'T RENDER A DELETED CLIENT!!! ec:%p", cw->ec);
    if (!e_pixmap_usable_get(cw->ec->pixmap)) return;
@@ -6512,3 +6517,44 @@ e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
 
    return EINA_TRUE;
 }
+
+EINTERN Eina_Bool
+e_comp_object_render_update_lock(Evas_Object *obj)
+{
+   API_ENTRY EINA_FALSE;
+
+   cw->render_update_lock++;
+
+   if (cw->render_update_lock == 1)
+     {
+        _e_comp_object_hook_call(E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, cw->ec);
+        e_comp_object_render_update_del(obj);
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN void
+e_comp_object_render_update_unlock(Evas_Object *obj)
+{
+   API_ENTRY;
+
+   if (cw->render_update_lock == 0)
+     return;
+
+   cw->render_update_lock--;
+
+   if (cw->render_update_lock == 0)
+     e_comp_object_render_update_add(obj);
+}
+
+EINTERN Eina_Bool
+e_comp_object_render_update_lock_get(Evas_Object *obj)
+{
+   API_ENTRY EINA_FALSE;
+
+   if (cw->render_update_lock > 0)
+     return EINA_TRUE;
+
+   return EINA_FALSE;
+}
index 2d01277018b120b4b7c11ebda9f8da771bb4fe02..0bac69fac8093c244352976200ea3b45866b0c15 100644 (file)
@@ -52,6 +52,7 @@ typedef enum _E_Comp_Object_Hook_Point
    E_COMP_OBJECT_HOOK_LAYER_SET,
    E_COMP_OBJECT_HOOK_MASK_OBJECT_SET,
    E_COMP_OBJECT_HOOK_MASK_OBJECT_UNSET,
+   E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET,
    E_COMP_OBJECT_HOOK_LAST,
 } E_Comp_Object_Hook_Point;
 
@@ -209,6 +210,10 @@ E_API Eina_Bool        e_comp_object_map_set(Evas_Object *obj, E_Map *em);
 // get E_Map from evas_object. it must be freed after used.
 E_API E_Map           *e_comp_object_map_get(const Evas_Object *obj);
 E_API Eina_Bool        e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enabled);
+
+EINTERN Eina_Bool e_comp_object_render_update_lock(Evas_Object *obj);
+EINTERN void      e_comp_object_render_update_unlock(Evas_Object *obj);
+EINTERN Eina_Bool e_comp_object_render_update_lock_get(Evas_Object *obj);
 #endif
 #endif