From d494aa720366e0885a95897bf44161b8a12d9a34 Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Sun, 30 Nov 2008 05:33:57 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20559622=20=E2=80=93=20GdkDevice=20test=20s?= =?UTF-8?q?egfaults?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-11-30 Christian Dywan Bug 559622 – GdkDevice test segfaults * gdk/x11/gdkdisplay-x11.c (gdk_display_x11_dispose): * gdk/x11/gdkinput.c (gdk_device_class_init), (gdk_device_dispose): Free and reset device in dispose. Patch by Michael Natterer and myself. svn path=/trunk/; revision=21834 --- ChangeLog | 8 ++++++++ gdk/x11/gdkdisplay-x11.c | 2 ++ gdk/x11/gdkinput.c | 23 +++++++++++++++-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index b105c17769..ebe98eff6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-11-30 Christian Dywan + + Bug 559622 – GdkDevice test segfaults + + * gdk/x11/gdkdisplay-x11.c (gdk_display_x11_dispose): + * gdk/x11/gdkinput.c (gdk_device_class_init), (gdk_device_dispose): + Free and reset device in dispose. Patch by Michael Natterer and myself. + 2008-11-30 Christian Dywan Bug 554076 – eventually release g_new-ed supported_atoms diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index cbef9ea439..9f2dffcd04 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -798,6 +798,8 @@ gdk_display_x11_dispose (GObject *object) GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (object); gint i; + g_list_foreach (display_x11->input_devices, (GFunc) g_object_run_dispose, NULL); + for (i = 0; i < ScreenCount (display_x11->xdisplay); i++) _gdk_screen_close (display_x11->screens[i]); diff --git a/gdk/x11/gdkinput.c b/gdk/x11/gdkinput.c index 7fb2bfeb76..0d48e13f3b 100644 --- a/gdk/x11/gdkinput.c +++ b/gdk/x11/gdkinput.c @@ -64,7 +64,7 @@ _gdk_init_input_core (GdkDisplay *display) } static void gdk_device_class_init (GdkDeviceClass *klass); -static void gdk_device_finalize (GObject *object); +static void gdk_device_dispose (GObject *object); static gpointer gdk_device_parent_class = NULL; @@ -103,29 +103,36 @@ gdk_device_class_init (GdkDeviceClass *klass) gdk_device_parent_class = g_type_class_peek_parent (klass); - object_class->finalize = gdk_device_finalize; + object_class->dispose = gdk_device_dispose; } static void -gdk_device_finalize (GObject *object) +gdk_device_dispose (GObject *object) { - GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)GDK_DEVICE(object); + GdkDevicePrivate *gdkdev = (GdkDevicePrivate *) object; - if (!GDK_IS_CORE (gdkdev)) + if (gdkdev->display && !GDK_IS_CORE (gdkdev)) { #ifndef XINPUT_NONE if (gdkdev->xdevice) - XCloseDevice (GDK_DISPLAY_XDISPLAY(gdkdev->display), gdkdev->xdevice); - + { + XCloseDevice (GDK_DISPLAY_XDISPLAY (gdkdev->display), gdkdev->xdevice); + gdkdev->xdevice = NULL; + } g_free (gdkdev->axes); + gdkdev->axes = NULL; #endif /* !XINPUT_NONE */ g_free (gdkdev->info.name); g_free (gdkdev->info.keys); g_free (gdkdev->info.axes); + + gdkdev->info.name = NULL; + gdkdev->info.keys = NULL; + gdkdev->info.axes = NULL; } - G_OBJECT_CLASS (gdk_device_parent_class)->finalize (object); + G_OBJECT_CLASS (gdk_device_parent_class)->dispose (object); } /**