~attente/glib/gicon-upstream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The GObject base class</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.77.1">
<link rel="home" href="index.html" title="GObject Reference Manual">
<link rel="up" href="pt01.html" title="Part I. Concepts">
<link rel="prev" href="gtype-non-instantiable-classed.html" title="Non-instantiable classed types: interfaces">
<link rel="next" href="gobject-memory.html" title="Object memory management">
<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="gtype-non-instantiable-classed.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="pt01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">GObject Reference Manual</th>
<td><a accesskey="n" href="gobject-memory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
<a name="chapter-gobject"></a>The GObject base class</h2></div></div></div>
<div class="toc"><dl>
<dt><span class="sect1"><a href="chapter-gobject.html#gobject-instantiation">Object instantiation</a></span></dt>
<dt><span class="sect1"><a href="gobject-memory.html">Object memory management</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="gobject-memory.html#gobject-memory-refcount">Reference count</a></span></dt>
<dt><span class="sect2"><a href="gobject-memory.html#gobject-memory-weakref">Weak References</a></span></dt>
<dt><span class="sect2"><a href="gobject-memory.html#gobject-memory-cycles">Reference counts and cycles</a></span></dt>
</dl></dd>
<dt><span class="sect1"><a href="gobject-properties.html">Object properties</a></span></dt>
<dd><dl><dt><span class="sect2"><a href="gobject-properties.html#gobject-multi-properties">Accessing multiple properties at once</a></span></dt></dl></dd>
</dl></div>
<p>
    The previous chapter discussed the details of GLib's Dynamic Type System.
    The GObject library also contains an implementation for a base fundamental
    type named <a class="link" href="gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>.
  </p>
<p>
    <a class="link" href="gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> is a fundamental classed instantiable type. It implements:
    </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p>Memory management with reference counting</p></li>
<li class="listitem"><p>Construction/Destruction of instances</p></li>
<li class="listitem"><p>Generic per-object properties with set/get function pairs</p></li>
<li class="listitem"><p>Easy use of signals</p></li>
</ul></div>
<p>
    All the GNOME libraries which use the GLib type system (like GTK+ and GStreamer)
    inherit from <a class="link" href="gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> which is why it is important to understand
    the details of how it works.
  </p>
<div class="sect1">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="gobject-instantiation"></a>Object instantiation</h2></div></div></div>
<p>
      The <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code>
      family of functions can be used to instantiate any GType which inherits
      from the GObject base type. All these functions make sure the class and
      instance structures have been correctly initialized by GLib's type system
      and then invoke at one point or another the constructor class method
      which is used to:
      </p>
<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
<li class="listitem"><p>
            Allocate and clear memory through <code class="function"><a class="link" href="gobject-Type-Information.html#g-type-create-instance" title="g_type_create_instance ()">g_type_create_instance</a></code>,
          </p></li>
<li class="listitem"><p>
            Initialize the object's instance with the construction properties.
          </p></li>
</ul></div>
<p>
     Although one can expect all class and instance members (except the fields
     pointing to the parents) to be set to zero, some consider it good practice
     to explicitly set them.
    </p>
<p>
      Objects which inherit from GObject are allowed to override this
      constructor class method: they should however chain to their parent
      constructor method before doing so:
</p>
<pre class="programlisting">
  GObject *(* constructor) (GType                  gtype,
                            guint                  n_properties,
                            GObjectConstructParam *properties);
</pre>
<p>
    </p>
<p>
      The example below shows how <span class="type">MamanBar</span> overrides the parent's constructor:
</p>
<pre class="programlisting">
#define MAMAN_TYPE_BAR                  (maman_bar_get_type ())
#define MAMAN_BAR(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAR, MamanBar))
#define MAMAN_IS_BAR(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAR))
#define MAMAN_BAR_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAR, MamanBarClass))
#define MAMAN_IS_BAR_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAR))
#define MAMAN_BAR_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAR, MamanBarClass))

typedef struct _MamanBar        MamanBar;
typedef struct _MamanBarClass   MamanBarClass;

struct _MamanBar
{
  GObject parent_instance;

  /* instance members */
};

struct _MamanBarClass
{
  GObjectClass parent_class;

  /* class members */
};

/* will create maman_bar_get_type and set maman_bar_parent_class */
G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT);

static GObject *
maman_bar_constructor (GType                  gtype,
                       guint                  n_properties,
                       GObjectConstructParam *properties)
{
  GObject *obj;

  {
    /* Always chain up to the parent constructor */
    obj = G_OBJECT_CLASS (maman_bar_parent_class)-&gt;constructor (gtype, n_properties, properties);
  }
  
  /* update the object state depending on constructor properties */

  return obj;
}

static void
maman_bar_class_init (MamanBarClass *klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

  gobject_class-&gt;constructor = maman_bar_constructor;
}

static void
maman_bar_init (MamanBar *self)
{
  /* initialize the object */
}

</pre>
<p>
      If the user instantiates an object <span class="type">MamanBar</span> with:
</p>
<pre class="programlisting">
MamanBar *bar = g_object_new (MAMAN_TYPE_BAR, NULL);
</pre>
<p>        
      If this is the first instantiation of such an object, the
      <code class="function">maman_bar_class_init</code> function will be invoked
      after any <code class="function">maman_bar_base_class_init</code> function.
      This will make sure the class structure of this new object is
      correctly initialized. Here, <code class="function">maman_bar_class_init</code>
      is expected to override the object's class methods and setup the
      class' own methods. In the example above, the constructor method is
      the only overridden method: it is set to
      <code class="function">maman_bar_constructor</code>.
    </p>
<p>
      Once <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code> has obtained a reference to an initialized
      class structure, it invokes its constructor method to create an instance of the new 
      object. Since it has just been overridden by <code class="function">maman_bar_class_init</code> 
      to <code class="function">maman_bar_constructor</code>, the latter is called and, because it
      was implemented correctly, it chains up to its parent's constructor. In
      order to find the parent class and chain up to the parent class
      constructor, we can use the <code class="literal">maman_bar_parent_class</code>
      pointer that has been set up for us by the
      <code class="literal">G_DEFINE_TYPE</code> macro.
    </p>
<p>
      Finally, at one point or another, <code class="function">g_object_constructor</code> is invoked
      by the last constructor in the chain. This function allocates the object's instance' buffer 
      through <code class="function"><a class="link" href="gobject-Type-Information.html#g-type-create-instance" title="g_type_create_instance ()">g_type_create_instance</a></code>
      which means that the instance_init function is invoked at this point if one
      was registered. After instance_init returns, the object is fully initialized and should be 
      ready to answer any user-request. When <code class="function"><a class="link" href="gobject-Type-Information.html#g-type-create-instance" title="g_type_create_instance ()">g_type_create_instance</a></code>
      returns, <code class="function">g_object_constructor</code> sets the construction properties
      (i.e. the properties which were given to <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code>) and returns
      to the user's constructor which is then allowed to do useful instance initialization...
    </p>
<p>
      The process described above might seem a bit complicated, but it can be
      summarized easily by the table below which lists the functions invoked
      by <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code>
      and their order of invocation:
    </p>
<p>
      </p>
<div class="table">
<a name="gobject-construction-table"></a><p class="title"><b>Table 4. <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code></b></p>
<div class="table-contents"><table summary="g_object_new" border="1">
<colgroup>
<col align="left">
<col align="left">
<col align="left">
</colgroup>
<thead><tr>
<th align="left">Invocation time</th>
<th align="left">Function Invoked</th>
<th align="left">Function's parameters</th>
<th>Remark</th>
</tr></thead>
<tbody>
<tr>
<td rowspan="4" align="left">First call to <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code> for target type</td>
<td align="left">target type's base_init function</td>
<td align="left">On the inheritance tree of classes from fundamental type to target type. 
                base_init is invoked once for each class structure.</td>
<td>
                I have no real idea on how this can be used. If you have a good real-life
                example of how a class' base_init can be used, please, let me know.
              </td>
</tr>
<tr>
<td align="left">target type's class_init function</td>
<td align="left">On target type's class structure</td>
<td>
                Here, you should make sure to initialize or override class methods (that is,
                assign to each class' method its function pointer) and create the signals and
                the properties associated to your object.
              </td>
</tr>
<tr>
<td align="left">interface' base_init function</td>
<td align="left">On interface' vtable</td>
<td> </td>
</tr>
<tr>
<td align="left">interface' interface_init function</td>
<td align="left">On interface' vtable</td>
<td> </td>
</tr>
<tr>
<td rowspan="2" align="left">Each call to <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-new" title="g_object_new ()">g_object_new</a></code> for target type</td>
<td align="left">target type's class constructor method: GObjectClass-&gt;constructor</td>
<td align="left">On object's instance</td>
<td>
                If you need to complete the object initialization after all the construction properties
                are set, override the constructor method and make sure to chain up to the object's
                parent class before doing your own initialization.
                In doubt, do not override the constructor method.
              </td>
</tr>
<tr>
<td align="left">type's instance_init function</td>
<td align="left">On the inheritance tree of classes from fundamental type to target type. 
              the instance_init provided for each type is invoked once for each instance 
              structure.</td>
<td>
                Provide an instance_init function to initialize your object before its construction
                properties are set. This is the preferred way to initialize a GObject instance.
                This function is equivalent to C++ constructors.
              </td>
</tr>
</tbody>
</table></div>
</div>
<p><br class="table-break">
    </p>
<p>
      Readers should feel concerned about one little twist in the order in
      which functions are invoked: while, technically, the class' constructor
      method is called <span class="emphasis"><em>before</em></span> the GType's instance_init
      function (since <code class="function"><a class="link" href="gobject-Type-Information.html#g-type-create-instance" title="g_type_create_instance ()">g_type_create_instance</a></code> which calls instance_init is called by
      <code class="function">g_object_constructor</code> which is the top-level class 
      constructor method and to which users are expected to chain to), the
      user's code which runs in a user-provided constructor will always
      run <span class="emphasis"><em>after</em></span> GType's instance_init function since the
      user-provided constructor <span class="emphasis"><em>must</em></span> (you've been warned)
      chain up <span class="emphasis"><em>before</em></span> doing anything useful.
    </p>
</div>
</div>
<div class="footer">
<hr>
          Generated by GTK-Doc V1.18</div>
</body>
</html>