e_client: do not enable the transform core if the render update lock is set 72/306372/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 7 Feb 2024 09:39:23 +0000 (18:39 +0900)
committerchangyeon lee <cyeon.lee@samsung.com>
Wed, 21 Feb 2024 01:48:39 +0000 (01:48 +0000)
Change-Id: I404df3bb2da56260c7df9eb150b1b47649180634

src/bin/e_client.c

index ca178df86945456641a5e4c8214d074d216dc130..99f490aaaa98b43d515875e6f4caf5fe3f4c7be5 100644 (file)
@@ -124,6 +124,7 @@ static Eina_Bool comp_grabbed = EINA_FALSE;
 
 static Eina_List *handlers = NULL;
 static Eina_List *hooks = NULL;
+static Eina_List *comp_hooks = NULL;
 
 static Ecore_Event_Handler *action_handler_mouse = NULL;
 static Ecore_Timer *action_timer = NULL;
@@ -1966,8 +1967,15 @@ _e_client_stay_within_canvas_margin(E_Client *ec, int x, int y, int *new_x, int
 ////////////////////////////////////////////////
 
 static void
-_e_client_transform_core_activate_set(E_Client *ec, Eina_Bool set)
+_e_client_transform_core_activate_update(E_Client *ec)
 {
+   Eina_Bool set;
+
+   if (evas_object_visible_get(ec->frame) && e_comp_object_render_update_lock_get(ec->frame))
+     set = EINA_TRUE;
+   else
+     set = EINA_FALSE;
+
    if (ec->transform_core.activate == set) return;
 
    ec->transform_core.activate = set;
@@ -2002,7 +2010,7 @@ _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
 
    ec->want_focus = ec->take_focus = 0;
 
-   _e_client_transform_core_activate_set(ec, EINA_FALSE);
+   _e_client_transform_core_activate_update(ec);
 
    if (ec->new_client) return;
    _e_client_event_hide(ec);
@@ -2125,7 +2133,7 @@ _e_client_cb_evas_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
 
    if (e_object_is_del(data)) return;
 
-   _e_client_transform_core_activate_set(ec, EINA_TRUE);
+   _e_client_transform_core_activate_update(ec);
 
    _e_client_event_show(ec);
    EC_CHANGED(ec);
@@ -2900,7 +2908,7 @@ _e_client_transform_core_vertices_apply(E_Client *ec,
 
         e_comp_object_map_set(obj, map);
 
-        if (ec->transform_core.activate)
+        if ((ec->transform_core.activate) || (!e_comp_object_render_update_lock_get(ec->frame)))
           e_comp_object_map_enable_set(obj, EINA_TRUE);
         else
           e_comp_object_map_enable_set(obj, EINA_FALSE);
@@ -3105,6 +3113,25 @@ e_client_idler_before(Eina_Bool *check_focus)
    TRACE_DS_END();
 }
 
+static Eina_Bool
+_e_client_cb_hook_comp_render_update_lock_set(void *data, E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_TRUE);
+
+   _e_client_transform_core_activate_update(ec);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_e_client_cb_hook_comp_render_update_lock_unset(void *data, E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_TRUE);
+
+   _e_client_transform_core_activate_update(ec);
+
+   return EINA_TRUE;
+}
 
 EINTERN Eina_Bool
 e_client_init(void)
@@ -3114,6 +3141,8 @@ e_client_init(void)
      clients_hash[pix_id] = eina_hash_pointer_new(NULL);
 
    E_COMP_WL_HOOK_APPEND(hooks, E_COMP_WL_HOOK_SHELL_SURFACE_READY, _e_client_cb_hook_shell_surface_ready, NULL);
+   E_COMP_COMP_HOOK_APPEND(comp_hooks, E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET, _e_client_cb_hook_comp_render_update_lock_set, NULL);
+   E_COMP_COMP_HOOK_APPEND(comp_hooks, E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_UNSET, _e_client_cb_hook_comp_render_update_lock_unset, NULL);
 
    E_EVENT_CLIENT_ADD = ecore_event_type_new();
    E_EVENT_CLIENT_REMOVE = ecore_event_type_new();
@@ -3153,6 +3182,7 @@ e_client_shutdown(void)
      E_FREE_FUNC(clients_hash[pix_id], eina_hash_free);
 
    E_FREE_LIST(hooks, e_comp_wl_hook_del);
+   E_FREE_LIST(comp_hooks, e_comp_object_hook_del);
    E_FREE_LIST(handlers, ecore_event_handler_del);
 
 }