]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkobject.c
Include "config.h" instead of <config.h> Command used: find -name
[~andy/gtk] / gtk / gtkobject.c
index 15dd706088ba5720d023735d4f3ff9cffdbb5788..a2dde92d8423f87899c91ee7983efa124073d7da 100644 (file)
@@ -2,25 +2,43 @@
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+#include "config.h"
+
 #include <stdarg.h>
 #include <string.h>
 #include <stdio.h>
+
+#undef GTK_DISABLE_DEPRECATED
+
 #include "gtkobject.h"
-#include "gtksignal.h"
+#include "gtkintl.h"
+#include "gtkmarshalers.h"
+#include "gtkprivate.h"
+
+#define GTK_DISABLE_DEPRECATED
+#include "gtkalias.h"
 
 
 enum {
@@ -28,189 +46,351 @@ enum {
   LAST_SIGNAL
 };
 enum {
-  ARG_0,
-  ARG_USER_DATA,
-  ARG_SIGNAL,
-  ARG_SIGNAL_AFTER,
-  ARG_OBJECT_SIGNAL,
-  ARG_OBJECT_SIGNAL_AFTER
+  PROP_0,
+  PROP_USER_DATA
 };
 
 
-void                 gtk_object_init_type       (void);
-static void           gtk_object_base_class_init (GtkObjectClass *klass);
-static void           gtk_object_class_init      (GtkObjectClass *klass);
-static void           gtk_object_init            (GtkObject      *object,
+static void       gtk_object_base_class_init     (GtkObjectClass *class);
+static void       gtk_object_base_class_finalize (GtkObjectClass *class);
+static void       gtk_object_class_init          (GtkObjectClass *klass);
+static void       gtk_object_init                (GtkObject      *object,
                                                  GtkObjectClass *klass);
-static void           gtk_object_set_arg         (GtkObject      *object,
-                                                 GtkArg         *arg,
-                                                 guint           arg_id);
-static void           gtk_object_get_arg         (GtkObject      *object,
-                                                 GtkArg         *arg,
-                                                 guint           arg_id);
-static void           gtk_object_shutdown        (GtkObject      *object);
-static void           gtk_object_real_destroy    (GtkObject      *object);
-static void           gtk_object_finalize        (GtkObject      *object);
-static void           gtk_object_notify_weaks    (GtkObject      *object);
+static void      gtk_object_set_property        (GObject        *object,
+                                                 guint           property_id,
+                                                 const GValue   *value,
+                                                 GParamSpec     *pspec);
+static void      gtk_object_get_property        (GObject        *object,
+                                                 guint           property_id,
+                                                 GValue         *value,
+                                                 GParamSpec     *pspec);
+static void       gtk_object_dispose            (GObject        *object);
+static void       gtk_object_real_destroy        (GtkObject      *object);
+static void       gtk_object_finalize            (GObject        *object);
+static void       gtk_object_notify_weaks        (GtkObject      *object);
+
+static gpointer    parent_class = NULL;
+static guint       object_signals[LAST_SIGNAL] = { 0 };
+static GQuark      quark_weakrefs = 0;
+
 
-static guint object_signals[LAST_SIGNAL] = { 0 };
+/****************************************************
+ * GtkObject type, class and instance initialization
+ *
+ ****************************************************/
 
-static GHashTable *object_arg_info_ht = NULL;
+GType
+gtk_object_get_type (void)
+{
+  static GType object_type = 0;
 
-static GQuark quark_user_data = 0;
-static GQuark quark_weakrefs = 0;
-static GQuark quark_carg_history = 0;
+  if (!object_type)
+    {
+      const GTypeInfo object_info =
+      {
+       sizeof (GtkObjectClass),
+       (GBaseInitFunc) gtk_object_base_class_init,
+       (GBaseFinalizeFunc) gtk_object_base_class_finalize,
+       (GClassInitFunc) gtk_object_class_init,
+       NULL,           /* class_finalize */
+       NULL,           /* class_data */
+       sizeof (GtkObject),
+       16,             /* n_preallocs */
+       (GInstanceInitFunc) gtk_object_init,
+       NULL,           /* value_table */
+      };
+      
+      object_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED, I_("GtkObject"), 
+                                           &object_info, G_TYPE_FLAG_ABSTRACT);
+    }
 
+  return object_type;
+}
 
-#ifdef G_ENABLE_DEBUG
-static guint obj_count = 0;
-static GHashTable *living_objs_ht = NULL;
 static void
-gtk_object_debug_foreach (gpointer key, gpointer value, gpointer user_data)
+gtk_object_base_class_init (GtkObjectClass *class)
 {
-  GtkObject *object;
-  
-  object = (GtkObject*) value;
-  g_message ("[%p] %s\tref_count=%d%s%s",
-            object,
-            gtk_type_name (GTK_OBJECT_TYPE (object)),
-            object->ref_count,
-            GTK_OBJECT_FLOATING (object) ? " (floating)" : "",
-            GTK_OBJECT_DESTROYED (object) ? " (destroyed)" : "");
+  /* reset instance specifc methods that don't get inherited */
+  class->get_arg = NULL;
+  class->set_arg = NULL;
 }
+
 static void
-gtk_object_debug (void)
+gtk_object_base_class_finalize (GtkObjectClass *class)
 {
-  if (living_objs_ht)
-    g_hash_table_foreach (living_objs_ht, gtk_object_debug_foreach, NULL);
-  
-  g_message ("living objects count = %d", obj_count);
 }
-#endif /* G_ENABLE_DEBUG */
 
-/****************************************************
- * GtkObject type, class and instance initialization
- *
- ****************************************************/
+static inline gboolean
+gtk_arg_set_from_value (GtkArg       *arg,
+                       const GValue *value,
+                       gboolean      copy_string)
+{
+  switch (G_TYPE_FUNDAMENTAL (arg->type))
+    {
+    case G_TYPE_CHAR:           GTK_VALUE_CHAR (*arg) = g_value_get_char (value);       break;
+    case G_TYPE_UCHAR:          GTK_VALUE_UCHAR (*arg) = g_value_get_uchar (value);     break;
+    case G_TYPE_BOOLEAN:        GTK_VALUE_BOOL (*arg) = g_value_get_boolean (value);    break;
+    case G_TYPE_INT:            GTK_VALUE_INT (*arg) = g_value_get_int (value);         break;
+    case G_TYPE_UINT:           GTK_VALUE_UINT (*arg) = g_value_get_uint (value);       break;
+    case G_TYPE_LONG:           GTK_VALUE_LONG (*arg) = g_value_get_long (value);       break;
+    case G_TYPE_ULONG:          GTK_VALUE_ULONG (*arg) = g_value_get_ulong (value);     break;
+    case G_TYPE_ENUM:           GTK_VALUE_ENUM (*arg) = g_value_get_enum (value);       break;
+    case G_TYPE_FLAGS:          GTK_VALUE_FLAGS (*arg) = g_value_get_flags (value);     break;
+    case G_TYPE_FLOAT:          GTK_VALUE_FLOAT (*arg) = g_value_get_float (value);     break;
+    case G_TYPE_DOUBLE:         GTK_VALUE_DOUBLE (*arg) = g_value_get_double (value);   break;
+    case G_TYPE_BOXED:          GTK_VALUE_BOXED (*arg) = g_value_get_boxed (value);     break;
+    case G_TYPE_POINTER:        GTK_VALUE_POINTER (*arg) = g_value_get_pointer (value); break;
+    case G_TYPE_OBJECT:         GTK_VALUE_POINTER (*arg) = g_value_get_object (value);  break;
+    case G_TYPE_STRING:         if (copy_string)
+      GTK_VALUE_STRING (*arg) = g_value_dup_string (value);
+    else
+      GTK_VALUE_STRING (*arg) = (char *) g_value_get_string (value);
+    break;
+    default:
+      return FALSE;
+    }
+  return TRUE;
+}
 
-void
-gtk_object_init_type (void)
+static inline gboolean
+gtk_arg_to_value (GtkArg *arg,
+                 GValue *value)
 {
-  GtkType object_type = 0;
-  GtkTypeInfo object_info =
-  {
-    "GtkObject",
-    sizeof (GtkObject),
-    sizeof (GtkObjectClass),
-    (GtkClassInitFunc) gtk_object_class_init,
-    (GtkObjectInitFunc) gtk_object_init,
-    /* reserved_1 */ NULL,
-    /* reserved_2 */ NULL,
-    (GtkClassInitFunc) gtk_object_base_class_init,
-  };
-
-  object_type = gtk_type_unique (0, &object_info);
-  g_assert (object_type == GTK_TYPE_OBJECT);
-
-#ifdef G_ENABLE_DEBUG
-  if (gtk_debug_flags & GTK_DEBUG_OBJECTS)
-    g_atexit (gtk_object_debug);
-#endif /* G_ENABLE_DEBUG */
+  switch (G_TYPE_FUNDAMENTAL (arg->type))
+    {
+    case G_TYPE_CHAR:           g_value_set_char (value, GTK_VALUE_CHAR (*arg));        break;
+    case G_TYPE_UCHAR:          g_value_set_uchar (value, GTK_VALUE_UCHAR (*arg));      break;
+    case G_TYPE_BOOLEAN:        g_value_set_boolean (value, GTK_VALUE_BOOL (*arg));     break;
+    case G_TYPE_INT:            g_value_set_int (value, GTK_VALUE_INT (*arg));          break;
+    case G_TYPE_UINT:           g_value_set_uint (value, GTK_VALUE_UINT (*arg));        break;
+    case G_TYPE_LONG:           g_value_set_long (value, GTK_VALUE_LONG (*arg));        break;
+    case G_TYPE_ULONG:          g_value_set_ulong (value, GTK_VALUE_ULONG (*arg));      break;
+    case G_TYPE_ENUM:           g_value_set_enum (value, GTK_VALUE_ENUM (*arg));        break;
+    case G_TYPE_FLAGS:          g_value_set_flags (value, GTK_VALUE_FLAGS (*arg));      break;
+    case G_TYPE_FLOAT:          g_value_set_float (value, GTK_VALUE_FLOAT (*arg));      break;
+    case G_TYPE_DOUBLE:         g_value_set_double (value, GTK_VALUE_DOUBLE (*arg));    break;
+    case G_TYPE_STRING:         g_value_set_string (value, GTK_VALUE_STRING (*arg));    break;
+    case G_TYPE_BOXED:          g_value_set_boxed (value, GTK_VALUE_BOXED (*arg));      break;
+    case G_TYPE_POINTER:        g_value_set_pointer (value, GTK_VALUE_POINTER (*arg));  break;
+    case G_TYPE_OBJECT:         g_value_set_object (value, GTK_VALUE_POINTER (*arg));   break;
+    default:
+      return FALSE;
+    }
+  return TRUE;
 }
 
-GtkType
-gtk_object_get_type (void)
+static void
+gtk_arg_proxy_set_property (GObject      *object,
+                           guint         property_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
 {
-  return GTK_TYPE_OBJECT;
+  GtkObjectClass *class = g_type_class_peek (pspec->owner_type);
+  GtkArg arg;
+
+  g_return_if_fail (class->set_arg != NULL);
+
+  memset (&arg, 0, sizeof (arg));
+  arg.type = G_VALUE_TYPE (value);
+  gtk_arg_set_from_value (&arg, value, FALSE);
+  arg.name = pspec->name;
+  class->set_arg (GTK_OBJECT (object), &arg, property_id);
 }
 
 static void
-gtk_object_base_class_init (GtkObjectClass *class)
+gtk_arg_proxy_get_property (GObject     *object,
+                           guint        property_id,
+                           GValue      *value,
+                           GParamSpec  *pspec)
 {
-  /* reset instance specific fields that don't get inherited */
-  class->signals = NULL;
-  class->nsignals = 0;
-  class->n_args = 0;
-  class->construct_args = NULL;
+  GtkObjectClass *class = g_type_class_peek (pspec->owner_type);
+  GtkArg arg;
 
-  /* reset instance specifc methods that don't get inherited */
-  class->get_arg = NULL;
-  class->set_arg = NULL;
+  g_return_if_fail (class->get_arg != NULL);
+
+  memset (&arg, 0, sizeof (arg));
+  arg.type = G_VALUE_TYPE (value);
+  arg.name = pspec->name;
+  class->get_arg (GTK_OBJECT (object), &arg, property_id);
+  gtk_arg_to_value (&arg, value);
+}
+
+void
+gtk_object_add_arg_type (const gchar *arg_name,
+                        GtkType      arg_type,
+                        guint        arg_flags,
+                        guint        arg_id)
+{
+  GObjectClass *oclass;
+  GParamSpec *pspec;
+  gchar *type_name, *pname;
+  GType type;
+  
+  g_return_if_fail (arg_name != NULL);
+  g_return_if_fail (arg_type > G_TYPE_NONE);
+  g_return_if_fail (arg_id > 0);
+  g_return_if_fail (arg_flags & G_PARAM_READWRITE);
+  if (arg_flags & G_PARAM_CONSTRUCT)
+    g_return_if_fail ((arg_flags & G_PARAM_CONSTRUCT_ONLY) == 0);
+  if (arg_flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY))
+    g_return_if_fail (arg_flags & G_PARAM_WRITABLE);
+  g_return_if_fail ((arg_flags & ~(G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME)) == 0);
+
+  pname = strchr (arg_name, ':');
+  g_return_if_fail (pname && pname[1] == ':');
+
+  type_name = g_strndup (arg_name, pname - arg_name);
+  pname += 2;
+  type = g_type_from_name (type_name);
+  g_free (type_name);
+  g_return_if_fail (G_TYPE_IS_OBJECT (type));
+
+  oclass = gtk_type_class (type);
+  if (arg_flags & G_PARAM_READABLE)
+    {
+      if (oclass->get_property && oclass->get_property != gtk_arg_proxy_get_property)
+       {
+         g_warning (G_STRLOC ": GtkArg compatibility code can't be mixed with customized %s.get_property() implementation",
+                    g_type_name (type));
+         return;
+       }
+      oclass->get_property = gtk_arg_proxy_get_property;
+    }
+  if (arg_flags & G_PARAM_WRITABLE)
+    {
+      if (oclass->set_property && oclass->set_property != gtk_arg_proxy_set_property)
+       {
+         g_warning (G_STRLOC ": GtkArg compatibility code can't be mixed with customized %s.set_property() implementation",
+                    g_type_name (type));
+         return;
+       }
+      oclass->set_property = gtk_arg_proxy_set_property;
+    }
+  switch (G_TYPE_FUNDAMENTAL (arg_type))
+    {
+    case G_TYPE_ENUM:
+      pspec = g_param_spec_enum (pname, NULL, NULL, arg_type, 0, arg_flags);
+      break;
+    case G_TYPE_FLAGS:
+      pspec = g_param_spec_flags (pname, NULL, NULL, arg_type, 0, arg_flags);
+      break;
+    case G_TYPE_CHAR:
+      pspec = g_param_spec_char (pname, NULL, NULL, -128, 127, 0, arg_flags);
+      break;
+    case G_TYPE_UCHAR:
+      pspec = g_param_spec_uchar (pname, NULL, NULL, 0, 255, 0, arg_flags);
+      break;
+    case G_TYPE_BOOLEAN:
+      pspec = g_param_spec_boolean (pname, NULL, NULL, FALSE, arg_flags);
+      break;
+    case G_TYPE_INT:
+      pspec = g_param_spec_int (pname, NULL, NULL, G_MININT, G_MAXINT, 0, arg_flags);
+      break;
+    case G_TYPE_UINT:
+      pspec = g_param_spec_uint (pname, NULL, NULL, 0, G_MAXUINT, 0, arg_flags);
+      break;
+    case G_TYPE_FLOAT:
+      pspec = g_param_spec_float (pname, NULL, NULL, -G_MAXFLOAT, G_MAXFLOAT, 0, arg_flags);
+      break;
+    case G_TYPE_DOUBLE:
+      pspec = g_param_spec_double (pname, NULL, NULL, -G_MAXDOUBLE, G_MAXDOUBLE, 0, arg_flags);
+      break;
+    case G_TYPE_STRING:
+      pspec = g_param_spec_string (pname, NULL, NULL, NULL, arg_flags);
+      break;
+    case G_TYPE_POINTER:
+      pspec = g_param_spec_pointer (pname, NULL, NULL, arg_flags);
+      break;
+    case G_TYPE_OBJECT:
+      pspec = g_param_spec_object (pname, NULL, NULL, arg_type, arg_flags);
+      break;
+    case G_TYPE_BOXED:
+      if (!G_TYPE_IS_FUNDAMENTAL (arg_type))
+       {
+         pspec = g_param_spec_boxed (pname, NULL, NULL, arg_type, arg_flags);
+         break;
+       }
+    default:
+      g_warning (G_STRLOC ": Property type `%s' is not supported by the GtkArg compatibility code",
+                g_type_name (arg_type));
+      return;
+    }
+  g_object_class_install_property (oclass, arg_id, pspec);
+}
+
+static guint (*gobject_floating_flag_handler) (GtkObject*,gint) = NULL;
+
+static guint
+gtk_object_floating_flag_handler (GtkObject *object,
+                                  gint       job)
+{
+  /* FIXME: remove this whole thing once GTK+ breaks ABI */
+  if (!GTK_IS_OBJECT (object))
+    return gobject_floating_flag_handler (object, job);
+  switch (job)
+    {
+      guint32 oldvalue;
+    case +1:    /* force floating if possible */
+      do
+        oldvalue = g_atomic_int_get (&object->flags);
+      while (!g_atomic_int_compare_and_exchange (&object->flags, oldvalue, oldvalue | GTK_FLOATING));
+      return oldvalue & GTK_FLOATING;
+    case -1:    /* sink if possible */
+      do
+        oldvalue = g_atomic_int_get (&object->flags);
+      while (!g_atomic_int_compare_and_exchange (&object->flags, oldvalue, oldvalue & ~(guint32) GTK_FLOATING));
+      return oldvalue & GTK_FLOATING;
+    default:    /* check floating */
+      return 0 != (g_atomic_int_get (&object->flags) & GTK_FLOATING);
+    }
 }
 
 static void
 gtk_object_class_init (GtkObjectClass *class)
 {
-  quark_carg_history = g_quark_from_static_string ("gtk-construct-arg-history");
-
-  gtk_object_add_arg_type ("GtkObject::user_data",
-                          GTK_TYPE_POINTER,
-                          GTK_ARG_READWRITE,
-                          ARG_USER_DATA);
-  gtk_object_add_arg_type ("GtkObject::signal",
-                          GTK_TYPE_SIGNAL,
-                          GTK_ARG_WRITABLE,
-                          ARG_SIGNAL);
-  gtk_object_add_arg_type ("GtkObject::signal_after",
-                          GTK_TYPE_SIGNAL,
-                          GTK_ARG_WRITABLE,
-                          ARG_SIGNAL_AFTER);
-  gtk_object_add_arg_type ("GtkObject::object_signal",
-                          GTK_TYPE_SIGNAL,
-                          GTK_ARG_WRITABLE,
-                          ARG_OBJECT_SIGNAL);
-  gtk_object_add_arg_type ("GtkObject::object_signal_after",
-                          GTK_TYPE_SIGNAL,
-                          GTK_ARG_WRITABLE,
-                          ARG_OBJECT_SIGNAL_AFTER);
+  GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+  gboolean is_glib_2_10_1;
+
+  parent_class = g_type_class_ref (G_TYPE_OBJECT);
+
+  is_glib_2_10_1 = g_object_compat_control (3, &gobject_floating_flag_handler);
+  if (!is_glib_2_10_1)
+    g_error ("this version of Gtk+ requires GLib-2.10.1");
+  g_object_compat_control (2, gtk_object_floating_flag_handler);
+
+  gobject_class->set_property = gtk_object_set_property;
+  gobject_class->get_property = gtk_object_get_property;
+  gobject_class->dispose = gtk_object_dispose;
+  gobject_class->finalize = gtk_object_finalize;
 
-  object_signals[DESTROY] =
-    gtk_signal_new ("destroy",
-                    GTK_RUN_LAST,
-                    class->type,
-                    GTK_SIGNAL_OFFSET (GtkObjectClass, destroy),
-                    gtk_marshal_NONE__NONE,
-                   GTK_TYPE_NONE, 0);
-
-  gtk_object_class_add_signals (class, object_signals, LAST_SIGNAL);
-
-  class->get_arg = gtk_object_get_arg;
-  class->set_arg = gtk_object_set_arg;
-  class->shutdown = gtk_object_shutdown;
   class->destroy = gtk_object_real_destroy;
-  class->finalize = gtk_object_finalize;
+
+  g_object_class_install_property (gobject_class,
+                                  PROP_USER_DATA,
+                                  g_param_spec_pointer ("user-data", 
+                                                        P_("User Data"),
+                                                        P_("Anonymous User Data Pointer"),
+                                                        GTK_PARAM_READWRITE));
+  object_signals[DESTROY] =
+    g_signal_new (I_("destroy"),
+                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+                 G_STRUCT_OFFSET (GtkObjectClass, destroy),
+                 NULL, NULL,
+                 _gtk_marshal_VOID__VOID,
+                 G_TYPE_NONE, 0);
 }
 
 static void
 gtk_object_init (GtkObject      *object,
                 GtkObjectClass *klass)
 {
-  gboolean needs_construction = FALSE;
-
-  GTK_OBJECT_FLAGS (object) = GTK_FLOATING;
-  do
-    {
-      needs_construction |= klass->construct_args != NULL;
-      klass = gtk_type_parent_class (klass->type);
-    }
-  while (klass && !needs_construction);
-  if (!needs_construction)
-    GTK_OBJECT_FLAGS (object) |= GTK_CONSTRUCTED;
-
-  object->ref_count = 1;
-  g_datalist_init (&object->object_data);
-
-#ifdef G_ENABLE_DEBUG
-  if (gtk_debug_flags & GTK_DEBUG_OBJECTS)
-    {
-      obj_count++;
-      
-      if (!living_objs_ht)
-       living_objs_ht = g_hash_table_new (g_direct_hash, NULL);
-
-      g_hash_table_insert (living_objs_ht, object, object);
-    }
-#endif /* G_ENABLE_DEBUG */
+  gboolean was_floating;
+  /* sink the GInitiallyUnowned floating flag */
+  was_floating = gobject_floating_flag_handler (object, -1);
+  /* set GTK_FLOATING via gtk_object_floating_flag_handler */
+  if (was_floating)
+    g_object_force_floating (G_OBJECT (object));
 }
 
 /********************************************
@@ -222,42 +402,53 @@ gtk_object_destroy (GtkObject *object)
 {
   g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (GTK_OBJECT_CONSTRUCTED (object));
   
-  if (!GTK_OBJECT_DESTROYED (object))
-    {
-      /* we will hold a reference on the object in this place, so
-       * to ease all classes shutdown and destroy implementations.
-       * i.e. they don't have to bother about referencing at all.
-       */
-      gtk_object_ref (object);
-      object->klass->shutdown (object);
-      gtk_object_unref (object);
-    }
+  if (!(GTK_OBJECT_FLAGS (object) & GTK_IN_DESTRUCTION))
+    g_object_run_dispose (G_OBJECT (object));
 }
 
 static void
