fix border reffing unreffing. handy was wright... except he was uing a free
callabck fro objects not a del to emit a remvoe event and ref the object again the object is already in the process of being destroyed. reffing it again wont help you here in _free - thats why we have del callabcks to do this before the final destruction... :) SVN revision: 12890
This commit is contained in:
parent
b4d855a31d
commit
156aaabbd2
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
/* local subsystem functions */
|
/* local subsystem functions */
|
||||||
static void _e_border_free(E_Border *bd);
|
static void _e_border_free(E_Border *bd);
|
||||||
|
static void _e_border_del(E_Border *bd);
|
||||||
|
|
||||||
/* FIXME: these likely belong in a separate icccm/client handler */
|
/* FIXME: these likely belong in a separate icccm/client handler */
|
||||||
/* and the border needs to be come a dumb object that just does what its */
|
/* and the border needs to be come a dumb object that just does what its */
|
||||||
|
@ -152,7 +153,8 @@ e_border_new(E_Container *con, Ecore_X_Window win, int first_map)
|
||||||
|
|
||||||
bd = E_OBJECT_ALLOC(E_Border, _e_border_free);
|
bd = E_OBJECT_ALLOC(E_Border, _e_border_free);
|
||||||
if (!bd) return NULL;
|
if (!bd) return NULL;
|
||||||
|
e_object_del_func_set(bd, _e_border_del);
|
||||||
|
|
||||||
printf("##- NEW CLIENT 0x%x\n", win);
|
printf("##- NEW CLIENT 0x%x\n", win);
|
||||||
bd->container = con;
|
bd->container = con;
|
||||||
bd->zone = e_zone_current_get(con);
|
bd->zone = e_zone_current_get(con);
|
||||||
|
@ -798,12 +800,6 @@ e_border_idler_before(void)
|
||||||
static void
|
static void
|
||||||
_e_border_free(E_Border *bd)
|
_e_border_free(E_Border *bd)
|
||||||
{
|
{
|
||||||
E_Event_Border_Remove *ev;
|
|
||||||
|
|
||||||
ev = calloc(1, sizeof(E_Event_Border_Remove));
|
|
||||||
ev->border = bd;
|
|
||||||
ecore_event_add(E_EVENT_BORDER_HIDE, ev, _e_border_event_border_remove_free, NULL);
|
|
||||||
|
|
||||||
if (focused == bd) focused = NULL;
|
if (focused == bd) focused = NULL;
|
||||||
while (bd->handlers)
|
while (bd->handlers)
|
||||||
{
|
{
|
||||||
|
@ -841,6 +837,17 @@ _e_border_free(E_Border *bd)
|
||||||
free(bd);
|
free(bd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_border_del(E_Border *bd)
|
||||||
|
{
|
||||||
|
E_Event_Border_Remove *ev;
|
||||||
|
|
||||||
|
ev = calloc(1, sizeof(E_Event_Border_Remove));
|
||||||
|
ev->border = bd;
|
||||||
|
e_object_ref(E_OBJECT(bd));
|
||||||
|
ecore_event_add(E_EVENT_BORDER_REMOVE, ev, _e_border_event_border_remove_free, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_e_border_cb_window_show_request(void *data, int ev_type, void *ev)
|
_e_border_cb_window_show_request(void *data, int ev_type, void *ev)
|
||||||
{
|
{
|
||||||
|
@ -2768,6 +2775,7 @@ _e_border_event_border_remove_free(void *data, void *ev)
|
||||||
E_Event_Border_Resize *e;
|
E_Event_Border_Resize *e;
|
||||||
|
|
||||||
e = ev;
|
e = ev;
|
||||||
|
e_object_unref(E_OBJECT(e->border));
|
||||||
free(e);
|
free(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue