]> 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 ff9c0817385c0b150ad18acae12feb0762490aed..a2dde92d8423f87899c91ee7983efa124073d7da 100644 (file)
  * 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 {
@@ -37,11 +47,10 @@ enum {
 };
 enum {
   PROP_0,
-  PROP_USER_DATA,
+  PROP_USER_DATA
 };
 
 
-extern void      gtk_object_init_type           (void);        /* for gtktypeutils.h */
 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);
@@ -50,21 +59,18 @@ static void       gtk_object_init                (GtkObject      *object,
 static void      gtk_object_set_property        (GObject        *object,
                                                  guint           property_id,
                                                  const GValue   *value,
-                                                 GParamSpec     *pspec,
-                                                 const gchar    *trailer);
+                                                 GParamSpec     *pspec);
 static void      gtk_object_get_property        (GObject        *object,
                                                  guint           property_id,
                                                  GValue         *value,
-                                                 GParamSpec     *pspec,
-                                                 const gchar    *trailer);
-static void       gtk_object_shutdown            (GObject        *object);
+                                                 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_user_data = 0;
 static GQuark      quark_weakrefs = 0;
 
 
@@ -73,14 +79,14 @@ static GQuark      quark_weakrefs = 0;
  *
  ****************************************************/
 
-GtkType
+GType
 gtk_object_get_type (void)
 {
-  static GtkType object_type = 0;
+  static GType object_type = 0;
 
   if (!object_type)
     {
-      static const GTypeInfo object_info =
+      const GTypeInfo object_info =
       {
        sizeof (GtkObjectClass),
        (GBaseInitFunc) gtk_object_base_class_init,
@@ -89,11 +95,13 @@ gtk_object_get_type (void)
        NULL,           /* class_finalize */
        NULL,           /* class_data */
        sizeof (GtkObject),
-       16,                     /* n_preallocs */
+       16,             /* n_preallocs */
        (GInstanceInitFunc) gtk_object_init,
+       NULL,           /* value_table */
       };
       
-      object_type = g_type_register_static (G_TYPE_OBJECT, "GtkObject", &object_info, 0);
+      object_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED, I_("GtkObject"), 
+                                           &object_info, G_TYPE_FLAG_ABSTRACT);
     }
 
   return object_type;
@@ -136,7 +144,7 @@ gtk_arg_set_from_value (GtkArg       *arg,
     case G_TYPE_STRING:         if (copy_string)
       GTK_VALUE_STRING (*arg) = g_value_dup_string (value);
     else
-      GTK_VALUE_STRING (*arg) = g_value_get_string (value);
+      GTK_VALUE_STRING (*arg) = (char *) g_value_get_string (value);
     break;
     default:
       return FALSE;
@@ -175,14 +183,14 @@ static void
 gtk_arg_proxy_set_property (GObject      *object,
                            guint         property_id,
                            const GValue *value,
-                           GParamSpec   *pspec,
-                           const gchar  *trailer)
+                           GParamSpec   *pspec)
 {
   GtkObjectClass *class = g_type_class_peek (pspec->owner_type);
-  GtkArg arg = { 0, };
+  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;
@@ -193,14 +201,14 @@ static void
 gtk_arg_proxy_get_property (GObject     *object,
                            guint        property_id,
                            GValue      *value,
-                           GParamSpec  *pspec,
-                           const gchar *trailer)
+                           GParamSpec  *pspec)
 {
   GtkObjectClass *class = g_type_class_peek (pspec->owner_type);
-  GtkArg arg = { 0, };
+  GtkArg arg;
 
   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);
@@ -221,12 +229,12 @@ gtk_object_add_arg_type (const gchar *arg_name,
   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 & GTK_ARG_READWRITE);
