From 156aaabbd23051291f9581a61efb7efd948de369 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 11 Jan 2005 08:11:30 +0000 Subject: [PATCH] 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 --- src/bin/e_border.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 9ea75cce6..64f397035 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -17,6 +17,7 @@ /* local subsystem functions */ 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 */ /* 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); if (!bd) return NULL; - + e_object_del_func_set(bd, _e_border_del); + printf("##- NEW CLIENT 0x%x\n", win); bd->container = con; bd->zone = e_zone_current_get(con); @@ -798,12 +800,6 @@ e_border_idler_before(void) static void _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; while (bd->handlers) { @@ -841,6 +837,17 @@ _e_border_free(E_Border *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 _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 = ev; + e_object_unref(E_OBJECT(e->border)); free(e); }