iconify: added code to check alpha opaque window while handling iconifying/uniconifyi... 08/73808/3
authorDoyoun Kang <doyoun.kang@samsung.com>
Thu, 9 Jun 2016 12:08:55 +0000 (21:08 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Thu, 9 Jun 2016 12:58:23 +0000 (21:58 +0900)
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

src/e_mod_main.c
src/e_mod_visibility.c

index 3d897d733583afa635295a5c81c9864863cb2507..80a1d4fc03932d517c8c50294f5ae12851aadc53 100644 (file)
@@ -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
index a79a6d485e55db925f82d03e7689f3fb2948648e..4ccfad8b49d4b62568bc6a06357cb498c1a591bb 100644 (file)
 # 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