From: Doyoun Kang Date: Wed, 18 Dec 2024 06:00:24 +0000 (+0900) Subject: e_policy_zone: check uniconify_render while calculating visibility X-Git-Tag: accepted/tizen/9.0/unified/20241224.014905~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e16953c0a014acbb030d5cf5dc578568d95114ec;p=platform%2Fupstream%2Fenlightenment.git e_policy_zone: check uniconify_render while calculating visibility There was an issue where the visibility state changed several times in the scenario where the window requested activation after requesting iconify as follows: 1. When the enlightenment received the activate request, pre-visibility is delivered to the application window. 2. Application receives this event and changes its state to RESUME. 3. To process the activate (uniconify) event, enlightenment waits for rendering of the application. (The activate (and uniconify) is pended) 4. In this situation, when the visibility calculation is performed, since the window is still in an iconic state, the visibility of window changes to a fully-obscured state. 5. Application receives this event and changes its state to PAUSE. 6. After that, when the Application window performs rendering, the visibility of the application window is changed to unobscured state. 7. As a result, application changes its state to RESUME again. To resolve this problem, we modified the visibility calculation to check for the uniconify_pending status. If it's in the pending state, the visibility calculation will be skipped. Change-Id: Ifa02ecfb27b37d64265ab77db146c404cf843b55 --- diff --git a/src/bin/windowmgr/e_policy_zone.c b/src/bin/windowmgr/e_policy_zone.c index 2a10a6a0b1..a0be9574d2 100644 --- a/src/bin/windowmgr/e_policy_zone.c +++ b/src/bin/windowmgr/e_policy_zone.c @@ -1,6 +1,7 @@ #include "e_policy_zone_intern.h" #include "e_zone_intern.h" #include "e_policy_intern.h" +#include "e_policy_visibility_intern.h" #include "e_client_intern.h" #include "e_input_device_intern.h" #include "e_comp_wl_intern.h" @@ -1478,12 +1479,21 @@ e_policy_zone_visibility_calculate(E_Zone *zone) /* obscured case */ if (e_client_visibility_get(ec) != E_VISIBILITY_FULLY_OBSCURED) { - /* previous state is unobscured: -1 or 0 */ - e_client_visibility_set(ec, E_VISIBILITY_FULLY_OBSCURED); - ec->visibility.changed = 1; - ELOGF("POL_VIS", "CLIENT VIS OFF. argb:%d, opaque:%2d, frame_v:%d, canvas_v:%d, calc_r:%d(%d), ignore_geometry:%d, show_p:%d, geo(%d,%d,%dx%d)", - ec, ec->argb, ec->visibility.opaque, - ec_frame_visible, canvas_vis, calc_region, calc_skip_type, ec->visibility.ignore_geometry, skip_by_pending_show, x, y, w, h); + if (e_policy_visibility_client_is_uniconify_render_running(ec)) + { + ELOGF("POL_VIS", "CLIENT VIS OFF-SKIP. argb:%d, opaque:%2d, frame_v:%d, canvas_v:%d, calc_r:%d(%d), ignore_geometry:%d, show_p:%d, geo(%d,%d,%dx%d)", + ec, ec->argb, ec->visibility.opaque, + ec_frame_visible, canvas_vis, calc_region, calc_skip_type, ec->visibility.ignore_geometry, skip_by_pending_show, x, y, w, h); + } + else + { + /* previous state is unobscured: -1 or 0 */ + e_client_visibility_set(ec, E_VISIBILITY_FULLY_OBSCURED); + ec->visibility.changed = 1; + ELOGF("POL_VIS", "CLIENT VIS OFF. argb:%d, opaque:%2d, frame_v:%d, canvas_v:%d, calc_r:%d(%d), ignore_geometry:%d, show_p:%d, geo(%d,%d,%dx%d)", + ec, ec->argb, ec->visibility.opaque, + ec_frame_visible, canvas_vis, calc_region, calc_skip_type, ec->visibility.ignore_geometry, skip_by_pending_show, x, y, w, h); + } } } }