-gtk_object_shutdown (GtkObject *object)
+gtk_object_dispose (GObject *gobject)
 {
-  GTK_OBJECT_SET_FLAGS (object, GTK_DESTROYED);
-  gtk_signal_emit (object, object_signals[DESTROY]);
+  GtkObject *object = GTK_OBJECT (gobject);
+
+  /* guard against reinvocations during
+   * destruction with the GTK_IN_DESTRUCTION flag.
+   */
+  if (!(GTK_OBJECT_FLAGS (object) & GTK_IN_DESTRUCTION))
+    {
+      GTK_OBJECT_SET_FLAGS (object, GTK_IN_DESTRUCTION);
+      
+      g_signal_emit (object, object_signals[DESTROY], 0);
+      
+      GTK_OBJECT_UNSET_FLAGS (object, GTK_IN_DESTRUCTION);
+    }
+
+  G_OBJECT_CLASS (parent_class)->dispose (gobject);
 }
 
 static void
 gtk_object_real_destroy (GtkObject *object)
 {
-  if (GTK_OBJECT_CONNECTED (object))
-    gtk_signal_handlers_destroy (object);
+  g_signal_handlers_destroy (object);
 }
 
 static void
-gtk_object_finalize (GtkObject *object)
+gtk_object_finalize (GObject *gobject)
 {
-  gtk_object_notify_weaks (object);
+  GtkObject *object = GTK_OBJECT (gobject);
 
-  g_datalist_clear (&object->object_data);
+  if (g_object_is_floating (object))
+    {
+      g_warning ("A floating object was finalized. This means that someone\n"
+                "called g_object_unref() on an object that had only a floating\n"
+                "reference; the initial floating reference is not owned by anyone\n"
+                "and must be removed with g_object_ref_sink().");
+    }
+  
+  gtk_object_notify_weaks (object);
   
-  gtk_type_free (GTK_OBJECT_TYPE (object), object);
+  G_OBJECT_CLASS (parent_class)->finalize (gobject);
 }
 
 /*****************************************
@@ -266,237 +457,45 @@ gtk_object_finalize (GtkObject *object)
  *****************************************/
 
 static void
