gtk+ r21529 - in trunk: . gdk/x11



Author: matthiasc
Date: Sat Sep 27 00:47:45 2008
New Revision: 21529
URL: http://svn.gnome.org/viewvc/gtk+?rev=21529&view=rev

Log:
        Bug 553803 â eventually call XCloseDevice on XOpenDevice results

        * gdk/x11/gdkinput.c: Add a finalize function for device objects,
        and call XCloseDevice there.

        * gdk/x11/gdkinput-x11.c:
        * gdk/x11/gdkdisplay-x11.c: Move freeing of device objects to
        the finalize function.
        Patch by Caolan McNamara



Modified:
   trunk/ChangeLog
   trunk/gdk/x11/gdkdisplay-x11.c
   trunk/gdk/x11/gdkinput-x11.c
   trunk/gdk/x11/gdkinput.c

Modified: trunk/gdk/x11/gdkdisplay-x11.c
==============================================================================
--- trunk/gdk/x11/gdkdisplay-x11.c	(original)
+++ trunk/gdk/x11/gdkdisplay-x11.c	Sat Sep 27 00:47:45 2008
@@ -830,7 +830,6 @@
   g_slist_free (display_x11->event_types);
 
   /* input GdkDevice list */
-  /* FIXME need to write finalize fct */
   g_list_foreach (display_x11->input_devices, (GFunc) g_object_unref, NULL);
   g_list_free (display_x11->input_devices);
 

Modified: trunk/gdk/x11/gdkinput-x11.c
==============================================================================
--- trunk/gdk/x11/gdkinput-x11.c	(original)
+++ trunk/gdk/x11/gdkinput-x11.c	Sat Sep 27 00:47:45 2008
@@ -246,10 +246,6 @@
 
  error:
 
-  g_free (gdkdev->info.name);
-  g_free (gdkdev->axes);
-  g_free (gdkdev->info.keys);
-  g_free (gdkdev->info.axes);
   g_object_unref (gdkdev);
   
   return NULL;

Modified: trunk/gdk/x11/gdkinput.c
==============================================================================
--- trunk/gdk/x11/gdkinput.c	(original)
+++ trunk/gdk/x11/gdkinput.c	Sat Sep 27 00:47:45 2008
@@ -63,6 +63,9 @@
   private->display = display;
 }
 
+static void gdk_device_class_init (GdkDeviceClass *klass);
+static void gdk_device_finalize (GObject *object);
+
 GType
 gdk_device_get_type (void)
 {
@@ -75,7 +78,7 @@
 	  sizeof (GdkDeviceClass),
 	  (GBaseInitFunc) NULL,
 	  (GBaseFinalizeFunc) NULL,
-	  (GClassInitFunc) NULL,
+	  (GClassInitFunc) gdk_device_class_init,
 	  NULL,           /* class_finalize */
 	  NULL,           /* class_data */
 	  sizeof (GdkDevicePrivate),
@@ -91,6 +94,33 @@
   return object_type;
 }
 
+static void
+gdk_device_class_init (GdkDeviceClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gdk_device_finalize;
+}
+
+static void
+gdk_device_finalize (GObject *object)
+{
+  GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)GDK_DEVICE(object);
+
+  if (!GDK_IS_CORE (gdkdev))
+  {
+#ifndef XINPUT_NONE
+    if (gdkdev->xdevice)
+      XCloseDevice (GDK_DISPLAY_XDISPLAY(gdkdev->display), gdkdev->xdevice);
+    g_free (gdkdev->axes);
+#endif /* !XINPUT_NONE */
+
+    g_free (gdkdev->info.name);
+    g_free (gdkdev->info.keys);
+    g_free (gdkdev->info.axes);
+  }
+}
+
 /**
  * gdk_devices_list:
  *
@@ -403,14 +433,7 @@
 	  if (!GDK_IS_CORE (gdkdev))
 	    {
 	      gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
-	      
-	      g_free(gdkdev->info.name);
-#ifndef XINPUT_NONE	  
-	      g_free(gdkdev->axes);
-#endif	  
-	      g_free(gdkdev->info.axes);
-	      g_free(gdkdev->info.keys);
-	      g_free(gdkdev);
+	      g_object_unref(gdkdev);
 	    }
 	}
       



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]