invoke GObjectClass.constructed() only for newly constructed objects, and
authorRyan Lortie <desrt@desrt.ca>
Tue, 3 Apr 2007 10:44:30 +0000 (10:44 +0000)
committerTim Janik <timj@src.gnome.org>
Tue, 3 Apr 2007 10:44:30 +0000 (10:44 +0000)
Tue Apr  3 12:34:14 2007  Tim Janik  <timj@gtk.org>

        * gobject.[hc]: invoke GObjectClass.constructed() only for newly
        constructed objects, and invoke it while the notify queue is
        still being frozen, after all CONSTRUCT* properties have been
        set and before random other properties are being set.

        * applied modified patch from Ryan Lortie to implement
        GObjectClass.constructed() to fix #425324.

2007-04-02  Ryan Lortie  <desrt@desrt.ca>

        * gobject/gobject.h: Add 'constructed' vcall to GObjectClass.
        * gobject/gobject.c (g_object_newv): call ->constructed() as last
        step of object construction.

svn path=/trunk/; revision=5441

gobject/ChangeLog
gobject/gobject.c
gobject/gobject.h

index 8183a2a..14252b4 100644 (file)
@@ -1,3 +1,19 @@
+Tue Apr  3 12:34:14 2007  Tim Janik  <timj@gtk.org>
+
+       * gobject.[hc]: invoke GObjectClass.constructed() only for newly
+       constructed objects, and invoke it while the notify queue is
+       still being frozen, after all CONSTRUCT* properties have been
+       set and before random other properties are being set.
+
+       * applied modified patch from Ryan Lortie to implement
+       GObjectClass.constructed() to fix #425324.
+
+2007-04-02  Ryan Lortie  <desrt@desrt.ca>
+
+       * gobject/gobject.h: Add 'constructed' vcall to GObjectClass.
+       * gobject/gobject.c (g_object_newv): call ->constructed() as last
+       step of object construction.
+
 2007-03-16  Matthias Clasen  <mclasen@redhat.com>
 
        * === Released 2.13.0 ===
index 7514c9a..abcc56c 100644 (file)
@@ -950,6 +950,10 @@ g_object_newv (GType       object_type,
   if (newly_constructed)
     g_object_notify_queue_thaw (object, nqueue);
 
+  /* run 'constructed' handler if there is one */
+  if (newly_constructed && class->constructed)
+    class->constructed (object);
+
   /* set remaining properties */
   for (i = 0; i < n_oparams; i++)
     object_set_property (object, oparams[i].pspec, oparams[i].value, nqueue);
@@ -958,6 +962,7 @@ g_object_newv (GType       object_type,
   /* release our own freeze count and handle notifications */
   if (newly_constructed || n_oparams)
     g_object_notify_queue_thaw (object, nqueue);
+
   if (unref_class)
     g_type_class_unref (unref_class);
 
index 4dda126..4f7ef57 100644 (file)
@@ -87,10 +87,11 @@ struct  _GObjectClass
   GSList      *construct_properties;
 
   /*< public >*/
-  /* overridable methods */
+  /* seldomly overidden */
   GObject*   (*constructor)     (GType                  type,
                                  guint                  n_construct_properties,
                                  GObjectConstructParam *construct_properties);
+  /* overridable methods */
   void       (*set_property)           (GObject        *object,
                                          guint           property_id,
                                          const GValue   *value,
@@ -101,18 +102,20 @@ struct  _GObjectClass
                                          GParamSpec     *pspec);
   void       (*dispose)                        (GObject        *object);
   void       (*finalize)               (GObject        *object);
-  
   /* seldomly overidden */
   void       (*dispatch_properties_changed) (GObject      *object,
                                             guint         n_pspecs,
                                             GParamSpec  **pspecs);
-
   /* signals */
   void      (*notify)                  (GObject        *object,
                                         GParamSpec     *pspec);
+
+  /* called when done constructing */
+  void      (*constructed)             (GObject        *object);
+
   /*< private >*/
   /* padding */
-  gpointer     pdummy[8];
+  gpointer     pdummy[7];
 };
 struct _GObjectConstructParam
 {