-gtk_object_set_arg (GtkObject *object,
-                   GtkArg    *arg,
-                   guint      arg_id)
+gtk_object_set_property (GObject      *object,
+                        guint         property_id,
+                        const GValue *value,
+                        GParamSpec   *pspec)
 {
-  guint n = 0;
-
-  switch (arg_id)
+  switch (property_id)
     {
-      gchar *arg_name;
-
-    case ARG_USER_DATA:
-      gtk_object_set_user_data (object, GTK_VALUE_POINTER (*arg));
-      break;
-    case ARG_OBJECT_SIGNAL_AFTER:
-      n += 6;
-    case ARG_OBJECT_SIGNAL:
-      n += 1;
-    case ARG_SIGNAL_AFTER:
-      n += 6;
-    case ARG_SIGNAL:
-      n += 6;
-      arg_name = gtk_arg_name_strip_type (arg->name);
-      if (arg_name &&
-         arg_name[n] == ':' &&
-         arg_name[n + 1] == ':' &&
-         arg_name[n + 2] != 0)
-       {
-         gtk_signal_connect_full (object,
-                                  arg_name + n + 2,
-                                  GTK_VALUE_SIGNAL (*arg).f, NULL,
-                                  GTK_VALUE_SIGNAL (*arg).d,
-                                  NULL,
-                                  (arg_id == ARG_OBJECT_SIGNAL ||
-                                   arg_id == ARG_OBJECT_SIGNAL_AFTER),
-                                  (arg_id == ARG_OBJECT_SIGNAL_AFTER ||
-                                   arg_id == ARG_SIGNAL_AFTER));
-       }
-      else
-       g_warning ("gtk_object_set_arg(): invalid signal argument: \"%s\"\n", arg->name);
+    case PROP_USER_DATA:
+      g_object_set_data (G_OBJECT (object), I_("user_data"), g_value_get_pointer (value));
       break;
     default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
     }
 }
 
 static void
-gtk_object_get_arg (GtkObject *object,
-                   GtkArg    *arg,
-                   guint      arg_id)
+gtk_object_get_property (GObject     *object,
+                        guint        property_id,
+                        GValue      *value,
+                        GParamSpec  *pspec)
 {
-  switch (arg_id)
+  switch (property_id)
     {
-    case ARG_USER_DATA:
-      GTK_VALUE_POINTER (*arg) = gtk_object_get_user_data (object);
+    case PROP_USER_DATA:
+      g_value_set_pointer (value, g_object_get_data (G_OBJECT (object), "user_data"));
       break;
-    case ARG_SIGNAL:
-    case ARG_OBJECT_SIGNAL:
     default:
-      arg->type = GTK_TYPE_INVALID;
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
     }
 }
 
-/*****************************************
- * gtk_object_class_add_signals:
- *
- *   arguments:
- *
- *   results:
- *****************************************/
-
-void
-gtk_object_class_add_signals (GtkObjectClass *class,
-                             guint          *signals,
-                             guint           nsignals)
-{
-  g_return_if_fail (GTK_IS_OBJECT_CLASS (class));
-  if (!nsignals)
-    return;
-  g_return_if_fail (signals != NULL);
-  
-  class->signals = g_renew (guint, class->signals, class->nsignals + nsignals);
-  memcpy (class->signals + class->nsignals, signals, nsignals * sizeof (guint));
-  class->nsignals += nsignals;
-}
-
-guint
-gtk_object_class_add_user_signal (GtkObjectClass     *class,
-                                 const gchar        *name,
-                                 GtkSignalMarshaller marshaller,
-                                 GtkType             return_val,
-                                 guint               nparams,
-                                 ...)
-{
-  GtkType *params;
-  guint i;
-  va_list args;
-  guint signal_id;
-
-  g_return_val_if_fail (class != NULL, 0);
-
-  g_message ("gtk_object_class_add_user_signal() is deprecated");
-
-  if (nparams > 0)
-    {
-      params = g_new (GtkType, nparams);
-
-      va_start (args, nparams);
-
-      for (i = 0; i < nparams; i++)
-       params[i] = va_arg (args, GtkType);
-
-      va_end (args);
-    }
-  else
-    params = NULL;
-
-  signal_id = gtk_signal_newv (name,
-                              0,
-                              class->type,
-                              0,
-                              marshaller,
-                              return_val,
-                              nparams,
-                              params);
-
-  g_free (params);
-
-  if (signal_id)
-    gtk_object_class_add_signals (class, &signal_id, 1);
-
-  return signal_id;
-}
-
-guint
-gtk_object_class_user_signal_new (GtkObjectClass     *class,
-                                 const gchar        *name,
-                                 GtkSignalRunType    signal_flags,
-                                 GtkSignalMarshaller marshaller,
-                                 GtkType             return_val,
-                                 guint               nparams,
-                                 ...)
-{
-  GtkType *params;
-  guint i;
-  va_list args;
-  guint signal_id;
-
-  g_return_val_if_fail (class != NULL, 0);
-
-  if (nparams > 0)
-    {
-      params = g_new (GtkType, nparams);
-
-      va_start (args, nparams);
-
-      for (i = 0; i < nparams; i++)
-       params[i] = va_arg (args, GtkType);
-
-      va_end (args);
-    }
-  else
-    params = NULL;
-
-  signal_id = gtk_signal_newv (name,
-                              signal_flags,
-                              class->type,
-                              0,
-                              marshaller,
-                              return_val,
-                              nparams,
-                              params);
-
-  g_free (params);
-
-  if (signal_id)
-    gtk_object_class_add_signals (class, &signal_id, 1);
-
-  return signal_id;
-}
-
-guint
-gtk_object_class_user_signal_newv (GtkObjectClass     *class,
-                                  const gchar        *name,
-                                  GtkSignalRunType    signal_flags,
-                                  GtkSignalMarshaller marshaller,
-                                  GtkType             return_val,
-                                  guint               nparams,
-                                  GtkType            *params)
-{
-  guint signal_id;
-
-  g_return_val_if_fail (class != NULL, 0);
-
-  if (nparams > 0)
-    g_return_val_if_fail (params != NULL, 0);
-
-  signal_id = gtk_signal_newv (name,
-                              signal_flags,
-                              class->type,
-                              0,
-                              marshaller,
-                              return_val,
-                              nparams,
-                              params);
-
-  if (signal_id)
-    gtk_object_class_add_signals (class, &signal_id, 1);
-
-  return signal_id;
-}
-
-/*****************************************
- * gtk_object_sink:
- *
- *   arguments:
- *
- *   results:
- *****************************************/
-
 void
 gtk_object_sink (GtkObject *object)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
-
-  if (GTK_OBJECT_FLOATING (object))
-    {
-      GTK_OBJECT_UNSET_FLAGS (object, GTK_FLOATING);
-      gtk_object_unref (object);
-    }
+  g_object_ref_sink (object);
+  g_object_unref (object);
 }
 
 /*****************************************
@@ -534,7 +533,6 @@ gtk_object_weakref (GtkObject        *object,
 {
   GtkWeakRef *weak;
 
-  g_return_if_fail (object != NULL);
   g_return_if_fail (notify != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
@@ -542,10 +540,10 @@ gtk_object_weakref (GtkObject        *object,
     quark_weakrefs = g_quark_from_static_string ("gtk-weakrefs");
 
   weak = g_new (GtkWeakRef, 1);
-  weak->next = gtk_object_get_data_by_id (object, quark_weakrefs);
+  weak->next = g_object_get_qdata (G_OBJECT (object), quark_weakrefs);
   weak->notify = notify;
   weak->data = data;
-  gtk_object_set_data_by_id (object, quark_weakrefs, weak);
+  g_object_set_qdata (G_OBJECT (object), quark_weakrefs, weak);
 }
 
 void
@@ -555,20 +553,19 @@ gtk_object_weakunref (GtkObject        *object,
 {
   GtkWeakRef *weaks, *w, **wp;
 
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
   if (!quark_weakrefs)
     return;
 
-  weaks = gtk_object_get_data_by_id (object, quark_weakrefs);
+  weaks = g_object_get_qdata (G_OBJECT (object), quark_weakrefs);
   for (wp = &weaks; *wp; wp = &(*wp)->next)
     {
       w = *wp;
       if (w->notify == notify && w->data == data)
        {
          if (w == weaks)
-           gtk_object_set_data_by_id (object, quark_weakrefs, w->next);
+           g_object_set_qdata (G_OBJECT (object), quark_weakrefs, w->next);
          else
            *wp = w->next;
          g_free (w);
@@ -584,7 +581,7 @@ gtk_object_notify_weaks (GtkObject *object)
     {
       GtkWeakRef *w1, *w2;
       
-      w1 = gtk_object_get_data_by_id (object, quark_weakrefs);
+      w1 = g_object_get_qdata (G_OBJECT (object), quark_weakrefs);
       
       while (w1)
        {
@@ -596,410 +593,49 @@ gtk_object_notify_weaks (GtkObject *object)
     }
 }
 
-/****************************************************
- * GtkObject argument mechanism and object creation
- *
- ****************************************************/
-
 GtkObject*
 gtk_object_new (GtkType      object_type,
-               const gchar *first_arg_name,
+               const gchar *first_property_name,
                ...)
 {
   GtkObject *object;
   va_list var_args;
-  GSList *arg_list = NULL;
-  GSList *info_list = NULL;
-  gchar *error;
 
-  g_return_val_if_fail (GTK_FUNDAMENTAL_TYPE (object_type) == GTK_TYPE_OBJECT, NULL);
+  g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
 
-  object = gtk_type_new (object_type);
-
-  va_start (var_args, first_arg_name);
-  error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
-                                  &arg_list,
-                                  &info_list,
-                                  first_arg_name,
-                                  var_args);
+  va_start (var_args, first_property_name);
+  object = (GtkObject *)g_object_new_valist (object_type, first_property_name, var_args);
   va_end (var_args);
