effect: modify code finding background window 81/136681/2
authorDoyoun Kang <doyoun.kang@samsung.com>
Sun, 2 Jul 2017 22:46:47 +0000 (07:46 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Mon, 3 Jul 2017 01:44:57 +0000 (01:44 +0000)
we changed code to find background window list not just one window.
for this, we can include alpha window and its below window while running effect.

Change-Id: I2c16486297174e1b33d8dd0e599aec6365e40350

src/e_mod_effect.c

index 9d0d969..5b6f5cd 100644 (file)
@@ -455,38 +455,48 @@ _eff_object_under_del(E_Client *ec)
    efc->under = NULL;
 }
 
-static E_Client *
-_eff_object_background_below_client_get(E_Client *ec, E_Effect_Type type)
+static void
+_eff_object_background_below_clients_get(E_Client *ec, E_Effect_Type type, Eina_List **below_list)
 {
    Eina_List *stack = NULL, *list, *next;
    E_Client *below = NULL;
 
-   if (!_eff) return NULL;
+   if (!_eff) return;
 
    if (type == E_EFFECT_TYPE_RESTACK_HIDE)
      stack = _eff->stack.old;
    else
      stack = _eff->stack.cur;
 
-   if (!stack) return NULL;
+   if (!stack) return;
 
    list = eina_list_data_find_list(stack, ec);
-   if (!list) return NULL;
+   if (!list) return;
 
    next = list;
    while ((next = eina_list_next(next)))
      {
         below = eina_list_data_get(next);
         if (below == ec)
-          return NULL;
+          {
+             eina_list_free(*below_list);
+             *below_list = NULL;
+             return;
+          }
 
         if (below->vkbd.vkbd)
           continue;
 
-        break;
-     }
+        *below_list = eina_list_prepend(*below_list, below);
 
-   return below;
+        if (!below->argb)
+          break;
+        else
+          {
+             if (below->visibility.opaque > 0)
+               break;
+          }
+     }
 }
 
 static void
@@ -521,33 +531,20 @@ _eff_object_background_cb_zoom_out_done(void *data, Evas_Object *obj, const char
    e_object_unref(E_OBJECT(bg_ec));
 }
 
-static E_Client *
-_eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group group, E_Effect_Type type)
+static void
+_eff_object_background_start(E_Client *bg_ec, E_Effect_Type type)
 {
-   E_Comp_Config *cfg;
-   E_Client *bg_ec = NULL;
    E_Effect_Client *bg_efc = NULL;
 
-   cfg = e_comp_config_get();
-   if (!cfg) return NULL;
-   if (!cfg->bg_effect_style) return NULL;
-
-   if (!ec) return NULL;
-   if (group != E_EFFECT_GROUP_NORMAL) return NULL;
-   if ((ec->argb) || (ec->effect_type)) return NULL; //need to check opaque?
-
-   if (home_ec) bg_ec = home_ec;
-   else bg_ec = _eff_object_background_below_client_get(ec, type);
-
-   if (!bg_ec) return NULL;
-   if (e_object_is_del(E_OBJECT(bg_ec))) return NULL;
-   if (!bg_ec->animatable) return NULL;
+   if (!bg_ec) return;
+   if (e_object_is_del(E_OBJECT(bg_ec))) return;
+   if (!bg_ec->animatable) return;
 
    bg_efc = _eff_client_get(bg_ec);
-   if (!bg_efc) return NULL;
+   if (!bg_efc) return;
    if ((bg_efc->bg_animating) ||
        ((bg_efc->animating) && !((bg_ec->launching) && (bg_efc->animating == 1))))
-     return NULL;
+     return;
 
    switch (type)
      {
@@ -560,16 +557,17 @@ _eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group gro
               e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){0}, 1);
               e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_in_done, bg_ec);
               bg_efc->bg_animating = 1;
-              return bg_ec;
            }
          break;
+
       case E_EFFECT_TYPE_RESTACK_HIDE:
          e_object_ref(E_OBJECT(bg_ec));
          _eff_object_setup(bg_ec, E_EFFECT_GROUP_BACKGROUND);
          e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1}, 1);
          e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
          bg_efc->bg_animating = 1;
-         return bg_ec;
+         break;
+
       case E_EFFECT_TYPE_HIDE:
          if (bg_ec->visibility.obscured == E_VISIBILITY_FULLY_OBSCURED)
            {
@@ -578,15 +576,42 @@ _eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group gro
               e_comp_object_effect_params_set(bg_ec->frame, 0, (int[]){1}, 1);
               e_comp_object_effect_start(bg_ec->frame, _eff_object_background_cb_zoom_out_done, bg_ec);
               bg_efc->bg_animating = 1;
-              return bg_ec;
            }
          break;
+
       default:
          /* do nothing */
          break;
      }
+}
+
+static void
+_eff_object_background_setup(E_Client *ec, E_Client *home_ec, E_Effect_Group group, E_Effect_Type type)
+{
+   E_Comp_Config *cfg;
+   E_Client *bg_ec = NULL;
+   Eina_List *bg_list = NULL;
+
+   cfg = e_comp_config_get();
+   if (!cfg) return;
+   if (!cfg->bg_effect_style) return;
 
-   return NULL;
+   if (!ec) return;
+   if (group != E_EFFECT_GROUP_NORMAL) return;
+   if ((ec->argb) || (ec->effect_type)) return; //need to check opaque?
+
+   if (home_ec)
+     _eff_object_background_start(home_ec, type);
+   else
+     {
+        _eff_object_background_below_clients_get(ec, type, &bg_list);
+        if (!bg_list) return;
+
+        EINA_LIST_FREE(bg_list, bg_ec)
+          {
+             _eff_object_background_start(bg_ec, type);
+          }
+     }
 }
 
 static void