diff options
author | Christian Dywan <christian@imendio.com> | 2008-11-30 05:33:57 +0000 |
---|---|---|
committer | Christian Dywan <cdywan@src.gnome.org> | 2008-11-30 05:33:57 +0000 |
commit | d494aa720366e0885a95897bf44161b8a12d9a34 (patch) | |
tree | 1be50720dc1f32f69507fcdfe4bb47a11d7b5613 /gdk | |
parent | e0ce0916312827fd40eadd3244900f1e6d6f8dd7 (diff) | |
download | gtk+-d494aa720366e0885a95897bf44161b8a12d9a34.tar.gz |
Bug 559622 – GdkDevice test segfaults
2008-11-30 Christian Dywan <christian@imendio.com>
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
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/x11/gdkdisplay-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkinput.c | 23 |
2 files changed, 17 insertions, 8 deletions
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); } /** |