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
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)
{
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)
{
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