e_hwc_window: do not add the below_transparent_obj to smart member of comp object 19/303919/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 4 Jan 2024 08:12:38 +0000 (17:12 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 8 Jan 2024 06:06:10 +0000 (15:06 +0900)
if color of comp object is set transparent when it is redirected,
the below_transparent_obj is not rendered in evas.

Change-Id: I8498e50effbdc788382a3dea5dd247e45bdab1a3

src/bin/e_hwc_window.c

index 9668a90..6f67f38 100644 (file)
@@ -3231,17 +3231,58 @@ _e_hwc_window_below_transparent_obj_map_apply(E_Hwc_Window *hwc_window)
 }
 
 static void
-_e_hwc_window_below_transparent_obj_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+_e_hwc_window_below_transparent_obj_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
 {
    E_Hwc_Window *hwc_window;
 
    if (!(hwc_window = data)) return;
 
-   EINA_SAFETY_ON_NULL_RETURN(hwc_window->ec);
+   evas_object_show(hwc_window->below_transparent_obj);
+}
+
+static void
+_e_hwc_window_below_transparent_obj_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   evas_object_hide(hwc_window->below_transparent_obj);
+}
+
+static void
+_e_hwc_window_below_transparent_obj_cb_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   evas_object_move(hwc_window->below_transparent_obj, hwc_window->ec->x, hwc_window->ec->y);
 
    _e_hwc_window_below_transparent_obj_map_apply(hwc_window);
 }
 
+static void
+_e_hwc_window_below_transparent_obj_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   _e_hwc_window_below_transparent_obj_map_apply(hwc_window);
+}
+
+static void
+_e_hwc_window_below_transparent_obj_cb_restack(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   evas_object_layer_set(hwc_window->below_transparent_obj, evas_object_layer_get(hwc_window->ec->frame));
+   evas_object_stack_below(hwc_window->below_transparent_obj, hwc_window->ec->frame);
+}
+
 EINTERN void
 e_hwc_window_below_transparent_obj_set(E_Hwc_Window *hwc_window, Eina_Bool set)
 {
@@ -3261,6 +3302,7 @@ e_hwc_window_below_transparent_obj_set(E_Hwc_Window *hwc_window, Eina_Bool set)
         evas_object_pass_events_set(below_transparent_obj, EINA_TRUE);
 
         evas_object_layer_set(below_transparent_obj, evas_object_layer_get(hwc_window->ec->frame));
+        evas_object_stack_below(below_transparent_obj, hwc_window->ec->frame);
         evas_object_render_op_set(below_transparent_obj, EVAS_RENDER_COPY);
 
         evas_object_color_set(below_transparent_obj, 0, 0, 0, 0);
@@ -3272,13 +3314,24 @@ e_hwc_window_below_transparent_obj_set(E_Hwc_Window *hwc_window, Eina_Bool set)
 
         _e_hwc_window_below_transparent_obj_map_apply(hwc_window);
 
-        evas_object_smart_member_add(hwc_window->below_transparent_obj, hwc_window->ec->frame);
-        evas_object_lower(hwc_window->below_transparent_obj);
-        evas_object_show(hwc_window->below_transparent_obj);
+        if (evas_object_visible_get(hwc_window->ec->frame))
+          evas_object_show(hwc_window->below_transparent_obj);
 
+        evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+                                       _e_hwc_window_below_transparent_obj_cb_show,
+                                       hwc_window);
+        evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+                                       _e_hwc_window_below_transparent_obj_cb_hide,
+                                       hwc_window);
+        evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+                                       _e_hwc_window_below_transparent_obj_cb_move,
+                                       hwc_window);
         evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
                                        _e_hwc_window_below_transparent_obj_cb_resize,
                                        hwc_window);
+        evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+                                       _e_hwc_window_below_transparent_obj_cb_restack,
+                                       hwc_window);
 
         EHWINF("Set below_transparent_obj", hwc_window->ec, hwc_window->hwc, hwc_window);
      }
@@ -3286,13 +3339,26 @@ e_hwc_window_below_transparent_obj_set(E_Hwc_Window *hwc_window, Eina_Bool set)
      {
         if (!hwc_window->below_transparent_obj) return;
 
-        evas_object_smart_member_del(hwc_window->below_transparent_obj);
         E_FREE_FUNC(hwc_window->below_transparent_obj, evas_object_del);
 
         if (hwc_window->ec)
-          evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
-                                              _e_hwc_window_below_transparent_obj_cb_resize,
-                                              hwc_window);
+          {
+             evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+                                                 _e_hwc_window_below_transparent_obj_cb_show,
+                                                 hwc_window);
+             evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+                                                 _e_hwc_window_below_transparent_obj_cb_hide,
+                                                 hwc_window);
+             evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+                                                 _e_hwc_window_below_transparent_obj_cb_move,
+                                                 hwc_window);
+             evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
+                                                 _e_hwc_window_below_transparent_obj_cb_resize,
+                                                 hwc_window);
+             evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+                                                 _e_hwc_window_below_transparent_obj_cb_restack,
+                                                 hwc_window);
+          }
 
         EHWINF("Unset below_transparent_obj", hwc_window->ec, hwc_window->hwc, hwc_window);
      }