-  
-  if (error)
-    {
-      g_warning ("gtk_object_new(): %s", error);
-      g_free (error);
-    }
-  else
-    {
-      GSList *slist_arg;
-      GSList *slist_info;
-      
-      slist_arg = arg_list;
-      slist_info = info_list;
-      while (slist_arg)
-       {
-         gtk_object_arg_set (object, slist_arg->data, slist_info->data);
-         slist_arg = slist_arg->next;
-         slist_info = slist_info->next;
-       }
-      gtk_args_collect_cleanup (arg_list, info_list);
-    }
-
-  if (!GTK_OBJECT_CONSTRUCTED (object))
-    gtk_object_default_construct (object);
-
-  return object;
-}
-
-GtkObject*
-gtk_object_newv (GtkType  object_type,
-                guint    n_args,
-                GtkArg  *args)
-{
-  GtkObject *object;
-  GtkArg *max_args;
-  
-  g_return_val_if_fail (GTK_FUNDAMENTAL_TYPE (object_type) == GTK_TYPE_OBJECT, NULL);
-  if (n_args)
-    g_return_val_if_fail (args != NULL, NULL);
-  
-  object = gtk_type_new (object_type);
-  
-  for (max_args = args + n_args; args < max_args; args++)
-    gtk_object_arg_set (object, args, NULL);
-  
-  if (!GTK_OBJECT_CONSTRUCTED (object))
-    gtk_object_default_construct (object);
 
   return object;
 }
 
 void
-gtk_object_setv (GtkObject *object,
-                guint      n_args,
-                GtkArg    *args)
-{
-  GtkArg *max_args;
-  
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-  if (n_args)
-    g_return_if_fail (args != NULL);
-
-  for (max_args = args + n_args; args < max_args; args++)
-    gtk_object_arg_set (object, args, NULL);
-}
-
-void
-gtk_object_getv (GtkObject           *object,
-                guint                n_args,
-                GtkArg              *args)
-{
-  GtkArg *max_args;
-  
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-  if (n_args)
-    g_return_if_fail (args != NULL);
-  
-  for (max_args = args + n_args; args < max_args; args++)
-    gtk_object_arg_get (object, args, NULL);
-}
-
-void
-gtk_object_set (GtkObject *object,
-               const gchar    *first_arg_name,
+gtk_object_get (GtkObject   *object,
+               const gchar *first_property_name,
                ...)
 {
   va_list var_args;
-  GSList *arg_list = NULL;
-  GSList *info_list = NULL;
-  gchar *error;
   
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   
-  va_start (var_args, first_arg_name);
-  error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
-                                  &arg_list,
-                                  &info_list,
-                                  first_arg_name,
-                                  var_args);
+  va_start (var_args, first_property_name);
+  g_object_get_valist (G_OBJECT (object), first_property_name, var_args);
   va_end (var_args);
-  
-  if (error)
-    {
-      g_warning ("gtk_object_set(): %s", error);
-      g_free (error);
-    }
-  else
-    {
-      GSList *slist_arg;
-      GSList *slist_info;
-      
-      slist_arg = arg_list;
-      slist_info = info_list;
-      while (slist_arg)
-       {
-         gtk_object_arg_set (object, slist_arg->data, slist_info->data);
-         slist_arg = slist_arg->next;
-         slist_info = slist_info->next;
-       }
-      gtk_args_collect_cleanup (arg_list, info_list);
-    }
-}
-
-void
-gtk_object_arg_set (GtkObject  *object,
-                   GtkArg     *arg,
-                   GtkArgInfo *info)
-{
-  GtkObjectClass *oclass;
-
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (arg != NULL);
-
-  if (!info)
-    {
-      gchar *error;
-
-      error = gtk_arg_get_info (GTK_OBJECT_TYPE (object),
-                               object_arg_info_ht,
-                               arg->name,
-                               &info);
-      if (error)
-       {
-         g_warning ("gtk_object_arg_set(): %s", error);
-         g_free (error);
-         return;
-       }
-    }
-
-  if (info->arg_flags & GTK_ARG_CONSTRUCT_ONLY &&
-      GTK_OBJECT_CONSTRUCTED (object))
-    {
-      g_warning ("gtk_object_arg_set(): cannot set argument \"%s\" for constructed object",
-                info->full_name);
-      return;
-    }
-  if (!(info->arg_flags & GTK_ARG_WRITABLE))
-    {
-      g_warning ("gtk_object_arg_set(): argument \"%s\" is not writable",
-                info->full_name);
-      return;
-    }
-  if (info->type != arg->type)
-    {
-      g_warning ("gtk_object_arg_set(): argument \"%s\" has invalid type `%s'",
-                info->full_name,
-                gtk_type_name (arg->type));
-      return;
-    }
-  
-  oclass = gtk_type_class (info->class_type);
-  g_assert (oclass->set_arg != NULL);
-  oclass->set_arg (object, arg, info->arg_id);
-  if (!GTK_OBJECT_CONSTRUCTED (object) &&
-      (info->arg_flags & GTK_ARG_CONSTRUCT_ONLY ||
-       info->arg_flags & GTK_ARG_CONSTRUCT))
-    {
-      GSList *slist;
-
-      slist = gtk_object_get_data_by_id (object, quark_carg_history);
-      gtk_object_set_data_by_id (object,
-                                quark_carg_history,
-                                g_slist_prepend (slist, info));
-    }
 }
 
 void
