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