summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorChristian Dywan <christian@imendio.com>2008-11-30 05:33:57 +0000
committerChristian Dywan <cdywan@src.gnome.org>2008-11-30 05:33:57 +0000
commitd494aa720366e0885a95897bf44161b8a12d9a34 (patch)
tree1be50720dc1f32f69507fcdfe4bb47a11d7b5613 /gdk
parente0ce0916312827fd40eadd3244900f1e6d6f8dd7 (diff)
downloadgtk+-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.c2
-rw-r--r--gdk/x11/gdkinput.c23
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);
}
/**