merged in docs form the gobject tutorial
[platform/upstream/glib.git] / docs / reference / gobject / tut_howto.xml
1 <partintro>
2   <para>
3     This chapter tries to answer the real-life questions of users and presents
4     the most common scenario use-cases I could come up with.
5     The use-cases are presented from most likely to less likely.
6   </para>
7 </partintro>
8
9 <!--
10   Howto GObject
11 -->
12
13   <chapter id="howto-gobject">
14     <title>How To define and implement a new GObject ?</title>
15     
16     <para>
17       Clearly, this is one of the most common question people ask: they just want to crank code and 
18       implement a subclass of a GObject. Sometimes because they want to create their own class hierarchy,
19       sometimes because they want to subclass one of GTK+'s widget. This chapter will focus on the 
20       implementation of a subtype of GObject.  The sample source code
21       associated to this section can be found in the documentation's source tarball, in the 
22       <filename>sample/gobject</filename> directory:
23       <itemizedlist>
24         <listitem><para><filename>maman-bar.{h|c}</filename>: this is the source for a object which derives from 
25         <type><link linkend="GObject">GObject</link></type> and which shows how to declare different types of methods on the object.
26         </para></listitem>
27         <listitem><para><filename>maman-subbar.{h|c}</filename>: this is the source for a object which derives from 
28         <type>MamanBar</type> and which shows how to override some of its parent's methods.
29         </para></listitem>
30         <listitem><para><filename>maman-foo.{h|c}</filename>: this is the source for an object which derives from 
31         <type><link linkend="GObject">GObject</link></type> and which declares a signal.
32         </para></listitem>
33         <listitem><para><filename>test.c</filename>: this is the main source which instantiates an instance of
34         type and exercises their API.
35         </para></listitem>
36       </itemizedlist>
37     </para>
38
39     <sect1 id="howto-gobject-header">
40       <title>Boilerplate header code</title>
41       
42       <para>
43         The first step before writing the code for your GObject is to write the type's header which contains
44         the needed type, function and macro definitions. Each of these elements is nothing but a convention
45         which is followed not only by GTK+'s code but also by most users of GObject. If you feel the need 
46         not to obey the rules stated below, think about it twice:
47         <itemizedlist>
48           <listitem><para>If your users are a bit accustomed to GTK+ code or any Glib code, they will
49               be a bit surprised and getting used to the conventions you decided upon will take time (money) and
50               will make them grumpy (not a good thing)
51             </para></listitem>
52           <listitem><para>
53               You must assess the fact that these conventions might have been designed by both smart
54               and experienced people: maybe they were at least partly right. Try  to put your ego aside.
55             </para></listitem>
56         </itemizedlist>
57       </para>
58
59       <para>
60         Pick a name convention for your headers and source code and stick to it:
61         <itemizedlist>
62           <listitem><para>
63               use a dash to separate the prefix from the typename: <filename>maman-bar.h</filename> and 
64               <filename>maman-bar.c</filename> (this is the convention used by Nautilus and most Gnome libraries).
65             </para></listitem>
66           <listitem><para>
67               use an underscore to separate the prefix from the typename: <filename>maman_bar.h</filename> and 
68               <filename>maman_bar.c</filename>.
69             </para></listitem>
70           <listitem><para>
71               Do not separate the prefix from the typename: <filename>mamanbar.h</filename> and 
72               <filename>mamanbar.c</filename>. (this is the convention used by GTK+)
73             </para></listitem>
74         </itemizedlist>
75         I personally like the first solution better: it makes reading file names easier for those with poor
76         eyesight like me.
77       </para>
78
79       <para>
80         When you need some private (internal) declarations in several (sub)classes,
81         you can define them in a private header file which is often named by
82         appending the <emphasis>private</emphasis> keyword to the public header name.
83         For example, one could use <filename>maman-bar-private.h</filename>, 
84         <filename>maman_bar_private.h</filename> or <filename>mamanbarprivate.h</filename>.
85         Typically, such private header files are not installed.
86       </para>
87
88       <para>
89         The basic conventions for any header which exposes a GType are described in 
90         <xref linkend="gtype-conventions"/>. Most GObject-based code also obeys onf of the following
91         conventions: pick one and stick to it.
92         <itemizedlist>
93           <listitem><para>
94               If you want to declare a type named bar with prefix maman, name the type instance
95               <function>MamanBar</function> and its class <function>MamanBarClass</function>
96               (name is case-sensitive). It is customary to declare them with code similar to the 
97               following:
98 <programlisting>
99 /*
100  * Copyright/Licensing information.
101  */
102
103 #ifndef MAMAN_BAR_H
104 #define MAMAN_BAR_H
105
106 /*
107  * Potentially, include other headers on which this header depends.
108  */
109
110
111 /*
112  * Type macros.
113  */
114
115 typedef struct _MamanBar MamanBar;
116 typedef struct _MamanBarClass MamanBarClass;
117
118 struct _MamanBar {
119   GObject parent;
120   /* instance members */
121 };
122
123 struct _MamanBarClass {
124   GObjectClass parent;
125   /* class members */
126 };
127
128 /* used by MAMAN_BAR_TYPE */
129 GType maman_bar_get_type (void);
130
131 /*
132  * Method definitions.
133  */
134
135 #endif
136 </programlisting>
137             </para></listitem>
138           <listitem><para>
139               Most GTK+ types declare their private fields in the public header with a /* private */ comment, 
140               relying on their user's intelligence not to try to play with these fields. Fields not marked private
141               are considered public by default. The /* protected */ comment (same semantics as those of C++)
142               is also used, mainly in the GType library, in code written by Tim Janik.
143 <programlisting>
144 struct _MamanBar {
145   GObject parent;
146
147   /* private */
148   int hsize;
149 };
150 </programlisting>
151             </para></listitem>
152           <listitem><para>
153               All of Nautilus code and a lot of Gnome libraries use private indirection members, as described
154               by Herb Sutter in his Pimpl articles
155               (see <ulink url="http://www.gotw.ca/gotw/024.htm">Compilation Firewalls</ulink>
156               and <ulink url="http://www.gotw.ca/gotw/028.htm">The Fast Pimpl Idiom</ulink>
157               : he summarizes the different issues better than I will).
158 <programlisting>
159 typedef struct _MamanBarPrivate MamanBarPrivate;
160 struct _MamanBar {
161   GObject parent;
162         
163   /* private */
164   MamanBarPrivate *priv;
165 };
166 </programlisting>
167               <note>Do not call this <code>private</code>, as that is a registered c++ keyword.</note>
168               The private structure is then defined in the .c file, instantiated in the object's
169               <function>init</function> function and destroyed in the object's <function>finalize</function> function.
170 <programlisting>
171 static void maman_bar_finalize(GObject *object) {
172   MamanBar *self = MAMAN_BAR (object);
173   ...
174   g_free (self->priv);
175 }
176
177 static void maman_bar_init(GTypeInstance *instance, gpointer g_class) {
178   MamanBar *self = MAMAN_BAR (instance);
179   self->priv = g_new0(MamanBarPrivate,1);
180   ...
181 }
182 </programlisting>
183             </para></listitem>
184
185             <listitem><para>
186               A similar alternative, available since Glib version 2.4, is to define a private structure in the .c file,
187               declare it as a private structure in <function>class_init</function> using 
188               <function><link linkend="g-type-class-add-private">g_type_class_add_private</link></function> and declare a macro to allow convenient access to this structure.
189               A private structure will then be attached to each newly created object by the GObject system.
190               You dont need to free or allocate the private structure, only the objects or pointers that it may contain.
191 <programlisting>
192 typedef struct _MamanBarPrivate MamanBarPrivate;
193
194 struct _MamanBarPrivate {
195   int private_field;
196 };
197
198 #define MAMAN_BAR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MAMAN_BAR_TYPE, MamanBarPrivate))
199
200 static void
201 maman_bar_class_init (MamanBarClass *klass)
202 {
203   ...
204   g_type_class_add_private (klass, sizeof (MamanBarPrivate));
205   ...
206 }
207
208 static int
209 maman_bar_get_private_field (MamanBar *self)
210 {
211   MamanBarPrivate *priv = MAMAN_BAR_GET_PRIVATE (self);
212
213   return priv->private_field;
214 }
215 </programlisting>
216             </para></listitem>
217
218         </itemizedlist>
219       </para>
220
221       <para>
222         Finally, there are different header include conventions. Again, pick one and stick to it. I personally
223         use indifferently any of the two, depending on the codebase I work on: the rule is consistency.
224         <itemizedlist>
225           <listitem><para>
226               Some people add at the top of their headers a number of #include directives to pull in
227               all the headers needed to compile client code. This allows client code to simply  
228               #include "maman-bar.h".
229             </para></listitem>
230           <listitem><para>
231               Other do not #include anything and expect the client to #include themselves the headers 
232               they need before including your header. This speeds up compilation because it minimizes the
233               amount of pre-processor work. This can be used in conjunction with the re-declaration of certain 
234               unused types in the client code to minimize compile-time dependencies and thus speed up 
235               compilation.
236             </para></listitem>
237         </itemizedlist>
238       </para>
239         
240     </sect1>
241
242     <sect1 id="howto-gobject-code">
243       <title>Boilerplate code</title>
244
245       <para>
246         In your code, the first step is to #include the needed headers: depending on your header include strategy, this
247         can be as simple as #include "maman-bar.h" or as complicated as tens of #include lines ending with 
248         #include "maman-bar.h":
249 <programlisting>
250 /*
251  * Copyright information
252  */
253
254 #include "maman-bar.h"
255
256 /* If you use Pimpls, include the private structure 
257  * definition here. Some people create a maman-bar-private.h header
258  * which is included by the maman-bar.c file and which contains the
259  * definition for this private structure.
260  */
261 struct _MamanBarPrivate {
262   int member_1;
263   /* stuff */
264 };
265
266 /* 
267  * forward definitions
268  */
269 </programlisting>
270       </para>
271
272       <para>
273         Implement <function>maman_bar_get_type</function> and make sure the code compiles:
274 <programlisting>
275 GType
276 maman_bar_get_type (void)
277 {
278   static GType type = 0;
279   if (type == 0) {
280     static const GTypeInfo info = {
281       sizeof (MamanBarClass),
282       NULL,   /* base_init */
283       NULL,   /* base_finalize */
284       NULL,   /* class_init */
285       NULL,   /* class_finalize */
286       NULL,   /* class_data */
287       sizeof (MamanBar),
288       0,      /* n_preallocs */
289       NULL    /* instance_init */
290       };
291       type = g_type_register_static (G_TYPE_OBJECT,
292                                      "MamanBarType",
293                                      &amp;info, 0);
294     }
295     return type;
296 }
297 </programlisting>
298       </para>
299     </sect1>
300
301     <sect1 id="howto-gobject-construction">
302       <title>Object Construction</title>
303
304       <para>
305         People often get confused when trying to construct their GObjects because of the
306         sheer number of different ways to hook into the objects's construction process: it is
307         difficult to figure which is the <emphasis>correct</emphasis>, recommended way.
308       </para>
309
310       <para>
311         <xref linkend="gobject-construction-table"/> shows what user-provided functions
312         are invoked during object instanciation and in which order they are invoked.
313         A user looking for the equivalent of the simple C++ constructor function should use
314         the instance_init method. It will be invoked after all the parent's instance_init
315         functions have been invoked. It cannot take arbitrary construction parameters 
316         (as in C++) but if your object needs arbitrary parameters to complete initialization,
317         you can use construction properties.
318       </para>
319
320       <para>
321         Construction properties will be set only after all instance_init functions have run.
322         No object reference will be returned to the client of <function><link linkend="g-object-new>">g_object_new></link></function>
323         until all the construction properties have been set.
324       </para>
325
326       <para>
327         As such, I would recommend writing the following code first:
328 <programlisting>
329 static void
330 maman_bar_init (GTypeInstance   *instance,
331                 gpointer         g_class)
332 {
333   MamanBar *self = (MamanBar *)instance;
334   self->private = g_new0 (MamanBarPrivate, 1);
335
336   /* initialize all public and private members to reasonable default values. */
337   /* If you need specific consruction properties to complete initialization,
338    * delay initialization completion until the property is set. 
339    */
340 }
341 </programlisting>
342         And make sure that you set <function>maman_bar_init</function> as the type's instance_init function
343         in <function>maman_bar_get_type</function>. Make sure the code builds and runs: create an instance 
344         of the object and make sure <function>maman_bar_init</function> is called (add a 
345         <function><link linkend="g-print">g_print</link></function> call in it).
346       </para>
347
348       <para>
349         Now, if you need special construction properties, install the properties in the class_init function,
350         override the set and get methods and implement the get and set methods as described in 
351         <xref linkend="gobject-properties"/>. Make sure that these properties use a construct only 
352         <type><link linkend="GParamSpec">GParamSpec</link></type> by setting the param spec's flag field to G_PARAM_CONSTRUCT_ONLY: this helps
353         GType ensure that these properties are not set again later by malicious user code.
354 <programlisting>
355 static void
356 bar_class_init (MamanBarClass *klass)
357 {
358   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
359   GParamSpec *maman_param_spec;
360
361   gobject_class->set_property = bar_set_property;
362   gobject_class->get_property = bar_get_property;
363
364   maman_param_spec = g_param_spec_string ("maman",
365                                           "Maman construct prop",
366                                           "Set maman's name",
367                                           "no-name-set" /* default value */,
368                                           G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE);
369
370   g_object_class_install_property (gobject_class,
371                                    PROP_MAMAN,
372                                    maman_param_spec);
373 }
374 </programlisting>
375         If you need this, make sure you can build and run code similar to the code shown above. Make sure
376         your construct properties can set correctly during construction, make sure you cannot set them 
377         afterwards and make sure that if your users do not call <function><link linkend="g-object-new">g_object_new</link></function>
378         with the required construction properties, these will be initialized with the default values.
379       </para>
380
381       <para>
382         I consider good taste to halt program execution if a construction property is set its
383         default value. This allows you to catch client code which does not give a reasonable
384         value to the construction properties. Of course, you are free to disagree but you
385         should have a good reason to do so.
386       </para>
387
388         <para>Some people sometimes need to construct their object but only after the construction properties
389         have been set. This is possible through the use of the constructor class method as described in
390         <xref linkend="gobject-instanciation"/>. However, I have yet to see <emphasis>any</emphasis> reasonable
391         use of this feature. As such, to initialize your object instances, use by default the base_init function
392         and construction properties.
393         </para>
394     </sect1>
395
396     <sect1 id="howto-gobject-destruction">
397       <title>Object Destruction</title>
398
399       <para>
400         Again, it is often difficult to figure out which mechanism to use to hook into the object's
401         destruction process: when the last <function><link linkend="g-object-unref">g_object_unref</link></function> function call is made,
402         a lot of things happen as described in <xref linkend="gobject-destruction-table"/>.
403       </para>
404
405       <para>
406         The destruction process of your object must be split is two different phases: you must override
407         both the dispose and the finalize class methods.
408 <programlisting>
409 struct _MamanBarPrivate {
410   gboolean dispose_has_run;
411 };
412
413 static GObjectClass parent_class = NULL;
414
415 static void
416 bar_dispose (GObject *obj)
417 {
418   MamanBar *self = (MamanBar *)obj;
419
420   if (self->private->dispose_has_run) {
421    /* If dispose did already run, return. */
422     return;
423   }
424   /* Make sure dispose does not run twice. */
425   object->private->dispose_has_run = TRUE;
426
427   /* 
428    * In dispose, you are supposed to free all types referenced from this
429    * object which might themselves hold a reference to self. Generally,
430    * the most simple solution is to unref all members on which you own a 
431    * reference.
432    */
433
434    /* Chain up to the parent class */
435    G_OBJECT_CLASS (parent_class)->dispose (obj);
436 }
437
438 static void
439 bar_finalize (GObject *obj)
440 {
441   MamanBar *self = (MamanBar *)obj;
442
443   /*
444    * Here, complete object destruction.
445    * You might not need to do much...
446    */
447   g_free (self->private);
448
449    /* Chain up to the parent class */
450    G_OBJECT_CLASS (parent_class)->finalize (obj);
451 }
452
453 static void
454 bar_class_init (BarClass *klass)
455 {
456   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
457
458   gobject_class->dispose = bar_dispose;
459   gobject_class->finalize = bar_finalize;
460 }
461
462 static void
463 maman_bar_init (GTypeInstance   *instance,
464                 gpointer         g_class)
465 {
466   MamanBar *self = (MamanBar *)instance;
467   self->private = g_new0 (MamanBarPrivate, 1);
468   self->private->dispose_has_run = FALSE;
469
470   parent_class = g_type_class_peek_parent (klass);
471 }
472 </programlisting>
473       </para>
474
475       <para>
476         Add similar code to your GObject, make sure the code still builds and runs: dispose and finalize must be called
477         during the last unref.
478         It is possible that object methods might be invoked after dispose is run and before finalize runs. GObject
479         does not consider this to be a program error: you must gracefully detect this and neither crash nor warn
480         the user. To do this, you need something like the following code at the start of each object method, to make
481         sure the object's data is still valid before manipulating it:
482 <programlisting>
483 if (self->private->dispose_has_run) {
484   /* Dispose has run. Data is not valid anymore. */
485   return;
486 }
487 </programlisting>
488       </para>
489     </sect1>
490
491     <sect1 id="howto-gobject-methods">
492       <title>Object methods</title>
493
494       <para>
495         Just as with C++, there are many different ways to define object
496         methods and extend them: the following list and sections draw on C++ vocabulary.
497         (Readers are expected to know basic C++ buzzwords. Those who have not had to
498         write C++ code recently can refer to e.g. <ulink>http://www.cplusplus.com/doc/tutorial/</ulink> to refresh their 
499         memories.)
500         <itemizedlist>
501           <listitem><para>
502               non-virtual public methods,
503             </para></listitem>
504           <listitem><para>
505               virtual public methods and
506             </para></listitem>
507           <listitem><para>
508               virtual private methods
509             </para></listitem>
510         </itemizedlist>
511       </para>
512
513       <sect2>
514         <title>Non-virtual public methods</title>
515
516         <para>
517           These are the simplest: you want to provide a simple method which can act on your object. All you need
518           to do is to provide a function prototype in the header and an implementation of that prototype
519           in the source file.
520 <programlisting>
521 /* declaration in the header. */
522 void maman_bar_do_action (MamanBar *self, /* parameters */);
523 /* implementation in the source file */
524 void maman_bar_do_action (MamanBar *self, /* parameters */)
525 {
526   /* do stuff here. */
527 }
528 </programlisting>
529         </para>
530
531         <para>There is really nothing scary about this.</para>
532       </sect2>
533
534       <sect2>
535         <title>Virtual public methods</title>
536
537         <para>
538           This is the preferred way to create polymorphic GObjects. All you need to do is to
539           define the common method and its class function in the public header, implement the
540           common method in the source file and re-implement the class function in each object 
541           which inherits from you.
542 <programlisting>
543 /* declaration in maman-bar.h. */
544 struct _MamanBarClass {
545   GObjectClass parent;
546
547   /* stuff */
548   void (*do_action) (MamanBar *self, /* parameters */);
549 };
550 void maman_bar_do_action (MamanBar *self, /* parameters */);
551 /* implementation in maman-bar.c */
552 void maman_bar_do_action (MamanBar *self, /* parameters */)
553 {
554   MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */);
555 }
556 </programlisting>
557           The code above simply redirects the do_action call to the relevant class function. Some users,
558           concerned about performance, do not provide the <function>maman_bar_do_action</function>
559           wrapper function and require users to de-reference the class pointer themselves. This is not such
560           a great idea in terms of encapsulation and makes it difficult to change the object's implementation
561           afterwards, should this be needed.
562         </para>
563
564         <para>
565           Other users, also concerned by performance issues, declare the <function>maman_bar_do_action</function>
566           function inline in the header file. This, however, makes it difficult to change the
567           object's implementation later (although easier than requiring users to directly de-reference the class 
568           function) and is often difficult to write in a portable way (the <emphasis>inline</emphasis> keyword
569           is not part of the C standard).
570         </para>
571
572         <para>
573           In doubt, unless a user shows you hard numbers about the performance cost of the function call,
574           just <function>maman_bar_do_action</function> in the source file.
575         </para>
576
577         <para>
578           Please, note that it is possible for you to provide a default implementation for this class method in
579           the object's class_init function: initialize the klass->do_action field to a pointer to the actual
580           implementation. You can also make this class method pure virtual by initializing the klass->do_action
581           field to NULL:
582 <programlisting>
583 static void 
584 maman_bar_real_do_action_two (MamanBar *self, /* parameters */)
585 {
586   /* Default implementation for the virtual method. */
587 }
588
589 static void
590 maman_bar_class_init (BarClass *klass)
591 {
592   /* pure virtual method: mandates implementation in children. */
593   klass->do_action_one = NULL;
594   /* merely virtual method. */
595   klass->do_action_two = maman_bar_real_do_action_two;
596 }
597
598 void maman_bar_do_action_one (MamanBar *self, /* parameters */)
599 {
600   MAMAN_BAR_GET_CLASS (self)->do_action_one (self, /* parameters */);
601 }
602 void maman_bar_do_action_two (MamanBar *self, /* parameters */)
603 {
604   MAMAN_BAR_GET_CLASS (self)->do_action_two (self, /* parameters */);
605 }
606 </programlisting>
607         </para>
608       </sect2>
609
610       <sect2>
611         <title>Virtual private Methods</title>
612
613         <para>
614           These are very similar to Virtual Public methods. They just don't have a public function to call the
615           function directly. The header file contains only a declaration of the class function:
616 <programlisting>
617 /* declaration in maman-bar.h. */
618 struct _MamanBarClass {
619   GObjectClass parent;
620
621   /* stuff */
622   void (*helper_do_specific_action) (MamanBar *self, /* parameters */);
623 };
624 void maman_bar_do_any_action (MamanBar *self, /* parameters */);
625 </programlisting>
626           These class functions are often used to delegate part of the job to child classes:
627 <programlisting>
628 /* this accessor function is static: it is not exported outside of this file. */
629 static void 
630 maman_bar_do_specific_action (MamanBar *self, /* parameters */)
631 {
632   MAMAN_BAR_GET_CLASS (self)->do_specific_action (self, /* parameters */);
633 }
634
635 void maman_bar_do_any_action (MamanBar *self, /* parameters */)
636 {
637   /* random code here */
638
639   /* 
640    * Try to execute the requested action. Maybe the requested action cannot be implemented
641    * here. So, we delegate its implementation to the child class:
642    */
643   maman_bar_do_specific_action (self, /* parameters */);
644
645   /* other random code here */
646 }
647 </programlisting>
648         </para>
649
650         <para>
651           Again, it is possible to provide a default implementation for this private virtual class function:
652 <programlisting>
653 static void
654 maman_bar_class_init (MamanBarClass *klass)
655 {
656   /* pure virtual method: mandates implementation in children. */
657   klass->do_specific_action_one = NULL;
658   /* merely virtual method. */
659   klass->do_specific_action_two = maman_bar_real_do_specific_action_two;
660 }
661 </programlisting>
662         </para>
663
664         <para>
665           Children can then implement the subclass with code such as:
666 <programlisting>
667 static void
668 maman_bar_subtype_class_init (MamanBarSubTypeClass *klass)
669 {
670   MamanBarClass *bar_class = MAMAN_BAR_CLASS (klass);
671   /* implement pure virtual class function. */
672   bar_class->do_specific_action_one = maman_bar_subtype_do_specific_action_one;
673 }
674 </programlisting>
675         </para>
676       </sect2>
677     </sect1>
678
679     <sect1 id="howto-gobject-chainup">
680      <title>Chaining up</title>
681
682      <para>Chaining up is often loosely defined by the following set of conditions:
683        <itemizedlist>
684          <listitem><para>Parent class A defines a public virtual method named <function>foo</function> and 
685          provides a default implementation.</para></listitem>
686          <listitem><para>Child class B re-implements method <function>foo</function>.</para></listitem>
687          <listitem><para>In the method B::foo, the child class B calls its parent class method A::foo.</para></listitem>
688        </itemizedlist>
689        There are many uses to this idiom:
690        <itemizedlist>
691          <listitem><para>You need to change the behaviour of a class without modifying its code. You create
692            a subclass to inherit its implementation, re-implement a public virtual method to modify the behaviour
693            slightly and chain up to ensure that the previous behaviour is not really modifed, just extended.
694            </para></listitem>
695          <listitem><para>You are lazy, you have access to the source code of the parent class but you don't want 
696            to modify it to add method calls to new specialized method calls: it is faster to hack the child class
697            to chain up than to modify the parent to call down.</para></listitem>
698          <listitem><para>You need to implement the Chain Of Responsability pattern: each object of the inheritance
699            tree chains up to its parent (typically, at the begining or the end of the method) to ensure that
700            they each handler is run in turn.</para></listitem>
701        </itemizedlist>
702        I am personally not really convinced any of the last two uses are really a good idea but since this
703        programming idiom is often used, this section attemps to explain how to implement it.
704      </para>
705
706      <para>To explicitely chain up to the implementation of the virtual method in the parent class, 
707        you first need a handle to the original parent class structure. This pointer can then be used to 
708        access the original class function pointer and invoke it directly.
709         <footnote>
710           <para>The <emphasis>original</emphasis> adjective used in this sentence is not innocuous. To fully 
711            understand its meaning, you need to recall how class structures are initialized: for each object type,
712            the class structure associated to this object is created by first copying the class structure of its 
713            parent type (a simple <function>memcpy</function>) and then by invoking the class_init callback on 
714            the resulting class structure. Since the class_init callback is responsible for overwriting the class structure
715            with the user re-implementations of the class methods, we cannot merely use the modified copy of the parent class
716            structure stored in our derived instance. We want to get a copy of the class structure of an instance of the parent 
717            class.
718           </para>
719         </footnote>
720      </para>
721
722      <para>The function <function><link linkend="g-type-class-peek-parent">g_type_class_peek_parent</link></function> is used to access the original parent 
723       class structure. Its input is a pointer to the class of the derived object and it returns a pointer
724       to the original parent class structure. The code below shows how you could use it:
725 <programlisting>
726 static void
727 b_method_to_call (B *obj, int a)
728 {
729   BClass *klass;
730   AClass *parent_class;
731   klass = B_GET_CLASS (obj);
732   parent_class = g_type_class_peek_parent (klass);
733
734   /* do stuff before chain up */
735   parent_class->method_to_call (obj, a);
736   /* do stuff after chain up */
737 }
738 </programlisting>
739      A lot of people who use this idiom in GTK+ store the parent class structure pointer in a global static 
740      variable to avoid the costly call to <function><link linkend="g-type-class-peek-parent">g_type_class_peek_parent</link></function> for each function call.
741      Typically, the class_init callback initializes the global static variable. <filename>gtk/gtkhscale.c</filename>
742      does this.
743     </para>
744
745     </sect1>
746
747   </chapter>
748
749 <!--
750   End Howto GObject
751 -->
752
753
754 <!--
755   Howto Interfaces
756 -->
757
758   <chapter id="howto-interface">
759     <title>How To define and implement Interfaces ?</title>
760
761     <sect1 id="howto-interface-define">
762       <title>How To define Interfaces ?</title>
763     
764     <para>
765       The bulk of interface definition has already been shown in <xref linkend="gtype-non-instantiable-classed"/>
766       but I feel it is needed to show exactly how to create an interface. The sample source code
767       associated to this section can be found in the documentation's source tarball, in the 
768       <filename>sample/interface/maman-ibaz.{h|c}</filename> file.
769     </para>
770
771     <para>
772       As above, the first step is to get the header right:
773 <programlisting>
774 #ifndef MAMAN_IBAZ_H
775 #define MAMAN_IBAZ_H
776
777 #include &lt;glib-object.h&gt;
778
779 #define MAMAN_TYPE_IBAZ             (maman_ibaz_get_type ())
780 #define MAMAN_IBAZ(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_IBAZ, MamanIbaz))
781 #define MAMAN_IBAZ_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), MAMAN_TYPE_IBAZ, MamanIbazClass))
782 #define MAMAN_IS_IBAZ(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_IBAZ))
783 #define MAMAN_IS_IBAZ_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MAMAN_TYPE_IBAZ))
784 #define MAMAN_IBAZ_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), MAMAN_TYPE_IBAZ, MamanIbazClass))
785
786
787 typedef struct _MamanIbaz MamanIbaz; /* dummy object */
788 typedef struct _MamanIbazClass MamanIbazClass;
789
790 struct _MamanIbazClass {
791   GTypeInterface parent;
792
793   void (*do_action) (MamanIbaz *self);
794 };
795
796 GType maman_ibaz_get_type (void);
797
798 void maman_ibaz_do_action (MamanIbaz *self);
799
800 #endif /*MAMAN_IBAZ_H*/
801 </programlisting>
802       This code is almost exactly similar to the code for a normal <type><link linkend="GType">GType</link></type>
803       which derives from a <type><link linkend="GObject">GObject</link></type> except for a few details:
804       <itemizedlist>
805         <listitem><para>
806           The <function>_GET_CLASS</function> macro is not implemented with 
807           <function>G_TYPE_INSTANCE_GET_CLASS</function> but with <function>G_TYPE_INSTANCE_GET_INTERFACE</function>.
808         </para></listitem>
809         <listitem><para>
810           The instance type, <type>MamanIbaz</type> is not fully defined: it is used merely as an abstract 
811           type which represents an instance of whatever object which implements the interface.
812         </para></listitem>
813       </itemizedlist>
814     </para>
815
816     <para>
817       The implementation of the <type>MamanIbaz</type> type itself is trivial:
818       <itemizedlist>
819         <listitem><para><function>maman_ibaz_get_type</function> registers the
820          type in the type system.
821          </para></listitem>
822         <listitem><para><function>maman_ibaz_base_init</function> is expected 
823         to register the interface's signals if there are any (we will see a bit
824         (later how to use them). Make sure to use a static local boolean variable
825         to make sure not to run the initialization code twice (as described in
826         <xref linkend="gtype-non-instantiable-classed-init"/>, 
827         <function>base_init</function> is run once for each interface implementation 
828         instanciation)</para></listitem>
829         <listitem><para><function>maman_ibaz_do_action</function> de-references the class
830         structure to access its associated class function and calls it.
831         </para></listitem>
832       </itemizedlist>
833 <programlisting>
834 static void
835 maman_ibaz_base_init (gpointer g_class)
836 {
837   static gboolean initialized = FALSE;
838
839   if (!initialized) {
840     /* create interface signals here. */
841     initialized = TRUE;
842   }
843 }
844
845 GType
846 maman_ibaz_get_type (void)
847 {
848   static GType type = 0;
849   if (type == 0) {
850     static const GTypeInfo info = {
851       sizeof (MamanIbazClass),
852       maman_ibaz_base_init,   /* base_init */
853       NULL,   /* base_finalize */
854       NULL,   /* class_init */
855       NULL,   /* class_finalize */
856       NULL,   /* class_data */
857       0,
858       0,      /* n_preallocs */
859       NULL    /* instance_init */
860     };
861     type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbaz", &amp;info, 0);
862   }
863   return type;
864 }
865
866 void maman_ibaz_do_action (MamanIbaz *self)
867 {
868   MAMAN_IBAZ_GET_CLASS (self)->do_action (self);
869 }
870 </programlisting>
871     </para>
872   </sect1>
873
874   <sect1 id="howto-interface-implement">
875     <title>How To define and implement an implementation of an Interface ?</title>
876
877     <para>
878       Once the interface is defined, implementing it is rather trivial. Source code showing how to do this
879       for the <type>IBaz</type> interface defined in the previous section is located in 
880       <filename>sample/interface/maman-baz.{h|c}</filename>.
881     </para>
882
883     <para>
884       The first step is to define a normal GType. Here, we have decided to use a GType which derives from
885       GObject. Its name is <type>MamanBaz</type>:
886 <programlisting>
887 #ifndef MAMAN_BAZ_H
888 #define MAMAN_BAZ_H
889
890 #include &lt;glib-object.h>
891
892 #define MAMAN_TYPE_BAZ             (maman_baz_get_type ())
893 #define MAMAN_BAZ(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, Mamanbaz))
894 #define MAMAN_BAZ_CLASS(vtable)    (G_TYPE_CHECK_CLASS_CAST ((vtable), MAMAN_TYPE_BAZ, MamanbazClass))
895 #define MAMAN_IS_BAZ(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ))
896 #define MAMAN_IS_BAZ_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MAMAN_TYPE_BAZ))
897 #define MAMAN_BAZ_GET_CLASS(inst)  (G_TYPE_INSTANCE_GET_CLASS ((inst), MAMAN_TYPE_BAZ, MamanbazClass))
898
899
900 typedef struct _MamanBaz MamanBaz;
901 typedef struct _MamanBazClass MamanBazClass;
902
903 struct _MamanBaz {
904   GObject parent;
905   int instance_member;
906 };
907
908 struct _MamanBazClass {
909   GObjectClass parent;
910 };
911
912 GType maman_baz_get_type (void);
913
914
915 #endif //MAMAN_BAZ_H
916 </programlisting>
917       There is clearly nothing specifically weird or scary about this header: it does not define any weird API
918       or derives from a weird type.
919     </para>
920
921     <para>
922       The second step is to implement <function>maman_baz_get_type</function>:
923 <programlisting>
924 GType 
925 maman_baz_get_type (void)
926 {
927   static GType type = 0;
928   if (type == 0) {
929     static const GTypeInfo info = {
930       sizeof (MamanBazClass),
931       NULL,   /* base_init */
932       NULL,   /* base_finalize */
933       NULL,   /* class_init */
934       NULL,   /* class_finalize */
935       NULL,   /* class_data */
936       sizeof (MamanBaz),
937       0,      /* n_preallocs */
938       baz_instance_init    /* instance_init */
939     };
940     static const GInterfaceInfo ibaz_info = {
941       (GInterfaceInitFunc) baz_interface_init,    /* interface_init */
942       NULL,               /* interface_finalize */
943       NULL                /* interface_data */
944     };
945     type = g_type_register_static (G_TYPE_OBJECT,
946                                    "MamanBazType",
947                                    &amp;info, 0);
948     g_type_add_interface_static (type,
949                                  MAMAN_TYPE_IBAZ,
950                                  &amp;ibaz_info);
951   }
952   return type;
953 }
954 </programlisting>
955       This function is very much like all the similar functions we looked at previously. The only interface-specific
956       code present here is the call to <function><link linkend="g-type-add-interface-static">g_type_add_interface_static</link></function> which is used to inform
957       the type system that this just-registered <type><link linkend="GType">GType</link></type> also implements the interface 
958       <function>MAMAN_TYPE_IBAZ</function>.
959     </para>
960
961     <para>
962       <function>baz_interface_init</function>, the interface initialization function, is also pretty simple:
963 <programlisting>
964 static void baz_do_action (MamanBaz *self)
965 {
966   g_print ("Baz implementation of IBaz interface Action: 0x%x.\n", self->instance_member);
967 }
968 static void
969 baz_interface_init (gpointer   g_iface,
970                     gpointer   iface_data)
971 {
972   MamanIbazClass *klass = (MamanIbazClass *)g_iface;
973   klass->do_action = (void (*) (MamanIbaz *self))baz_do_action;
974 }
975 static void
976 baz_instance_init (GTypeInstance   *instance,
977                    gpointer         g_class)
978 {
979   MamanBaz *self = (MamanBaz *)instance;
980   self->instance_member = 0xdeadbeaf;
981 }
982 </programlisting>
983       <function>baz_interface_init</function> merely initializes the interface methods to the implementations
984       defined by <type>MamanBaz</type>: <function>maman_baz_do_action</function> does nothing very useful 
985       but it could :)
986     </para>
987
988 </sect1>
989
990 <sect1>
991   <title>Interface definition prerequisites</title>
992
993   <para>To specify that an interface requires the presence of other interfaces when implemented, 
994   GObject introduces the concept of <emphasis>prerequisites</emphasis>: it is possible to associate
995   a list of prerequisite interfaces to an interface. For example, if object A wishes to implement interface
996   I1, and if interface I1 has a prerequisite on interface I2, A has to implement both I1 and I2.
997   </para>
998
999   <para>The mechanism described above is, in practice, very similar to Java's interface I1 extends 
1000   interface I2. The example below shows the GObject equivalent:
1001
1002 <programlisting>
1003   type = g_type_register_static (G_TYPE_INTERFACE, "MamanIbar", &amp;info, 0);
1004   /* Make the MamanIbar interface require MamanIbaz interface. */
1005   g_type_interface_add_prerequisite (type, MAMAN_TYPE_IBAZ);
1006 </programlisting>
1007   The code shown above adds the MamanIbaz interface to the list of prerequisites of MamanIbar while the 
1008   code below shows how an implementation can implement both interfaces and register their implementations:
1009 <programlisting>
1010 static void ibar_do_another_action (MamanBar *self)
1011 {
1012   g_print ("Bar implementation of IBar interface Another Action: 0x%x.\n", self->instance_member);
1013 }
1014
1015 static void
1016 ibar_interface_init (gpointer   g_iface,
1017                      gpointer   iface_data)
1018 {
1019   MamanIbarClass *klass = (MamanIbarClass *)g_iface;
1020   klass->do_another_action = (void (*) (MamanIbar *self))ibar_do_another_action;
1021 }
1022
1023
1024 static void ibaz_do_action (MamanBar *self)
1025 {
1026   g_print ("Bar implementation of IBaz interface Action: 0x%x.\n", self->instance_member);
1027 }
1028
1029 static void
1030 ibaz_interface_init (gpointer   g_iface,
1031                     gpointer   iface_data)
1032 {
1033   MamanIbazClass *klass = (MamanIbazClass *)g_iface;
1034   klass->do_action = (void (*) (MamanIbaz *self))ibaz_do_action;
1035 }
1036
1037
1038 static void
1039 bar_instance_init (GTypeInstance   *instance,
1040                    gpointer         g_class)
1041 {
1042   MamanBar *self = (MamanBar *)instance;
1043   self->instance_member = 0x666;
1044 }
1045
1046
1047 GType 
1048 maman_bar_get_type (void)
1049 {
1050   static GType type = 0;
1051   if (type == 0) {
1052     static const GTypeInfo info = {
1053       sizeof (MamanBarClass),
1054       NULL,   /* base_init */
1055       NULL,   /* base_finalize */
1056       NULL,   /* class_init */
1057       NULL,   /* class_finalize */
1058       NULL,   /* class_data */
1059       sizeof (MamanBar),
1060       0,      /* n_preallocs */
1061       bar_instance_init    /* instance_init */
1062     };
1063     static const GInterfaceInfo ibar_info = {
1064       (GInterfaceInitFunc) ibar_interface_init,   /* interface_init */
1065       NULL,                                       /* interface_finalize */
1066             NULL                                        /* interface_data */
1067     };
1068     static const GInterfaceInfo ibaz_info = {
1069       (GInterfaceInitFunc) ibaz_interface_init,   /* interface_init */
1070       NULL,                                       /* interface_finalize */
1071       NULL                                        /* interface_data */
1072     };
1073     type = g_type_register_static (G_TYPE_OBJECT,
1074                                    "MamanBarType",
1075                                    &amp;info, 0);
1076     g_type_add_interface_static (type,
1077                                  MAMAN_TYPE_IBAZ,
1078                                  &amp;ibaz_info);
1079     g_type_add_interface_static (type,
1080                                  MAMAN_TYPE_IBAR,
1081                                  &amp;ibar_info);
1082   }
1083   return type;
1084 }
1085 </programlisting>
1086   It is very important to notice that the order in which interface implementations are added to the main object
1087   is not random: <function><link linkend="g-type-add-interface-static">g_type_add_interface_static</link></function> must be invoked first on the interfaces which have
1088   no prerequisites and then on the others.
1089 </para>
1090
1091     <para>
1092       Complete source code showing how to define the MamanIbar interface which requires MamanIbaz and how to 
1093       implement the MamanIbar interface is located in <filename>sample/interface/maman-ibar.{h|c}</filename> 
1094       and <filename>sample/interface/maman-bar.{h|c}</filename>.
1095     </para>
1096
1097 </sect1>
1098
1099 <sect1 id="howto-interface-properties">
1100   <title>Interface Properties</title>
1101
1102   <para>Starting from version 2.4 of glib, gobject interfaces can also have properties. 
1103   Declaration of the interface properties is similar to declaring the properties of 
1104   ordinary gobject types as explained in <xref linkend="gobject-properties"/>, 
1105   except that <function><link linkend="g-object-interface-install-property">g_object_interface_install_property</link></function> is used to 
1106   declare the properties instead of <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>.
1107   </para>
1108
1109   <para>To include a property named 'name' of type <type>string</type> in the 
1110   <type>maman_ibaz</type> interface example code above, we only need to add one 
1111         <footnote>
1112           <para>That really is one line extended to six for the sake of clarity
1113           </para>
1114         </footnote>  
1115   line in the <function>maman_ibaz_base_init</function>
1116         <footnote>
1117           <para>The gobject_install_property can also be called from <function>class_init</function> but it must not be called after that point.
1118           </para>
1119         </footnote>
1120   as shown below:
1121 <programlisting>
1122 static void
1123 maman_ibaz_base_init (gpointer g_class)
1124 {
1125   static gboolean initialized = FALSE;
1126
1127   if (!initialized) {
1128     /* create interface signals here. */
1129
1130     g_object_interface_install_property (g_class,
1131                         g_param_spec_string ("name",
1132                                 "maman_ibaz_name",
1133                                 "Name of the MamanIbaz",
1134                                 "maman",
1135                                 G_PARAM_READWRITE));
1136     initialized = TRUE;
1137   }
1138 }
1139 </programlisting>
1140   </para>
1141
1142   <para>One point worth noting is that the declared property wasn't assigned an 
1143   integer ID. The reason being that integer IDs of properities are utilized only 
1144   inside the get and set methods and since interfaces do not implement properties,
1145   there is no need to assign integer IDs to interface properties.
1146   </para>
1147   
1148   <para>The story for the implementers of the interface is also quite trivial. 
1149   An implementer shall declare and define it's properties in the usual way as 
1150   explained in <xref linkend="gobject-properties"/>, except for one small
1151   change: it shall declare the properties of the interface it implements using 
1152   <function><link linkend="g-object-class-override-property">g_object_class_override_property</link></function> instead of 
1153   <function><link linkend="g-object-class-install-property">g_object_class_install_property</link></function>. The following code snipet 
1154   shows the modifications needed in the <type>MamanBaz</type> declaration and 
1155   implementation above:
1156 <programlisting>
1157
1158 struct _MamanBaz {
1159   GObject parent;
1160   gint instance_member;
1161   gchar *name;          /* placeholder for property */
1162 };
1163
1164 enum
1165 {
1166   ARG_0,
1167   ARG_NAME
1168 };
1169
1170 GType 
1171 maman_baz_get_type (void)
1172 {
1173   static GType type = 0;
1174   if (type == 0) {
1175     static const GTypeInfo info = {
1176       sizeof (MamanBazClass),
1177       NULL,   /* base_init */
1178       NULL,   /* base_finalize */
1179       baz_class_init, /* class_init */
1180       NULL,   /* class_finalize */
1181       NULL,   /* class_data */
1182       sizeof (MamanBaz),
1183       0,      /* n_preallocs */
1184       baz_instance_init    /* instance_init */
1185     };
1186     static const GInterfaceInfo ibaz_info = {
1187       (GInterfaceInitFunc) baz_interface_init,    /* interface_init */
1188       NULL,               /* interface_finalize */
1189       NULL                /* interface_data */
1190     };
1191     type = g_type_register_static (G_TYPE_OBJECT,
1192                                    "MamanBazType",
1193                                    &amp;info, 0);
1194     g_type_add_interface_static (type,
1195                                  MAMAN_TYPE_IBAZ,
1196                                  &amp;ibaz_info);
1197   }
1198   return type;
1199 }
1200
1201 static void
1202 maman_baz_class_init (MamanBazClass * klass)
1203 {
1204   GObjectClass *gobject_class;
1205
1206   gobject_class = (GObjectClass *) klass;
1207
1208   parent_class = g_type_class_ref (G_TYPE_OBJECT);
1209
1210   gobject_class->set_property = maman_baz_set_property;
1211   gobject_class->get_property = maman_baz_get_property;
1212
1213   g_object_class_override_property (gobject_class, ARG_NAME, "name");
1214 }
1215
1216 static void
1217 maman_baz_set_property (GObject * object, guint prop_id,
1218                         const GValue * value, GParamSpec * pspec)
1219 {
1220   MamanBaz *baz;
1221   GObject *obj;
1222
1223   /* it's not null if we got it, but it might not be ours */
1224   g_return_if_fail (G_IS_MAMAN_BAZ (object));
1225
1226   baz = MAMAN_BAZ (object);
1227
1228   switch (prop_id) {
1229     case ARG_NAME:
1230       baz->name = g_value_get_string (value);
1231       break;
1232     default:
1233       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1234       break;
1235   }
1236 }
1237
1238 static void
1239 maman_baz_get_property (GObject * object, guint prop_id,
1240                         GValue * value, GParamSpec * pspec)
1241 {
1242   MamanBaz *baz;
1243
1244   /* it's not null if we got it, but it might not be ours */
1245   g_return_if_fail (G_IS_TEXT_PLUGIN (object));
1246
1247   baz = MAMAN_BAZ (object);
1248
1249   switch (prop_id) {
1250     case ARG_NAME:
1251       g_value_set_string (value, baz->name);
1252       break;
1253     default:
1254       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1255       break;
1256   }
1257 }
1258
1259 </programlisting>
1260   </para>
1261
1262 </sect1>
1263
1264
1265 </chapter>
1266
1267 <!--
1268   End Howto Interfaces
1269 -->
1270
1271
1272 <!--
1273   start Howto Signals
1274 -->
1275
1276
1277     <chapter id="howto-signals">
1278       <title>Howto create and use signals</title>
1279
1280
1281       <para>
1282         The signal system which was built in GType is pretty complex and flexible: it is possible for its users
1283         to connect at runtime any number of callbacks (implemented in any language for which a binding exists)
1284         <footnote>
1285           <para>A python callback can be connected to any signal on any C-based GObject.
1286           </para>
1287         </footnote>
1288
1289         to any signal and to stop the emission of any signal at any 
1290         state of the signal emission process. This flexibility makes it possible to use GSignal for much more than 
1291         just emit events which can be received by numerous clients. 
1292       </para>
1293
1294 <sect1 id="howto-simple-signals">
1295 <title>Simple use of signals</title>
1296
1297 <para>The most basic use of signals is to implement simple event notification: for example, if we have a 
1298 MamanFile object, and if this object has a write method, we might wish to be notified whenever someone 
1299 uses this method. The code below shows how the user can connect a callback to the write signal. Full code
1300 for this simple example is located in <filename>sample/signal/maman-file.{h|c}</filename> and
1301 in <filename>sample/signal/test.c</filename>
1302 <programlisting>
1303 file = g_object_new (MAMAN_FILE_TYPE, NULL);
1304
1305 g_signal_connect (G_OBJECT (file), "write",
1306                   (GCallback)write_event,
1307                   NULL);
1308
1309 maman_file_write (file, buffer, 50);
1310 </programlisting>
1311 </para>
1312
1313 <para>
1314 The <type>MamanFile</type> signal is registered in the class_init function:
1315 <programlisting>
1316 klass->write_signal_id = 
1317   g_signal_newv ("write",
1318                  G_TYPE_FROM_CLASS (g_class),
1319                  G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
1320                  NULL /* class closure */,
1321                  NULL /* accumulator */,
1322                  NULL /* accu_data */,
1323                  g_cclosure_marshal_VOID__VOID,
1324                  G_TYPE_NONE /* return_type */,
1325                  0     /* n_params */,
1326                  NULL  /* param_types */);
1327 </programlisting>
1328 and the signal is emited in <function>maman_file_write</function>:
1329 <programlisting>
1330 void maman_file_write (MamanFile *self, guint8 *buffer, guint32 size)
1331 {
1332   /* First write data. */
1333   /* Then, notify user of data written. */
1334   g_signal_emit (self, MAMAN_FILE_GET_CLASS (self)->write_signal_id,
1335                  0 /* details */, 
1336                  NULL);
1337 }
1338 </programlisting>
1339 As shown above, you can safely set the details parameter to zero if you do not know what it can be used for.
1340 For a discussion of what you could used it for, see <xref linkend="signal-detail"/>
1341 </para>
1342
1343  <para>
1344 The signature of the signal handler in the above example is defined as
1345 <function>g_cclosure_marshal_VOID__VOID</function>. Its name follows
1346 a simple convention which encodes the function parameter and return value
1347 types in the function name. Specifically, the value infront of the double 
1348 underscore is the type of the return value, while the value(s) after the 
1349 double underscore denote the parameter types.
1350 The header <filename>gobject/gmarshal.h</filename> defines a set of commonly
1351 needed closures that one can use.
1352  </para>
1353
1354 </sect1>
1355
1356
1357 <sect1>
1358 <title>How to provide more flexibility to users ?</title>
1359
1360 <para>The previous implementation does the job but the signal facility of GObject can be used to provide
1361 even more flexibility to this file change notification mechanism. One of the key ideas is to make the process
1362 of writing data to the file part of the signal emission process to allow users to be notified either
1363 before or after the data is written to the file.
1364 </para>
1365
1366 <para>To integrate the process of writing the data to the file into the signal emission mechanism, we can
1367 register a default class closure for this signal which will be invoked during the signal emission, just like 
1368 any other user-connected signal handler. 
1369 </para>
1370
1371 <para>The first step to implement this idea is to change the signature of the signal: we need to pass
1372 around the buffer to write and its size. To do this, we use our own marshaller which will be generated
1373 through glib's genmarshall tool. We thus create a file named <filename>marshall.list</filename> which contains
1374 the following single line:
1375 <programlisting>
1376 VOID:POINTER,UINT
1377 </programlisting>
1378 and use the Makefile provided in <filename>sample/signal/Makefile</filename> to generate the file named
1379 <filename>maman-file-complex-marshall.c</filename>. This C file is finally included in 
1380 <filename>maman-file-complex.c</filename>.
1381 </para>
1382
1383 <para>Once the marshaller is present, we register the signal and its marshaller in the class_init function 
1384 of the object <type>MamanFileComplex</type> (full source for this object is included in 
1385 <filename>sample/signal/maman-file-complex.{h|c}</filename>):
1386 <programlisting>
1387 GClosure *default_closure;
1388 GType param_types[2];
1389
1390 default_closure = g_cclosure_new (G_CALLBACK (default_write_signal_handler),
1391                                   (gpointer)0xdeadbeaf /* user_data */, 
1392                                   NULL /* destroy_data */);
1393
1394 param_types[0] = G_TYPE_POINTER;
1395 param_types[1] = G_TYPE_UINT;
1396 klass->write_signal_id = 
1397   g_signal_newv ("write",
1398                  G_TYPE_FROM_CLASS (g_class),
1399                  G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
1400                  default_closure /* class closure */,
1401                  NULL /* accumulator */,
1402                  NULL /* accu_data */,
1403                  maman_file_complex_VOID__POINTER_UINT,
1404                  G_TYPE_NONE /* return_type */,
1405                  2     /* n_params */,
1406                  param_types /* param_types */);
1407 </programlisting>
1408 The code shown above first creates the closure which contains the code to complete the file write. This
1409 closure is registered as the default class_closure of the newly created signal.
1410 </para>
1411
1412 <para>
1413 Of course, you need to implement completely the code for the default closure since I just provided
1414 a skeleton:
1415 <programlisting>
1416 static void
1417 default_write_signal_handler (GObject *obj, guint8 *buffer, guint size, gpointer user_data)
1418 {
1419   g_assert (user_data == (gpointer)0xdeadbeaf);
1420   /* Here, we trigger the real file write. */
1421   g_print ("default signal handler: 0x%x %u\n", buffer, size);
1422 }
1423 </programlisting>
1424 </para>
1425
1426 <para>Finally, the client code must invoke the <function>maman_file_complex_write</function> function which 
1427 triggers the signal emission:
1428 <programlisting>
1429 void maman_file_complex_write (MamanFileComplex *self, guint8 *buffer, guint size)
1430 {
1431   /* trigger event */
1432   g_signal_emit (self,
1433                  MAMAN_FILE_COMPLEX_GET_CLASS (self)->write_signal_id,
1434                  0, /* details */
1435                  buffer, size);
1436 }
1437 </programlisting>
1438 </para>
1439
1440 <para>The client code (as shown in <filename>sample/signal/test.c</filename> and below) can now connect signal handlers before 
1441 and after the file write is completed: since the default signal handler which does the write itself runs during the 
1442 RUN_LAST phase of the signal emission, it will run after all handlers connected with <function><link linkend="g-signal-connect">g_signal_connect</link></function>
1443 and before all handlers connected with <function><link linkend="g-signal-connect-after">g_signal_connect_after</link></function>. If you intent to write a GObject
1444 which emits signals, I would thus urge you to create all your signals with the G_SIGNAL_RUN_LAST such that your users
1445 have a maximum of flexibility as to when to get the event. Here, we combined it with G_SIGNAL_NO_RECURSE and 
1446 G_SIGNAL_NO_HOOKS to ensure our users will not try to do really weird things with our GObject. I strongly advise you
1447 to do the same unless you really know why (in which case you really know the inner workings of GSignal by heart and
1448 you are not reading this).
1449 </para>
1450
1451 <para>
1452 <programlisting>
1453 static void complex_write_event_before (GObject *file, guint8 *buffer, guint size, gpointer user_data)
1454 {
1455   g_assert (user_data == NULL);
1456   g_print ("Complex Write event before: 0x%x, %u\n", buffer, size);
1457 }
1458
1459 static void complex_write_event_after (GObject *file, guint8 *buffer, guint size, gpointer user_data)
1460 {
1461   g_assert (user_data == NULL);
1462   g_print ("Complex Write event after: 0x%x, %u\n", buffer, size);
1463 }
1464
1465 static void test_file_complex (void)
1466 {
1467   guint8 buffer[100];
1468   GObject *file;
1469
1470   file = g_object_new (MAMAN_FILE_COMPLEX_TYPE, NULL);
1471
1472   g_signal_connect (G_OBJECT (file), "write",
1473                     (GCallback)complex_write_event_before,
1474                     NULL);
1475
1476   g_signal_connect_after (G_OBJECT (file), "write",
1477                           (GCallback)complex_write_event_after,
1478                           NULL);
1479
1480   maman_file_complex_write (MAMAN_FILE_COMPLEX (file), buffer, 50);
1481
1482   g_object_unref (G_OBJECT (file));
1483 }
1484 </programlisting>
1485 The code above generates the following output on my machine:
1486 <programlisting>
1487 Complex Write event before: 0xbfffe280, 50
1488 default signal handler: 0xbfffe280 50
1489 Complex Write event after: 0xbfffe280, 50
1490 </programlisting>
1491 </para>
1492
1493
1494    <sect2>
1495      <title>How most people do the same thing with less code</title>
1496
1497        <para>For many historic reasons related to how the ancestor of GObject used to work in GTK+ 1.x versions,
1498          there is a much <emphasis>simpler</emphasis> 
1499          <footnote>
1500            <para>I personally think that this method is horribly mind-twisting: it adds a new indirection
1501            which unecessarily complicates the overall code path. However, because this method is widely used
1502            by all of GTK+ and GObject code, readers need to understand it. The reason why this is done that way
1503            in most of GTK+ is related to the fact that the ancestor of GObject did not provide any other way to
1504            create a signal with a default handler than this one. Some people have tried to justify that it is done
1505            that way because it is better, faster (I am extremly doubtfull about the faster bit. As a matter of fact,
1506            the better bit also mystifies me ;-). I have the feeling no one really knows and everyone does it
1507            because they copy/pasted code from code which did the same. It is probably better to leave this 
1508            specific trivia to hacker legends domain...
1509            </para>
1510          </footnote>
1511          way to create a signal with a default handler than to create 
1512          a closure by hand and to use the <function><link linkend="g-signal-newv">g_signal_newv</link></function>.
1513        </para>
1514
1515        <para>For example, <function><link linkend="g-signal-new">g_signal_new</link></function> can be used to create a signal which uses a default 
1516          handler which is stored in the class structure of the object. More specifically, the class structure 
1517          contains a function pointer which is accessed during signal emission to invoke the default handler and
1518          the user is expected to provide to <function><link linkend="g-signal-new">g_signal_new</link></function> the offset from the start of the
1519          class structure to the function pointer.
1520            <footnote>
1521              <para>I would like to point out here that the reason why the default handler of a signal is named everywhere
1522               a class_closure is probably related to the fact that it used to be really a function pointer stored in
1523               the class structure.
1524              </para>
1525            </footnote>
1526        </para>
1527
1528        <para>The following code shows the declaration of the <type>MamanFileSimple</type> class structure which contains
1529          the <function>write</function> function pointer.
1530 <programlisting>
1531 struct _MamanFileSimpleClass {
1532   GObjectClass parent;
1533         
1534   guint write_signal_id;
1535
1536   /* signal default handlers */
1537   void (*write) (MamanFileSimple *self, guint8 *buffer, guint size);
1538 };
1539 </programlisting>
1540          The <function>write</function> function pointer is initialied in the class_init function of the object
1541          to <function>default_write_signal_handler</function>:
1542 <programlisting>
1543 static void
1544 maman_file_simple_class_init (gpointer g_class,
1545                                gpointer g_class_data)
1546 {
1547   GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
1548   MamanFileSimpleClass *klass = MAMAN_FILE_SIMPLE_CLASS (g_class);
1549
1550   klass->write = default_write_signal_handler;
1551 </programlisting>
1552         Finally, the signal is created with <function><link linkend="g-signal-new">g_signal_new</link></function> in the same class_init function:
1553 <programlisting>
1554 klass->write_signal_id = 
1555  g_signal_new ("write",
1556                G_TYPE_FROM_CLASS (g_class),
1557                G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
1558                G_STRUCT_OFFSET (MamanFileSimpleClass, write),
1559                NULL /* accumulator */,
1560                NULL /* accu_data */,
1561                maman_file_complex_VOID__POINTER_UINT,
1562                G_TYPE_NONE /* return_type */,
1563                2     /* n_params */,
1564                G_TYPE_POINTER,
1565                G_TYPE_UINT);
1566 </programlisting>
1567         Of note, here, is the 4th argument to the function: it is an integer calculated by the <function><link linkend="G-STRUCT-OFFSET">G_STRUCT_OFFSET</link></function>
1568         macro which indicates the offset of the member <emphasis>write</emphasis> from the start of the 
1569         <type>MamanFileSimpleClass</type> class structure.
1570           <footnote>
1571             <para>GSignal uses this offset to create a special wrapper closure 
1572              which first retrieves the target function pointer before calling it.
1573             </para>
1574           </footnote>
1575        </para>
1576
1577        <para>
1578          While the complete code for this type of default handler looks less clutered as shown in 
1579          <filename>sample/signal/maman-file-simple.{h|c}</filename>, it contains numerous subtleties.
1580          The main subtle point which everyone must be aware of is that the signature of the default 
1581          handler created that way does not have a user_data argument: 
1582          <function>default_write_signal_handler</function> is different in 
1583          <filename>sample/signal/maman-file-complex.c</filename> and in 
1584          <filename>sample/signal/maman-file-simple.c</filename>.
1585        </para>
1586
1587        <para>If you have doubts about which method to use, I would advise you to use the second one which
1588          involves <function><link linkend="g-signal-new">g_signal_new</link></function> rather than <function><link linkend="g-signal-newv">g_signal_newv</link></function>: 
1589          it is better to write code which looks like the vast majority of other GTK+/Gobject code than to
1590          do it your own way. However, now, you know why.
1591        </para>
1592
1593    </sect2>
1594
1595
1596 </sect1>
1597
1598
1599
1600 <sect1>
1601   <title>How users can abuse signals (and why some think it is good)</title>
1602
1603    <para>Now that you know how to create signals to which the users can connect easily and at any point in
1604      the signal emission process thanks to <function><link linkend="g-signal-connect">g_signal_connect</link></function>, 
1605      <function><link linkend="g-signal-connect-after">g_signal_connect_after</link></function> and G_SIGNAL_RUN_LAST, it is time to look into how your
1606      users can and will screw you. This is also interesting to know how you too, can screw other people.
1607      This will make you feel good and eleet.
1608    </para>
1609
1610    <para>The users can:
1611      <itemizedlist>
1612         <listitem><para>stop the emission of the signal at anytime</para></listitem>
1613         <listitem><para>override the default handler of the signal if it is stored as a function
1614           pointer in the class structure (which is the prefered way to create a default signal handler,
1615           as discussed in the previous section).</para></listitem>
1616       </itemizedlist> 
1617    </para>
1618
1619    <para>In both cases, the original programmer should be as careful as possible to write code which is
1620     resistant to the fact that the default handler of the signal might not able to run. This is obviously
1621     not the case in the example used in the previous sections since the write to the file depends on whether
1622     or not the default handler runs (however, this might be your goal: to allow the user to prevent the file 
1623     write if he wishes to).
1624    </para>
1625
1626    <para>If all you want to do is to stop the signal emission from one of the callbacks you connected yourself,
1627     you can call <function><link linkend="g-signal-stop-by-name">g_signal_stop_by_name</link></function>. Its use is very simple which is why I won't detail 
1628     it further.
1629    </para>
1630
1631    <para>If the signal's default handler is just a class function pointer, it is also possible to override 
1632     it yourself from the class_init function of a type which derives from the parent. That way, when the signal
1633     is emitted, the parent class will use the function provided by the child as a signal default handler.
1634     Of course, it is also possible (and recommended) to chain up from the child to the parent's default signal 
1635     handler to ensure the integrity of the parent object.
1636    </para>
1637
1638    <para>Overriding a class method and chaining up was demonstrated in <xref linkend="howto-gobject-methods"/> 
1639     which is why I won't bother to show exactly how to do it here again.</para>
1640
1641
1642 </sect1>
1643
1644 </chapter>
1645
1646 <!--
1647   <sect2>
1648           <title>Warning on signal creation and default closure</title>
1649
1650           <para>
1651             Most of the existing code I have seen up to now (in both GTK+, Gnome libraries and
1652             many GTK+ and Gnome applications) using signals uses a small
1653             variation of the default handler pattern I have shown in the previous section.
1654           </para>
1655
1656           <para>
1657             Usually, the <function><link linkend="g-signal-new">g_signal_new</link></function> function is preferred over
1658             <function><link linkend="g-signal-newv">g_signal_newv</link></function>. When <function><link linkend="g-signal-new">g_signal_new</link></function>
1659             is used, the default closure is exported as a class function. For example,
1660             <filename>gobject.h</filename> contains the declaration of <type><link linkend="GObjectClass">GObjectClass</link></type>
1661             whose notify class function is the default handler for the <emphasis>notify</emphasis>
1662             signal:
1663 <programlisting>
1664 struct  _GObjectClass
1665 {
1666   GTypeClass   g_type_class;
1667
1668   /* class methods and other stuff. */
1669
1670   /* signals */
1671   void (*notify) (GObject     *object,
1672                   GParamSpec  *pspec);
1673 };
1674 </programlisting>
1675          </para>
1676
1677          <para>
1678            <filename>gobject.c</filename>'s <function><link linkend="g-object-do-class-init">g_object_do_class_init</link></function> function
1679            registers the <emphasis>notify</emphasis> signal and initializes this class function
1680            to NULL:
1681 <programlisting>
1682 static void
1683 g_object_do_class_init (GObjectClass *class)
1684 {
1685
1686   /* Stuff */
1687
1688   class->notify = NULL;
1689
1690   gobject_signals[NOTIFY] =
1691     g_signal_new ("notify",
1692                   G_TYPE_FROM_CLASS (class),
1693                   G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS,
1694                   G_STRUCT_OFFSET (GObjectClass, notify),
1695                   NULL, NULL,
1696                   g_cclosure_marshal_VOID__PARAM,
1697                   G_TYPE_NONE,
1698                   1, G_TYPE_PARAM);
1699 }
1700 </programlisting>
1701            <function><link linkend="g-signal-new">g_signal_new</link></function> creates a <type><link linkend="GClosure">GClosure</link></type> which de-references the
1702            type's class structure to access the class function pointer and invoke it if it not NULL. The
1703            class function is ignored it is set to NULL.
1704          </para>
1705
1706          <para>
1707            To understand the reason for such a complex scheme to access the signal's default handler, 
1708            you must remember the whole reason for the use of these signals. The goal here is to delegate
1709            a part of the process to the user without requiring the user to subclass the object to override
1710            one of the class functions. The alternative to subclassing, that is, the use of signals
1711            to delegate processing to the user, is, however, a bit less optimal in terms of speed: rather
1712            than just de-referencing a function pointer in a class structure, you must start the whole
1713            process of signal emission which is a bit heavyweight.
1714          </para>
1715
1716          <para>
1717            This is why some people decided to use class functions for some signal's default handlers:
1718            rather than having users connect a handler to the signal and stop the signal emission
1719            from within that handler, you just need to override the default class function which is
1720            supposedly more efficient.
1721          </para>
1722
1723         </sect2>
1724 -->
1725
1726
1727 <!--
1728   <capter1 id="howto-doc">
1729     <title>How to generate API documentation for your type ?</title>
1730
1731   </chapter>
1732 -->