diff --git a/ChangeLog b/ChangeLog index 267143aa64..323fe47e5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-12-21 Richard Hult + + * gdk/quartz/gdkwindow-quartz.c: (_gdk_windowing_window_destroy): + Plug leak of destroyed subviews, fixes bug #504753. + 2007-12-20 Johan Dahlin * tests/Makefile.am (TEST_PROGS): diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index fba383374d..f57f51ed9d 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -882,6 +882,7 @@ _gdk_windowing_window_destroy (GdkWindow *window, GdkWindowObject *private; GdkWindowImplQuartz *impl; GdkWindowObject *parent; + GdkWindow *mouse_window; private = GDK_WINDOW_OBJECT (window); impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); @@ -909,24 +910,21 @@ _gdk_windowing_window_destroy (GdkWindow *window, if (window == _gdk_quartz_keyboard_grab_window) gdk_keyboard_ungrab (0); + _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl)); + + mouse_window = _gdk_quartz_events_get_mouse_window (FALSE); + if (window == mouse_window || + _gdk_quartz_window_is_ancestor (window, mouse_window)) + _gdk_quartz_events_update_mouse_window (_gdk_root); + if (!recursing && !foreign_destroy) { - GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl); - GdkWindow *mouse_window; - - mouse_window = _gdk_quartz_events_get_mouse_window (FALSE); - if (window == mouse_window || - _gdk_quartz_window_is_ancestor (window, mouse_window)) - _gdk_quartz_events_update_mouse_window (_gdk_root); - GDK_QUARTZ_ALLOC_POOL; - _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl)); - if (impl->toplevel) [impl->toplevel close]; else if (impl->view) - [impl->view release]; + [impl->view removeFromSuperview]; GDK_QUARTZ_RELEASE_POOL; } @@ -2898,9 +2896,6 @@ gdk_window_configure_finished (GdkWindow *window) void gdk_window_destroy_notify (GdkWindow *window) { - /* FIXME: Implement. We should call this from -[GdkQuartzWindow dealloc] or - * -[GdkQuartzView dealloc], although I suspect that currently they leak - * anyway. */ } void