E_Client *ec;
ec = drag->data;
+ UNREFD(ec, 1);
e_object_unref(E_OBJECT(ec));
client_drag = NULL;
}
static void
_e_client_event_simple_free(void *d EINA_UNUSED, E_Event_Client *ev)
{
+ UNREFD(ev->ec, 3);
e_object_unref(E_OBJECT(ev->ec));
free(ev);
}
ev = E_NEW(E_Event_Client, 1);
ev->ec = ec;
+ REFD(ec, 3);
e_object_ref(E_OBJECT(ec));
ecore_event_add(type, ev, (Ecore_End_Cb)_e_client_event_simple_free, NULL);
}
ev = E_NEW(E_Event_Client_Property, 1);
ev->ec = ec;
ev->property = prop;
+ REFD(ec, 33);
e_object_ref(E_OBJECT(ec));
ecore_event_add(E_EVENT_CLIENT_PROPERTY, ev, (Ecore_End_Cb)_e_client_event_simple_free, NULL);
}
static void
_e_client_event_desk_set_free(void *d EINA_UNUSED, E_Event_Client_Desk_Set *ev)
{
+ UNREFD(ev->ec, 4);
e_object_unref(E_OBJECT(ev->ec));
e_object_unref(E_OBJECT(ev->desk));
free(ev);
static void
_e_client_event_zone_set_free(void *d EINA_UNUSED, E_Event_Client_Zone_Set *ev)
{
+ UNREFD(ev->ec, 5);
e_object_unref(E_OBJECT(ev->ec));
e_object_unref(E_OBJECT(ev->zone));
free(ev);
e_comp_object_redirected_set(ec->frame, 0);
e_comp_object_render_update_del(ec->frame);
+ E_OBJECT(ec)->references++;
if (ec->fullscreen)
{
ec->desk->fullscreen_clients = eina_list_remove(ec->desk->fullscreen_clients, ec);
raise_stack = eina_list_remove(raise_stack, ec);
e_hints_client_list_set();
- evas_object_del(ec->frame);
if (ec->e.state.profile.wait_desk)
{
e_object_delfn_del(E_OBJECT(ec->e.state.profile.wait_desk),
e_object_unref(E_OBJECT(ec->e.state.profile.wait_desk));
}
ec->e.state.profile.wait_desk = NULL;
+ evas_object_del(ec->frame);
+ E_OBJECT(ec)->references--;
free(ec);
}
{
ev = E_NEW(E_Event_Client_Desk_Set, 1);
ev->ec = ec;
+ UNREFD(ec, 4);
e_object_ref(E_OBJECT(ec));
ev->desk = old_desk;
e_object_ref(E_OBJECT(old_desk));
int x, y, w, h;
const char *drag_types[] = { "enlightenment/border" };
+ REFD(ec, 1);
e_object_ref(E_OBJECT(ec));
e_comp_object_frame_icon_geometry_get(ec->frame, &x, &y, &w, &h);
ev = E_NEW(E_Event_Client_Zone_Set, 1);
ev->ec = ec;
+ REFD(ec, 5);
e_object_ref(E_OBJECT(ec));
ev->zone = zone;
e_object_ref(E_OBJECT(zone));
E_Client *ec;
ec = evas_object_data_get(ev->comp_object, "E_Client");
- if (ec) e_object_unref(E_OBJECT(ec));
+ if (ec)
+ {
+ UNREFD(ec, 1);
+ e_object_unref(E_OBJECT(ec));
+ }
evas_object_unref(ev->comp_object);
free(ev);
}
evas_object_ref(obj);
ev->comp_object = obj;
ec = evas_object_data_get(ev->comp_object, "E_Client");
- if (ec) e_object_ref(E_OBJECT(ec));
+ if (ec)
+ {
+ REFD(ec, 1);
+ e_object_ref(E_OBJECT(ec));
+ }
ecore_event_add(E_EVENT_COMP_OBJECT_ADD, ev, _e_comp_object_event_free, NULL);
}
/////////////////////////////////////////////
-/* handle the end of a compositor animation */
static void
-_e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
+_e_comp_object_animating_begin(E_Comp_Object *cw)
{
- E_Comp_Object *cw = data;
+ cw->animating++;
+ if (cw->animating == 1)
+ {
+ e_comp->animating++;
+ REFD(cw->ec, 2);
+ e_object_ref(E_OBJECT(cw->ec));
+ }
+}
- //INF("DONE DEFER %p: %dx%d - %s", cw->ec, cw->w, cw->h, emission);
- /* visible clients which have never been sized are a bug */
- if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
- CRI("ACK!");
+static Eina_Bool
+_e_comp_object_animating_end(E_Comp_Object *cw)
+{
if (cw->animating)
{
cw->animating--;
if (!cw->animating)
{
e_comp->animating--;
+ UNREFD(cw->ec, 2);
/* remove ref from animation start, account for possibility of deletion from unref */
- if (!e_object_unref(E_OBJECT(cw->ec))) return;
+ return e_object_unref(E_OBJECT(cw->ec));
}
}
+ return EINA_TRUE;
+}
+
+/* handle the end of a compositor animation */
+static void
+_e_comp_object_done_defer(void *data, Evas_Object *obj EINA_UNUSED, const char *emission, const char *source EINA_UNUSED)
+{
+ E_Comp_Object *cw = data;
+
+ //INF("DONE DEFER %p: %dx%d - %s", cw->ec, cw->w, cw->h, emission);
+ /* visible clients which have never been sized are a bug */
+ if ((!cw->ec->new_client) && (!cw->ec->changes.size) && ((cw->w < 0) || (cw->h < 0)) && (!strcmp(emission, "e,action,show,done")))
+ CRI("ACK!");
+ if (!_e_comp_object_animating_end(cw)) return;
if (cw->animating) return;
/* hide only after animation finishes to guarantee a full run of the animation */
if (cw->defer_hide && ((!strcmp(emission, "e,action,hide,done")) || (!strcmp(emission, "e,action,done"))))
else
{
e_comp_object_signal_emit(obj, "e,state,hidden", "e");
- cw->animating++;
- if (cw->animating == 1)
- {
- e_comp->animating++;
- e_object_ref(E_OBJECT(cw->ec));
- }
+ _e_comp_object_animating_begin(cw);
if (cw->visibility_effect)
{
- cw->animating++;
-// same as above, but unreachable
-// if (cw->animating == 1)
-// {
-// e_comp->animating++;
-// e_object_ref(E_OBJECT(cw->ec));
-// }
+ _e_comp_object_animating_begin(cw);
e_comp_object_effect_set(obj, cw->visibility_effect);
e_comp_object_effect_params_set(obj, 0, (int[]){0}, 1);
e_comp_object_effect_start(obj, _e_comp_object_done_defer, cw);
else
{
e_comp_object_signal_emit(cw->smart_obj, "e,state,visible", "e");
- cw->animating++;
- if (cw->animating == 1)
- {
- e_comp->animating++;
- e_object_ref(E_OBJECT(cw->ec));
- }
+ _e_comp_object_animating_begin(cw);
if (cw->visibility_effect)
{
- cw->animating++;
-// same logic as above but unreachable
-// if (cw->animating == 1)
-// {
-// e_comp->animating++;
-// e_object_ref(E_OBJECT(cw->ec));
-// }
+ _e_comp_object_animating_begin(cw);
e_comp_object_effect_set(obj, cw->visibility_effect);
e_comp_object_effect_params_set(obj, 0, (int[]){1}, 1);
e_comp_object_effect_start(obj, _e_comp_object_done_defer, cw);
INTERNAL_ENTRY;
- if (cw->animating)
- {
- e_comp->animating--;
- e_object_unref(E_OBJECT(cw->ec));
- }
- cw->animating = 0;
+ e_comp_object_render_update_del(cw->smart_obj);
E_FREE_FUNC(cw->updates, eina_tiler_free);
E_FREE_FUNC(cw->pending_updates, eina_tiler_free);
- DBG(" [%p] del", cw->ec);
- e_comp_object_render_update_del(cw->smart_obj);
if (cw->obj_mirror)
{
e_comp_shape_queue();
eina_stringshare_del(cw->frame_theme);
eina_stringshare_del(cw->frame_name);
+ if (cw->animating)
+ {
+ cw->animating = 0;
+ e_comp->animating--;
+ UNREFD(cw->ec, 2);
+ e_object_unref(E_OBJECT(cw->ec));
+ }
+// UNREFD(cw->ec, 9);
+// e_object_unref(E_OBJECT(cw->ec));
free(cw);
}
o = evas_object_smart_add(e_comp->evas, _e_comp_smart);
cw = evas_object_smart_data_get(o);
evas_object_data_set(o, "E_Client", ec);
+// REFD(ec, 9);
+// e_object_ref(E_OBJECT(ec));
cw->ec = ec;
ec->frame = o;
evas_object_data_set(o, "comp_object", (void*)1);
e_comp_object_damage(obj, 0, 0, pw, ph);
else
{
+ DELD(cw->ec, 2);
e_object_del(E_OBJECT(cw->ec));
return EINA_FALSE;
}
e_comp_object_damage(obj, 0, 0, pw, ph);
else
{
+ DELD(cw->ec, 3);
e_object_del(E_OBJECT(cw->ec));
return EINA_FALSE;
}
E_Comp_Object *cw = data;
edje_object_signal_callback_del_full(obj, "e,action,done", "e", _e_comp_object_effect_end_cb, NULL);
- if (cw->animating)
- {
- cw->animating--;
- if (!cw->animating)
- {
- e_comp->animating--;
- if (e_object_unref(E_OBJECT(cw->ec))) e_comp_shape_queue();
- }
- }
-
+ if (!_e_comp_object_animating_end(cw)) return;
+ e_comp_shape_queue();
end_cb = evas_object_data_get(obj, "_e_comp.end_cb");
if (!end_cb) return;
end_data = evas_object_data_get(obj, "_e_comp.end_data");
edje_object_signal_emit(cw->effect_obj, "e,action,go", "e");
if (cw->animating) return;
- cw->animating++;
-// same standard logic but useless here
-// if (cw->animating == 1)
-// {
- e_comp->animating++;
- e_object_ref(E_OBJECT(cw->ec));
-// }
+ _e_comp_object_animating_begin(cw);
}
/* stop a currently-running effect immediately */
}
edje_object_signal_emit(cw->effect_obj, "e,action,stop", "e");
edje_object_signal_callback_del_full(cw->effect_obj, "e,action,done", "e", _e_comp_object_effect_end_cb, cw);
- if (cw->animating)
- {
- cw->animating--;
- if (!cw->animating)
- {
- e_comp->animating--;
- e_object_unref(E_OBJECT(cw->ec));
- }
- }
+ _e_comp_object_animating_end(cw);
}
static int
{
E_Event_Client *ev = e;
+ UNREFD(ev->ec, 1);
e_object_unref(E_OBJECT(ev->ec));
free(ev);
}
if (!ecore_x_window_attributes_get(win, &ec->comp_data->initial_attributes))
{
//CRI("OUCH! FIX THIS!");
+ DELD(ec, 1);
e_object_del(E_OBJECT(ec));
return EINA_FALSE;
}
if (ec->re_manage && (!ec->comp_data->initial_attributes.visible))
{
/* ain't gonna be no hidden clients on my watch! */
+ DELD(ec, 1);
e_object_del(E_OBJECT(ec));
return EINA_FALSE;
}
{
/* this is the ecore-x private window :/ */
e_comp_ignore_win_add(E_PIXMAP_TYPE_X, win);
+ DELD(ec, 1);
e_object_del(E_OBJECT(ec));
return EINA_FALSE;
}
evas_object_pass_events_set(ec->frame, 1);
evas_object_hide(ec->frame);
ec->comp_data->deleted = 1;
+ DELD(ec, 2);
e_object_del(E_OBJECT(ec));
}
return ECORE_CALLBACK_PASS_ON;
{
if (ec->exe_inst && ec->exe_inst->exe)
ec->exe_inst->phony = 0;
+ DELD(ec, 3);
e_object_del(E_OBJECT(ec));
}
}
ev = E_NEW(E_Event_Client_Property, 1);
ev->ec = ec;
+ REFD(ec, 1);
e_object_ref(E_OBJECT(ec));
ev->property = E_CLIENT_PROPERTY_NETWM_STATE;
ecore_event_add(E_EVENT_CLIENT_PROPERTY, ev, _e_comp_x_client_event_free, NULL);
ec = _e_comp_x_client_new(windows[i], 1);
}
if (ec && (!ec->comp_data->initial_attributes.visible))
- E_FREE_FUNC(ec, e_object_del);
+ {
+ DELD(ec, 3);
+ E_FREE_FUNC(ec, e_object_del);
+ }
if (ec)
{
if (ec->override)