{
E_Client *ec;
unsigned int animating;
+ unsigned int delay_del_ref;
E_Comp_Wl_Buffer_Ref buffer_ref;
E_Pixmap *ep;
E_Client *reverse_ec;
efc = E_NEW(E_Effect_Client, 1);
efc->ec = ec;
efc->animating = 0;
+ efc->delay_del_ref = 0;
efc->ep = NULL;
return efc;
if (!_eff) return EINA_FALSE;
+ efc = _eff_client_get(ec);
+ if (!efc) return EINA_FALSE;
+
if (e_object_is_del(E_OBJECT(ec)))
{
- ERR("Client is deleted already! ec(%p)", ec);
- eina_hash_del_by_key(_eff->clients, &ec);
- return EINA_FALSE;
+ if (!e_object_delay_del_ref_get(E_OBJECT(ec)))
+ {
+ ERR("Client is deleted already! ec(%p)", ec);
+ eina_hash_del_by_key(_eff->clients, &ec);
+ return EINA_FALSE;
+ }
}
- efc = _eff_client_get(ec);
- if (!efc) return EINA_FALSE;
-
if (!ec->pixmap) return EINA_FALSE;
if ((e_comp_object_content_type_get(ec->frame) == E_COMP_OBJECT_CONTENT_TYPE_INT_IMAGE) &&
(!e_pixmap_usable_get(ec->pixmap)))
return EINA_FALSE;
+ if (e_object_is_del(E_OBJECT(ec)))
+ {
+ e_object_delay_del_ref(E_OBJECT(ec));
+ efc->delay_del_ref ++;
+ }
+
efc->animating++;
e_object_ref(E_OBJECT(ec));
efc->ep = e_pixmap_ref(ec->pixmap);
efc = _eff_client_get(ec);
if (!efc) return NULL;
+ while (efc->delay_del_ref)
+ {
+ e_object_delay_del_unref(E_OBJECT(ec));
+ efc->delay_del_ref--;
+ }
+
if (e_object_is_del(E_OBJECT(ec)))
do_unref = efc->animating;
ec = e_comp_object_client_get(obj);
if (!ec) return EINA_FALSE;
- if (e_object_is_del(E_OBJECT(ec))) return EINA_FALSE;
+ if (e_object_is_del(E_OBJECT(ec)))
+ {
+ if (!e_object_delay_del_ref_get(E_OBJECT(ec))) return;
+ }
/* check for effect group */
group = _eff_group_get(ec);