-gtk_object_arg_get (GtkObject  *object,
-                   GtkArg     *arg,
-                   GtkArgInfo *info)
+gtk_object_set (GtkObject   *object,
+               const gchar *first_property_name,
+               ...)
 {
-  GtkObjectClass *oclass;
-  
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (arg != NULL);
-
-  if (!info)
-    {
-      gchar *error;
-
-      error = gtk_arg_get_info (GTK_OBJECT_TYPE (object),
-                               object_arg_info_ht,
-                               arg->name,
-                               &info);
-      if (error)
-       {
-         g_warning ("gtk_object_arg_get(): %s", error);
-         g_free (error);
-         arg->type = GTK_TYPE_INVALID;
-         return;
-       }
-    }
-  
-  if (! (info->arg_flags & GTK_ARG_READABLE))
-    {
-      g_warning ("gtk_object_arg_get(): argument \"%s\" is not readable",
-                info->full_name);
-      arg->type = GTK_TYPE_INVALID;
-      return;
-    }
+  va_list var_args;
   
-  oclass = gtk_type_class (info->class_type);
-  g_assert (oclass->get_arg != NULL);
-  arg->type = info->type;
-  oclass->get_arg (object, arg, info->arg_id);
-}
-
-void
-gtk_object_default_construct (GtkObject *object)
-{
-  GSList *slist;
-
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-
-  if (!GTK_OBJECT_CONSTRUCTED (object))
-    {
-      for (slist = object->klass->construct_args;
-          slist && !GTK_OBJECT_CONSTRUCTED (object);
-          slist = slist->next)
-       {
-         GSList *history;
-         GtkArgInfo *info;
-         
-         info = slist->data;
-         history = gtk_object_get_data_by_id (object, quark_carg_history);
-         if (!g_slist_find (history, info))
-           {
-             GtkArg arg;
-             
-             /* default application */
-             arg.type = info->type;
-             arg.name = info->name;
-             switch (gtk_type_get_varargs_type (arg.type))
-               {
-               case GTK_TYPE_FLOAT:
-                 GTK_VALUE_FLOAT (arg) = 0.0;
-                 break;
-               case GTK_TYPE_DOUBLE:
-                 GTK_VALUE_DOUBLE (arg) = 0.0;
-                 break;
-               case GTK_TYPE_BOXED:
-               case GTK_TYPE_STRING:
-               case GTK_TYPE_POINTER:
-               case GTK_TYPE_OBJECT:
-                 GTK_VALUE_POINTER (arg) = NULL;
-                 break;
-               default:
-                 memset (&arg.d, 0, sizeof (arg.d));
-                 break;
-               }
-             gtk_object_arg_set (object, &arg, info);
-           }
-       }
-
-      if (!GTK_OBJECT_CONSTRUCTED (object))
-       gtk_object_constructed (object);
-    }
-}
-
-void
-gtk_object_constructed (GtkObject *object)
-{
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (GTK_OBJECT_CONSTRUCTED (object) == FALSE);
   
-  g_slist_free (gtk_object_get_data_by_id (object, quark_carg_history));
-  gtk_object_set_data_by_id (object, quark_carg_history, NULL);
-  GTK_OBJECT_FLAGS (object) |= GTK_CONSTRUCTED;
-}
-
-void
-gtk_object_add_arg_type (const char *arg_name,
-                        GtkType     arg_type,
-                        guint       arg_flags,
-                        guint       arg_id)
-{
-  GtkArgInfo *info;
-
-  g_return_if_fail (arg_name != NULL);
-  g_return_if_fail (arg_type > GTK_TYPE_NONE);
-  g_return_if_fail (arg_id > 0);
-  g_return_if_fail ((arg_flags & GTK_ARG_CHILD_ARG) == 0);
-  if (arg_flags & GTK_ARG_CONSTRUCT)
-    g_return_if_fail ((arg_flags & GTK_ARG_READWRITE) == GTK_ARG_READWRITE);
-  else
-    g_return_if_fail ((arg_flags & GTK_ARG_READWRITE) != 0);
-  if (arg_flags & GTK_ARG_CONSTRUCT_ONLY)
-    g_return_if_fail ((arg_flags & GTK_ARG_WRITABLE) == GTK_ARG_WRITABLE);
-    
-  if (!object_arg_info_ht)
-    object_arg_info_ht = g_hash_table_new (gtk_arg_info_hash,
-                                          gtk_arg_info_equal);
-
-  info = gtk_arg_type_new_static (GTK_TYPE_OBJECT,
-                                 arg_name,
-                                 GTK_STRUCT_OFFSET (GtkObjectClass, n_args),
-                                 object_arg_info_ht,
-                                 arg_type,
-                                 arg_flags,
-                                 arg_id);
-  if (info &&
-      (info->arg_flags & GTK_ARG_CONSTRUCT ||
-       info->arg_flags & GTK_ARG_CONSTRUCT_ONLY))
-    {
-      GtkObjectClass *class;
-
-      class = gtk_type_class (info->class_type);
-      if (info->arg_flags & GTK_ARG_CONSTRUCT_ONLY)
-       class->construct_args = g_slist_prepend (class->construct_args, info);
-      else
-       class->construct_args = g_slist_append (class->construct_args, info);
-    }
-}
-
-gchar*
-gtk_object_args_collect (GtkType      object_type,
-                        GSList      **arg_list_p,
-                        GSList      **info_list_p,
-                        const gchar  *first_arg_name,
-                        va_list       var_args)
-{
-  return gtk_args_collect (object_type,
-                          object_arg_info_ht,
-                          arg_list_p,
-                          info_list_p,
-                          first_arg_name,
-                          var_args);
-}
-
-gchar*
-gtk_object_arg_get_info (GtkType      object_type,
-                        const gchar *arg_name,
-                        GtkArgInfo **info_p)
-{
-  return gtk_arg_get_info (object_type,
-                          object_arg_info_ht,
-                          arg_name,
-                          info_p);
-}
-
-GtkArg*
-gtk_object_query_args (GtkType        class_type,
-                      guint32      **arg_flags,
-                      guint         *n_args)
-{
-  g_return_val_if_fail (n_args != NULL, NULL);
-  *n_args = 0;
-  g_return_val_if_fail (GTK_FUNDAMENTAL_TYPE (class_type) == GTK_TYPE_OBJECT, NULL);
-
-  return gtk_args_query (class_type, object_arg_info_ht, arg_flags, n_args);
+  va_start (var_args, first_property_name);
+  g_object_set_valist (G_OBJECT (object), first_property_name, var_args);
+  va_end (var_args);
 }
 
 /*****************************************
@@ -1012,10 +648,9 @@ gtk_object_set_data_by_id (GtkObject        *object,
                           GQuark            data_id,
                           gpointer          data)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   
-  g_datalist_id_set_data (&object->object_data, data_id, data);
+  g_datalist_id_set_data (&G_OBJECT (object)->qdata, data_id, data);
 }
 
 void
@@ -1023,11 +658,10 @@ gtk_object_set_data (GtkObject        *object,
                     const gchar      *key,
                     gpointer          data)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   g_return_if_fail (key != NULL);
   
-  g_datalist_set_data (&object->object_data, key, data);
+  g_datalist_set_data (&G_OBJECT (object)->qdata, key, data);
 }
 
 void
@@ -1036,10 +670,9 @@ gtk_object_set_data_by_id_full (GtkObject        *object,
                                gpointer          data,
                                GtkDestroyNotify  destroy)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
-  g_datalist_id_set_data_full (&object->object_data, data_id, data, destroy);
+  g_datalist_id_set_data_full (&G_OBJECT (object)->qdata, data_id, data, destroy);
 }
 
 void
@@ -1048,186 +681,101 @@ gtk_object_set_data_full (GtkObject        *object,
                          gpointer          data,
                          GtkDestroyNotify  destroy)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   g_return_if_fail (key != NULL);
 
-  g_datalist_set_data_full (&object->object_data, key, data, destroy);
+  g_datalist_set_data_full (&G_OBJECT (object)->qdata, key, data, destroy);
 }
 
 gpointer
 gtk_object_get_data_by_id (GtkObject   *object,
                           GQuark       data_id)
 {
-  g_return_val_if_fail (object != NULL, NULL);
   g_return_val_if_fail (GTK_IS_OBJECT (object), NULL);
 
-  return g_datalist_id_get_data (&object->object_data, data_id);
+  return g_datalist_id_get_data (&G_OBJECT (object)->qdata, data_id);
 }
 
 gpointer
 gtk_object_get_data (GtkObject   *object,
                     const gchar *key)
 {
-  g_return_val_if_fail (object != NULL, NULL);
   g_return_val_if_fail (GTK_IS_OBJECT (object), NULL);
   g_return_val_if_fail (key != NULL, NULL);
 
-  return g_datalist_get_data (&object->object_data, key);
+  return g_datalist_get_data (&G_OBJECT (object)->qdata, key);
 }
 
 void
 gtk_object_remove_data_by_id (GtkObject   *object,
                              GQuark       data_id)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
-  g_datalist_id_remove_data (&object->object_data, data_id);
+  g_datalist_id_remove_data (&G_OBJECT (object)->qdata, data_id);
 }
 
 void
 gtk_object_remove_data (GtkObject   *object,
                        const gchar *key)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   g_return_if_fail (key != NULL);
 
-  g_datalist_remove_data (&object->object_data, key);
+  g_datalist_remove_data (&G_OBJECT (object)->qdata, key);
 }
 
 void
 gtk_object_remove_no_notify_by_id (GtkObject      *object,
                                   GQuark          key_id)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
-  g_datalist_id_remove_no_notify (&object->object_data, key_id);
+  g_datalist_id_remove_no_notify (&G_OBJECT (object)->qdata, key_id);
 }
 
 void
 gtk_object_remove_no_notify (GtkObject       *object,
                             const gchar     *key)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   g_return_if_fail (key != NULL);
 
-  g_datalist_remove_no_notify (&object->object_data, key);
+  g_datalist_remove_no_notify (&G_OBJECT (object)->qdata, key);
 }
 
 void
 gtk_object_set_user_data (GtkObject *object,
                          gpointer   data)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
 
-  if (!quark_user_data)
-    quark_user_data = g_quark_from_static_string ("user_data");
-
-  g_datalist_id_set_data (&object->object_data, quark_user_data, data);
+  g_object_set_data (G_OBJECT (object), "user_data", data);
 }
 
 gpointer
 gtk_object_get_user_data (GtkObject *object)
 {
-  g_return_val_if_fail (object != NULL, NULL);
   g_return_val_if_fail (GTK_IS_OBJECT (object), NULL);
 
-  return g_datalist_id_get_data (&object->object_data, quark_user_data);
+  return g_object_get_data (G_OBJECT (object), "user_data");
 }
 
-/*******************************************
- * GtkObject referencing and unreferencing
- *
- *******************************************/
-
-#undef gtk_object_ref
-#undef gtk_object_unref
-
-void
+GtkObject*
 gtk_object_ref (GtkObject *object)
 {
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (object->ref_count > 0);
+  g_return_val_if_fail (GTK_IS_OBJECT (object), NULL);
 
-  object->ref_count += 1;
+  return (GtkObject*) g_object_ref ((GObject*) object);
 }
 
 void
 gtk_object_unref (GtkObject *object)
 {
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
-  g_return_if_fail (object->ref_count > 0);
-  
-  if (object->ref_count == 1)
-    {
-      gtk_object_destroy (object);
-  
-      g_return_if_fail (object->ref_count > 0);
-    }
-
-  object->ref_count -= 1;
 
-  if (object->ref_count == 0)
-    {
-#ifdef G_ENABLE_DEBUG
-      if (gtk_debug_flags & GTK_DEBUG_OBJECTS)
-       {
-         g_assert (g_hash_table_lookup (living_objs_ht, object) == object);
-         g_hash_table_remove (living_objs_ht, object);
-         obj_count--;
-       }
-#endif /* G_ENABLE_DEBUG */      
-      object->klass->finalize (object);
-    }
+  g_object_unref ((GObject*) object);
 }
 
