From: Doyoun Kang Date: Thu, 9 Jun 2016 12:08:55 +0000 (+0900) Subject: iconify: added code to check alpha opaque window while handling iconifying/uniconifyi... X-Git-Tag: submit/tizen/20160609.130803~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F08%2F73808%2F3;p=platform%2Fcore%2Fuifw%2Fe-mod-tizen-wm-policy.git iconify: added code to check alpha opaque window while handling iconifying/uniconifying window. There was a bug that the window is iconified when its above window is alpha OPAQUE window. In this case, the below window of the alpha OPAQUE window must not be iconified. Change-Id: Ia05298e87c75227d781e3186cba1a53d3d36fe16 --- diff --git a/src/e_mod_main.c b/src/e_mod_main.c index 3d897d7..80a1d4f 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -641,6 +641,14 @@ _pol_cb_hook_client_visibility(void *d EINA_UNUSED, E_Client *ec) e_mod_pol_wl_win_brightness_apply(ec); } + else + { + if ((!ec->iconic) && + (ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)) + { + e_mod_pol_client_iconify_by_visibility(ec); + } + } } static void diff --git a/src/e_mod_visibility.c b/src/e_mod_visibility.c index a79a6d4..4ccfad8 100644 --- a/src/e_mod_visibility.c +++ b/src/e_mod_visibility.c @@ -16,6 +16,13 @@ # define TRACE_DS_END() #endif +static Eina_Bool _e_mod_pol_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec); +static Eina_Bool _e_mod_pol_check_above_alpha_opaque(E_Client *ec); +static void _e_mod_pol_client_iconify_by_visibility(E_Client *ec); +static void _e_mod_pol_client_ancestor_uniconify(E_Client *ec); +static void _e_mod_pol_client_below_uniconify(E_Client *ec); +static void _e_mod_pol_client_uniconify_by_visibility(E_Client *ec); + static Eina_Bool _e_mod_pol_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec) { @@ -67,6 +74,39 @@ _e_mod_pol_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec) return visible; } +static Eina_Bool +_e_mod_pol_check_above_alpha_opaque(E_Client *ec) +{ + E_Client *above_ec; + Evas_Object *o; + Eina_Bool alpha_opaque = EINA_FALSE; + + for (o = evas_object_above_get(ec->frame); o; o = evas_object_above_get(o)) + { + above_ec = evas_object_data_get(o, "E_Client"); + if (!above_ec) continue; + if (e_client_util_ignored_get(above_ec)) continue; + + if ((above_ec->visibility.opaque > 0) && (above_ec->argb)) + { + if (above_ec->visibility.obscured == E_VISIBILITY_UNOBSCURED) + { + alpha_opaque = EINA_TRUE; + } + else + { + if (!above_ec->iconic) + { + alpha_opaque = EINA_TRUE; + } + } + } + break; + } + + return alpha_opaque; +} + static void _e_mod_pol_client_iconify_by_visibility(E_Client *ec) { @@ -76,10 +116,9 @@ _e_mod_pol_client_iconify_by_visibility(E_Client *ec) if (ec->iconic) return; if (ec->exp_iconify.by_client) return; if (ec->exp_iconify.skip_iconify) return; -#ifdef HAVE_WAYLAND_ONLY + E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data *)ec->comp_data; if (cdata && !cdata->mapped) return; -#endif if (e_config->transient.iconify) { @@ -89,6 +128,15 @@ _e_mod_pol_client_iconify_by_visibility(E_Client *ec) } } + if (ec->zone->display_state != E_ZONE_DISPLAY_STATE_OFF) + { + // check above window is alpha opaque or not + if (_e_mod_pol_check_above_alpha_opaque(ec)) + { + do_iconify = EINA_FALSE; + } + } + if (!do_iconify) { ELOGF("SKIP.. ICONIFY_BY_WM", "win:0x%08x", ec->pixmap, ec, e_client_util_win_get(ec)); @@ -167,6 +215,30 @@ _e_mod_pol_client_ancestor_uniconify(E_Client *ec) e_config->transient.iconify = transient_iconify; } +static void +_e_mod_pol_client_below_uniconify(E_Client *ec) +{ + E_Client *below_ec; + Evas_Object *o; + + for (o = evas_object_below_get(ec->frame); o; o = evas_object_below_get(o)) + { + below_ec = evas_object_data_get(o, "E_Client"); + if (!below_ec) continue; + if (e_client_util_ignored_get(below_ec)) continue; + + if (ec->parent == below_ec) break; + if (!below_ec->iconic) break; + + if (below_ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED) + { + _e_mod_pol_client_uniconify_by_visibility(below_ec); + } + + break; + } +} + static void _e_mod_pol_client_uniconify_by_visibility(E_Client *ec) { @@ -185,6 +257,11 @@ _e_mod_pol_client_uniconify_by_visibility(E_Client *ec) ec->exp_iconify.not_raise = 1; e_client_uniconify(ec); e_mod_pol_wl_iconify_state_change_send(ec, 0); + + if ((ec->visibility.opaque > 0) && (ec->argb)) + { + _e_mod_pol_client_below_uniconify(ec); + } } void