e_comp_object: restack the transform obj under the bottommost subsurface 22/317322/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 30 Dec 2024 10:08:11 +0000 (19:08 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 30 Dec 2024 10:20:03 +0000 (19:20 +0900)
fix the problem of subsurface is not composited when subsurface is
rendered by evas and the transform obj is enabled.

This patch is cherry-picked from below commit on tizen_9.0.
- commit b4e33ed2e303404149a862131f0aa603c8cc9fea
- Author: Changyeon Lee <cyeon.lee@samsung.com>
- Date:   Mon Aug 5 13:46:13 2024 +0900
- Subject: e_comp_object: restack the transform obj under the bottommost subsurface

Change-Id: Ib68c05aae1220e6afa37a5c9bdc7886bc45490cc

src/bin/e_comp_object.c

index a85de0224b7faaa9bc61c1c32f58ae0db4a109f9..ec4931e90dee55b9d5b8ffff6f9e950766582466 100644 (file)
@@ -486,35 +486,72 @@ _e_comp_object_cb_mirror_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
 }
 
 /////////////////////////////////////
+static Evas_Object *
+_e_comp_object_bottommost_object_get(Evas_Object *obj)
+{
+   E_Client *sub;
+   API_ENTRY obj;
+
+   if (!cw->ec) return obj;
+   if (!cw->ec->comp_data) return obj;
+   if (!cw->ec->comp_data->sub.below_list) return obj;
+
+   sub = eina_list_data_get(cw->ec->comp_data->sub.below_list);
+   while (sub)
+     {
+        if (!sub->comp_data || !sub->comp_data->sub.below_list)
+          return sub->frame;
+
+        sub = eina_list_data_get(sub->comp_data->sub.below_list);
+     }
+
+   return obj;
+}
 
 static void
 _e_comp_object_transform_obj_stack_update(Evas_Object *obj)
 {
    int layer = 0;
+   Evas_Object *bottommost_obj;
+   E_Client *topmost_ec;
+   E_Comp_Object *topmost_cw;
    API_ENTRY;
    EINA_SAFETY_ON_NULL_RETURN(cw->ec);
    if (cw->ec->input_only) return;
 
-   layer = evas_object_layer_get(obj);
+   topmost_ec = e_comp_wl_topmost_parent_get(cw->ec);
+   if (!topmost_ec) return;
 
-   if (cw->transform_bg_obj)
+   topmost_cw = evas_object_smart_data_get(topmost_ec->frame);
+   if (!topmost_cw) return;
+
+   if (e_util_strcmp(evas_object_type_get(topmost_ec->frame), SMART_NAME))
+     return;
+
+   if ((!topmost_cw->transform_bg_obj) && (!topmost_cw->transform_tranp_obj))
+     return;
+
+   bottommost_obj = _e_comp_object_bottommost_object_get(obj);
+   layer = evas_object_layer_get(bottommost_obj);
+
+   if (topmost_cw->transform_bg_obj)
      {
-        if (layer != evas_object_layer_get(cw->transform_bg_obj))
+        if (layer != evas_object_layer_get(topmost_cw->transform_bg_obj))
           {
-             evas_object_layer_set(cw->transform_bg_obj, layer);
+             evas_object_layer_set(topmost_cw->transform_bg_obj, layer);
           }
 
-        evas_object_stack_below(cw->transform_bg_obj, obj);
+        evas_object_stack_below(topmost_cw->transform_bg_obj, bottommost_obj);
      }
 
-   if (cw->transform_tranp_obj)
+   if (topmost_cw->transform_tranp_obj)
      {
-        if (layer != evas_object_layer_get(cw->transform_tranp_obj))
+        if (layer != evas_object_layer_get(topmost_cw->transform_tranp_obj))
           {
-             evas_object_layer_set(cw->transform_tranp_obj, layer);
+             evas_object_layer_set(topmost_cw->transform_tranp_obj, layer);
           }
 
-        evas_object_stack_below(cw->transform_tranp_obj, obj);
+        evas_object_stack_below(topmost_cw->transform_tranp_obj, bottommost_obj);
      }
 }