e_policy_visibility: fix bug for handling transient below window accepted/tizen/3.0/common/20170719.081747 accepted/tizen/3.0/ivi/20170719.003816 accepted/tizen/3.0/mobile/20170719.003759 accepted/tizen/3.0/tv/20170719.003804 accepted/tizen/3.0/wearable/20170719.003811 submit/tizen_3.0/20170718.024912
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 17 Jul 2017 23:46:53 +0000 (08:46 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Tue, 18 Jul 2017 02:48:25 +0000 (11:48 +0900)
there was a bug that e could fall into infinite loop while handling iconify state
or visibility of transient below window.

Change-Id: Iae090aa8b537b90878b45041bb022623259069eb

src/bin/e_policy_visibility.c

index 8654c31c9c9b16cb800466b6e4b3f31081c0e4f5..df07444715e841819308d424dbd2ee2900fe1aa5 100644 (file)
@@ -124,12 +124,17 @@ _e_policy_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec)
 
         if (!child_ec->comp_data) continue;
         if (!child_ec->comp_data->mapped) continue;
+        if (child_ec->transient_policy == E_TRANSIENT_BELOW) continue;
 
         if ((child_ec->exp_iconify.skip_iconify == EINA_TRUE) ||
             (child_ec->exp_iconify.skip_by_remote == EINA_TRUE))
           {
              if (child_ec->visibility.obscured == E_VISIBILITY_UNOBSCURED)
                {
+                  ELOGF("Find visible child", "ancestor(win:0x%08x, ec:%p), child(win:0x%08x, ec:%p)",
+                        ec->pixmap, ec,
+                        e_client_util_win_get(ancestor_ec), ancestor_ec,
+                        e_client_util_win_get(child_ec), child_ec);
                   return EINA_TRUE;
                }
              else
@@ -139,6 +144,10 @@ _e_policy_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec)
                        e_client_geometry_get(child_ec, &child_x, &child_y, &child_w, &child_h);
                        if (E_CONTAINS(child_x, child_y, child_w, child_h, anc_x, anc_y, anc_w, anc_h))
                          {
+                            ELOGF("Find visible child", "ancestor(win:0x%08x, ec:%p), child(win:0x%08x, ec:%p)",
+                                  ec->pixmap, ec,
+                                  e_client_util_win_get(ancestor_ec), ancestor_ec,
+                                  e_client_util_win_get(child_ec), child_ec);
                             return EINA_TRUE;
                          }
                     }
@@ -149,6 +158,10 @@ _e_policy_check_transient_child_visible(E_Client *ancestor_ec, E_Client *ec)
              if ((!child_ec->iconic) ||
                  (child_ec->visibility.obscured == E_VISIBILITY_UNOBSCURED))
                {
+                  ELOGF("Find visible child", "ancestor(win:0x%08x, ec:%p), child(win:0x%08x, ec:%p)",
+                        ec->pixmap, ec,
+                        e_client_util_win_get(ancestor_ec), ancestor_ec,
+                        e_client_util_win_get(child_ec), child_ec);
                   return EINA_TRUE;
                }
           }
@@ -1359,6 +1372,9 @@ _e_vis_intercept_show(void *data EINA_UNUSED, E_Client *ec)
 
         topmost = eina_list_data_get(ec->transients);
 
+        if (topmost->transient_policy == E_TRANSIENT_BELOW)
+          return EINA_TRUE;
+
         /* allow show if topmost child is alpha window or not fully cover region of ec */
         if ((topmost->argb) || !(E_CONTAINS(topmost->x, topmost->y, topmost->w, topmost->h, ec->x, ec->y, ec->w, ec->h)))
           return EINA_TRUE;