e_mod_rotation_wl: doing rotation if ec is obscured by 32bit opaque window 10/254110/3
authorJunseok, Kim <juns.kim@samsung.com>
Tue, 23 Feb 2021 11:51:07 +0000 (20:51 +0900)
committerJunseok, Kim <juns.kim@samsung.com>
Fri, 5 Mar 2021 07:48:51 +0000 (16:48 +0900)
There was a bug that below window didn't rotation under 32bit colored upper window changed from opaque to transparent.

The rotation activate trigger is uniconify rendering. (emits e,visibility,prepare,foreground signal)
The above window doing opaque_set -> opaque_unset, and The below window turns FULLY_OBSCURED -> UNOBSCURED.

But the below window is still uniconic state and didn't uniconify rendering, caused by the above window is 32bit colored and opaque state.
So, after the below window turn to UNOBSCURED, it still rotation deactivated.

To solve this problem, if the window is uniconic state, doing rotate under bg_client even if it is fully obscured window.

NOTE:: If above 32-bit opaque window draws translucent buffer, then below window may appear unrotated if below window has parent ec.

Change-Id: Ifc71b237f029f7b7bee153eb45e61824941e793c
Signed-off-by: Junseok, Kim <juns.kim@samsung.com>
src/rotation/e_mod_rotation_wl.c

index c64edd1..06d437c 100644 (file)
@@ -1175,10 +1175,15 @@ _e_client_rotation_zone_set(E_Zone *zone, E_Client *include_ec, E_Client *exclud
                         *  then camera app will not send rotation done event. thus it occurrs rotation time
                         *  out error. to resolve this issue we should exclude obscured camera ec from
                         *  rotation list.
+                        *
+                        * 2-1. Even if the ec is obscured by above, the ec can rotate if the ec is uniconic state.
+                        *
+                        * e.g. fully obscured by 32bit opaque window, or parent window that obscured by their child.
                         */
                        if ((!zone->rot.block.sys_auto_rot) &&
                            (e_mod_pol_rotation_is_conf_enable_angle(cur_angle)) &&
-                           (ec->visibility.obscured != E_VISIBILITY_FULLY_OBSCURED))
+                           (ec->comp_data && ec->comp_data->mapped) &&
+                           ((ec->visibility.obscured != E_VISIBILITY_FULLY_OBSCURED) || !ec->iconic))
                          {
                             ELOGF("ROTATION", "Do rotation of below ec under bg_ec %s(%p)",
                                   NULL, ec->icccm.name, ec);