+  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 & ~(GTK_ARG_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)) == 0);
+  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] == ':');
@@ -238,7 +246,7 @@ gtk_object_add_arg_type (const gchar *arg_name,
   g_return_if_fail (G_TYPE_IS_OBJECT (type));
 
   oclass = gtk_type_class (type);
-  if (arg_flags & GTK_ARG_READABLE)
+  if (arg_flags & G_PARAM_READABLE)
     {
       if (oclass->get_property && oclass->get_property != gtk_arg_proxy_get_property)
        {
@@ -248,7 +256,7 @@ gtk_object_add_arg_type (const gchar *arg_name,
        }
       oclass->get_property = gtk_arg_proxy_get_property;
     }
-  if (arg_flags & GTK_ARG_WRITABLE)
+  if (arg_flags & G_PARAM_WRITABLE)
     {
       if (oclass->set_property && oclass->set_property != gtk_arg_proxy_set_property)
        {
@@ -276,20 +284,23 @@ gtk_object_add_arg_type (const gchar *arg_name,
       pspec = g_param_spec_boolean (pname, NULL, NULL, FALSE, arg_flags);
       break;
     case G_TYPE_INT:
-      pspec = g_param_spec_int (pname, NULL, NULL, -2147483647, 2147483647, 0, arg_flags);
+      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, 4294967295U, 0, arg_flags);
+      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, -1E+37, 1E+37, 0, arg_flags);
+      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, -1E+307, 1E+307, 0, arg_flags);
+      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;
@@ -307,39 +318,79 @@ gtk_object_add_arg_type (const gchar *arg_name,
   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)
 {
   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->shutdown = gtk_object_shutdown;
+  gobject_class->dispose = gtk_object_dispose;
   gobject_class->finalize = gtk_object_finalize;
 
   class->destroy = gtk_object_real_destroy;
 
   g_object_class_install_property (gobject_class,
                                   PROP_USER_DATA,
-                                  g_param_spec_pointer ("user_data", "User Data",
-                                                        "Anonymous User Data Pointer",
-                                                        G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                  g_param_spec_pointer ("user-data", 
+                                                        P_("User Data"),
+                                                        P_("Anonymous User Data Pointer"),
+                                                        GTK_PARAM_READWRITE));
   object_signals[DESTROY] =
-    gtk_signal_new ("destroy",
-                    G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | GTK_RUN_NO_HOOKS,
-                    GTK_CLASS_TYPE (class),
-                    GTK_SIGNAL_OFFSET (GtkObjectClass, destroy),
-                    gtk_marshal_VOID__VOID,
-                   GTK_TYPE_NONE, 0);
+    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)
 {
-  GTK_OBJECT_FLAGS (object) = GTK_FLOATING;
+  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));
 }
 
 /********************************************
@@ -352,41 +403,34 @@ gtk_object_destroy (GtkObject *object)
   g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_OBJECT (object));
   
-  if (!GTK_OBJECT_DESTROYED (object))
-    {
-      /* need to hold a reference count around all class method
-       * invocations.
-       */
-      gtk_object_ref (object);
-      G_OBJECT_GET_CLASS (object)->shutdown (G_OBJECT (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 (GObject *gobject)
+gtk_object_dispose (GObject *gobject)
 {
   GtkObject *object = GTK_OBJECT (gobject);
 
   /* guard against reinvocations during
-   * destruction with the GTK_DESTROYED flag.
+   * destruction with the GTK_IN_DESTRUCTION flag.
    */
-  if (!GTK_OBJECT_DESTROYED (object))
+  if (!(GTK_OBJECT_FLAGS (object) & GTK_IN_DESTRUCTION))
     {
-      GTK_OBJECT_SET_FLAGS (object, GTK_DESTROYED);
+      GTK_OBJECT_SET_FLAGS (object, GTK_IN_DESTRUCTION);
       
-      gtk_signal_emit (object, object_signals[DESTROY]);
+      g_signal_emit (object, object_signals[DESTROY], 0);
       
-      GTK_OBJECT_UNSET_FLAGS (object, GTK_DESTROYED);
+      GTK_OBJECT_UNSET_FLAGS (object, GTK_IN_DESTRUCTION);
     }
 
-  G_OBJECT_CLASS (parent_class)->shutdown (gobject);
+  G_OBJECT_CLASS (parent_class)->dispose (gobject);
 }
 
 static void
 gtk_object_real_destroy (GtkObject *object)
 {
-  g_signal_handlers_destroy (G_OBJECT (object));
+  g_signal_handlers_destroy (object);
 }
 
 static void
@@ -394,6 +438,14 @@ gtk_object_finalize (GObject *gobject)
 {
   GtkObject *object = GTK_OBJECT (gobject);
 
+  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);
   
   G_OBJECT_CLASS (parent_class)->finalize (gobject);
@@ -408,13 +460,12 @@ static void
 gtk_object_set_property (GObject      *object,
                         guint         property_id,
                         const GValue *value,
-                        GParamSpec   *pspec,
-                        const gchar  *trailer)
+                        GParamSpec   *pspec)
 {
   switch (property_id)
     {
     case PROP_USER_DATA:
-      gtk_object_set_user_data (GTK_OBJECT (object), g_value_get_pointer (value));
+      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);
@@ -426,15 +477,12 @@ static void
 gtk_object_get_property (GObject     *object,
                         guint        property_id,
                         GValue      *value,
-                        GParamSpec  *pspec,
-                        const gchar *trailer)
+                        GParamSpec  *pspec)
 {
   switch (property_id)
     {
     case PROP_USER_DATA:
-      g_return_if_fail (trailer != NULL);
-
-      g_value_set_pointer (value, gtk_object_get_user_data (GTK_OBJECT (object)));
+      g_value_set_pointer (value, g_object_get_data (G_OBJECT (object), "user_data"));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -442,25 +490,12 @@ gtk_object_get_property (GObject     *object,
     }
 }
 
-/*****************************************
- * 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);
 }
 
 /*****************************************
@@ -498,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));
 
@@ -506,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
@@ -519,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);
@@ -548,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)
        {
@@ -568,10 +601,10 @@ gtk_object_new (GtkType      object_type,
   GtkObject *object;
   va_list var_args;
 
-  g_return_val_if_fail (GTK_TYPE_IS_OBJECT (object_type), NULL);
+  g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
 
   va_start (var_args, first_property_name);
-  object = g_object_new_valist (object_type, first_property_name, var_args);
+  object = (GtkObject *)g_object_new_valist (object_type, first_property_name, var_args);
   va_end (var_args);
 
   return object;
@@ -717,10 +750,7 @@ gtk_object_set_user_data (GtkObject *object,
 {
   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 (&G_OBJECT (object)->qdata, quark_user_data, data);
+  g_object_set_data (G_OBJECT (object), "user_data", data);
 }
 
 gpointer
@@ -728,7 +758,7 @@ gtk_object_get_user_data (GtkObject *object)
 {
   g_return_val_if_fail (GTK_IS_OBJECT (object), NULL);
 
-  return g_datalist_id_get_data (&G_OBJECT (object)->qdata, quark_user_data);
+  return g_object_get_data (G_OBJECT (object), "user_data");
 }
 
 GtkObject*
@@ -746,3 +776,6 @@ gtk_object_unref (GtkObject *object)
 
   g_object_unref ((GObject*) object);
 }
+
+#define __GTK_OBJECT_C__
+#include "gtkaliasdef.c"