-static GtkObject *gtk_trace_object = NULL;
-void
-gtk_trace_referencing (GtkObject   *object,
-                      const gchar *func,
-                      guint       dummy,
-                      guint       line,
-                      gboolean    do_ref)
-{
-  if (gtk_debug_flags & GTK_DEBUG_OBJECTS)
-    {
-      gboolean exists = TRUE;
-
-      g_return_if_fail (object != NULL);
-      g_return_if_fail (GTK_IS_OBJECT (object));
-
-#ifdef G_ENABLE_DEBUG
-      exists = g_hash_table_lookup (living_objs_ht, object) != NULL;
-#endif /* G_ENABLE_DEBUG */
-      
-      if (exists &&
-         (object == gtk_trace_object ||
-          gtk_trace_object == (void*)42))
-       fprintf (stdout, "trace: object_%s: (%s:%p)->ref_count=%d %s (%s:%d)\n",
-                do_ref ? "ref" : "unref",
-                gtk_type_name (GTK_OBJECT_TYPE (object)),
-                object,
-                object->ref_count,
-                do_ref ? "+ 1" : "- 1",
-                func,
-                line);
-      else if (!exists)
-       fprintf (stdout, "trace: object_%s(%p): no such object! (%s:%d)\n",
-                do_ref ? "ref" : "unref",
-                object,
-                func,
-                line);
-    }
-  
-  if (do_ref)
-    gtk_object_ref (object);
-  else
-    gtk_object_unref (object);
-}
+#define __GTK_OBJECT_C__
+#include "gtkaliasdef.c"