old contents. E.g. for the implementation of a string
value that may never be <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the implementation might
look like:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">""</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+value->data[0].v_pointer = g_strdup ("");
+</pre></div>
</td>
</tr>
<tr>
data array of the passed in <em class="parameter"><code>value</code></em>. No resources may
remain allocated through the <a class="link" href="gobject-Generic-values.html#GValue" title="GValue"><span class="type">GValue</span></a> contents after
this function returns. E.g. for our above string type:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="comment">// only free strings without a specific flag for static storage</span>
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!(</span><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">1</span><span class="symbol">].</span><span class="normal">v_uint </span><span class="symbol">&</span><span class="normal"> G_VALUE_NOCOPY_CONTENTS</span><span class="symbol">))</span>
-<span class="function"><a href="./../glib/glib/glib-Memory-Allocation.html#g-free">g_free</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+// only free strings without a specific flag for static storage
+if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
+g_free (value->data[0].v_pointer);
+</pre></div>
</td>
</tr>
<tr>
<em class="parameter"><code>src_value</code></em> into <em class="parameter"><code>dest_value</code></em> in a way, that even after
<em class="parameter"><code>src_value</code></em> has been freed, the contents of <em class="parameter"><code>dest_value</code></em>
remain valid. String type example:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="normal">dest_value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">src_value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
+</pre></div>
</td>
</tr>
<tr>
<td>If the value contents fit into a pointer, such as objects
or strings, return this pointer, so the caller can peek at
the current contents. To extend on our above string example:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">return</span><span class="normal"> value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+return value->data[0].v_pointer;
+</pre></div>
</td>
</tr>
<tr>
Thus an extra copy of the contents stored in <em class="parameter"><code>collect_values</code></em> is
not required for assignment to <em class="parameter"><code>value</code></em>.
For our above string example, we continue with:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">)</span>
-<span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">""</span><span class="symbol">);</span>
-<span class="keyword">else</span><span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_flags </span><span class="symbol">&</span><span class="normal"> G_VALUE_NOCOPY_CONTENTS</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span>
-<span class="comment">// keep a flag for the value_free() implementation to not free this string</span>
-<span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">1</span><span class="symbol">].</span><span class="normal">v_uint </span><span class="symbol">=</span><span class="normal"> G_VALUE_NOCOPY_CONTENTS</span><span class="symbol">;</span>
-<span class="cbracket">}</span>
-<span class="keyword">else</span>
-<span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span>
-<span class="keyword">return</span><span class="normal"> <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+if (!collect_values[0].v_pointer)
+value->data[0].v_pointer = g_strdup ("");
+else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+{
+value->data[0].v_pointer = collect_values[0].v_pointer;
+// keep a flag for the value_free() implementation to not free this string
+value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+}
+else
+value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
+return NULL;
+</pre></div>
It should be noted, that it is generally a bad idea to follow the
<span class="type">G_VALUE_NOCOPY_CONTENTS</span> hint for reference counted types. Due to
reentrancy requirements and reference count assertions performed
array. To deviate from our string example for a moment, and taking
a look at an exemplary implementation for <code class="function">collect_value()</code> of
<a class="link" href="gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">object </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span>
-<span class="comment">// never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types</span>
-<span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="gobject-The-Base-Object-Type.html#g-object-ref">g_object_ref</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">object</span><span class="symbol">);</span>
-<span class="keyword">return</span><span class="normal"> <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
-<span class="cbracket">}</span>
-<span class="keyword">else</span>
-<span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup-printf">g_strdup_printf</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"Object passed as invalid NULL pointer"</span><span class="symbol">);</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+if (collect_values[0].v_pointer)
+{
+GObject *object = G_OBJECT (collect_values[0].v_pointer);
+// never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types
+value->data[0].v_pointer = g_object_ref (object);
+return NULL;
+}
+else
+return g_strdup_printf ("Object passed as invalid NULL pointer");
+}
+</pre></div>
The reference count for valid objects is always incremented,
regardless of <em class="parameter"><code>collect_flags</code></em>. For invalid objects, the example
returns a newly allocated string without altering <em class="parameter"><code>value</code></em>.
Similar to <code class="function">collect_value()</code> the function may prematurely abort
by returning a newly allocated string describing an error condition.
To complete the string example:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">gchar</span><span class="normal"> </span><span class="symbol">**</span><span class="normal">string_p </span><span class="symbol">=</span><span class="normal"> collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span>
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">string_p</span><span class="symbol">)</span>
-<span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup-printf">g_strdup_printf</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"string location passed as NULL"</span><span class="symbol">);</span>
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_flags </span><span class="symbol">&</span><span class="normal"> G_VALUE_NOCOPY_CONTENTS</span><span class="symbol">)</span>
-<span class="symbol">*</span><span class="normal">string_p </span><span class="symbol">=</span><span class="normal"> value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span>
-<span class="keyword">else</span>
-<span class="symbol">*</span><span class="normal">string_p </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+gchar **string_p = collect_values[0].v_pointer;
+if (!string_p)
+return g_strdup_printf ("string location passed as NULL");
+if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
+*string_p = value->data[0].v_pointer;
+else
+*string_p = g_strdup (value->data[0].v_pointer);
+</pre></div>
And an illustrative version of <code class="function">lcopy_value()</code> for
reference-counted types:
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6
-7
-8
-9
-10</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">**</span><span class="normal">object_p </span><span class="symbol">=</span><span class="normal"> collect_values</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span>
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">object_p</span><span class="symbol">)</span>
-<span class="keyword">return</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup-printf">g_strdup_printf</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"object location passed as NULL"</span><span class="symbol">);</span>
-<span class="keyword">if</span><span class="normal"> </span><span class="symbol">(!</span><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">)</span>
-<span class="symbol">*</span><span class="normal">object_p </span><span class="symbol">=</span><span class="normal"> <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
-<span class="keyword">else</span><span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">collect_flags </span><span class="symbol">&</span><span class="normal"> G_VALUE_NOCOPY_CONTENTS</span><span class="symbol">)</span><span class="normal"> </span><span class="comment">/* always honour */</span>
-<span class="symbol">*</span><span class="normal">object_p </span><span class="symbol">=</span><span class="normal"> value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">;</span>
-<span class="keyword">else</span>
-<span class="symbol">*</span><span class="normal">object_p </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="gobject-The-Base-Object-Type.html#g-object-ref">g_object_ref</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">value</span><span class="symbol">-></span><span class="normal">data</span><span class="symbol">[</span><span class="number">0</span><span class="symbol">].</span><span class="normal">v_pointer</span><span class="symbol">);</span>
-<span class="keyword">return</span><span class="normal"> <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+GObject **object_p = collect_values[0].v_pointer;
+if (!object_p)
+return g_strdup_printf ("object location passed as NULL");
+if (!value->data[0].v_pointer)
+*object_p = NULL;
+else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) /* always honour */
+*object_p = value->data[0].v_pointer;
+else
+*object_p = g_object_ref (value->data[0].v_pointer);
+return NULL;
+</pre></div>
</td>
</tr>
</tbody>
system).
</p>
<p>
+This function is idempotent.
+</p>
+<p>
Since version 2.24 this also initializes the thread system
</p>
</div>
<p>
Similar to <a class="link" href="gobject-Type-Information.html#g-type-init" title="g_type_init ()"><code class="function">g_type_init()</code></a>, but additionally sets debug flags.
</p>
+<p>
+This function is idempotent.
+</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody><tr>
</p>
<p>
</p>
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="classname">_MyObject</span><span class="normal"> MyObject</span><span class="symbol">;</span>
-<span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="classname">_MyObjectPrivate</span><span class="normal"> MyObjectPrivate</span><span class="symbol">;</span>
+<div class="informalexample"><pre class="programlisting">
+typedef struct _MyObject MyObject;
+typedef struct _MyObjectPrivate MyObjectPrivate;
-<span class="keyword">struct</span><span class="normal"> </span><span class="classname">_MyObject</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GObject</span><span class="normal"> parent</span><span class="symbol">;</span>
+struct _MyObject {
+ GObject parent;
-<span class="normal"> </span><span class="usertype">MyObjectPrivate</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">priv</span><span class="symbol">;</span>
-<span class="cbracket">}</span><span class="symbol">;</span>
+ MyObjectPrivate *priv;
+};
-<span class="keyword">struct</span><span class="normal"> </span><span class="classname">_MyObjectPrivate</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="type">int</span><span class="normal"> some_field</span><span class="symbol">;</span>
-<span class="cbracket">}</span><span class="symbol">;</span>
+struct _MyObjectPrivate {
+ int some_field;
+};
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">my_object_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">MyObjectClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">klass</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#g-type-class-add-private">g_type_class_add_private</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">klass</span><span class="symbol">,</span><span class="normal"> </span><span class="keyword">sizeof</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">MyObjectPrivate</span><span class="symbol">));</span>
-<span class="cbracket">}</span>
+static void
+my_object_class_init (MyObjectClass *klass)
+{
+ g_type_class_add_private (klass, sizeof (MyObjectPrivate));
+}
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">my_object_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">MyObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">my_object</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> my_object</span><span class="symbol">-></span><span class="normal">priv </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#G-TYPE-INSTANCE-GET-PRIVATE:CAPS">G_TYPE_INSTANCE_GET_PRIVATE</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">my_object</span><span class="symbol">,</span>
-<span class="normal"> MY_TYPE_OBJECT</span><span class="symbol">,</span>
-<span class="normal"> MyObjectPrivate</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
+static void
+my_object_init (MyObject *my_object)
+{
+ my_object->priv = G_TYPE_INSTANCE_GET_PRIVATE (my_object,
+ MY_TYPE_OBJECT,
+ MyObjectPrivate);
+}
-<span class="keyword">static</span><span class="normal"> </span><span class="type">int</span>
-<span class="function">my_object_get_some_field</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">MyObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">my_object</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">MyObjectPrivate</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">priv</span><span class="symbol">;</span>
+static int
+my_object_get_some_field (MyObject *my_object)
+{
+ MyObjectPrivate *priv;
-<span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Warnings-and-Assertions.html#g-return-val-if-fail">g_return_val_if_fail</a></span><span class="normal"> </span><span class="symbol">(</span><span class="function">MY_IS_OBJECT</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">my_object</span><span class="symbol">),</span><span class="normal"> </span><span class="number">0</span><span class="symbol">);</span>
+ g_return_val_if_fail (MY_IS_OBJECT (my_object), 0);
-<span class="normal"> priv </span><span class="symbol">=</span><span class="normal"> my_object</span><span class="symbol">-></span><span class="normal">priv</span><span class="symbol">;</span>
-
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> priv</span><span class="symbol">-></span><span class="normal">some_field</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+ priv = my_object->priv;
+ return priv->some_field;
+}
+</pre></div>
<p>
</p>
<div class="variablelist"><table border="0">
</p>
<p>
</p>
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GObjectClass</span><span class="normal"> parent_class</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="usertype">gint</span><span class="normal"> static_integer</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="usertype">gchar</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">dynamic_string</span><span class="symbol">;</span>
-<span class="cbracket">}</span><span class="normal"> TypeAClass</span><span class="symbol">;</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_a_base_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeAClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> class</span><span class="symbol">-></span><span class="normal">dynamic_string </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-String-Utility-Functions.html#g-strdup">g_strdup</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"some string"</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_a_base_class_finalize</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeAClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Memory-Allocation.html#g-free">g_free</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">class</span><span class="symbol">-></span><span class="normal">dynamic_string</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_a_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeAClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> class</span><span class="symbol">-></span><span class="normal">static_integer </span><span class="symbol">=</span><span class="normal"> </span><span class="number">42</span><span class="symbol">;</span>
-<span class="cbracket">}</span>
-
-<span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">TypeAClass</span><span class="normal"> parent_class</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="usertype">gfloat</span><span class="normal"> static_float</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="usertype">GString</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">dynamic_gstring</span><span class="symbol">;</span>
-<span class="cbracket">}</span><span class="normal"> TypeBClass</span><span class="symbol">;</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_b_base_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeBClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> class</span><span class="symbol">-></span><span class="normal">dynamic_gstring </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Strings.html#g-string-new">g_string_new</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"some other string"</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_b_base_class_finalize</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeBClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Strings.html#g-string-free">g_string_free</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">class</span><span class="symbol">-></span><span class="normal">dynamic_gstring</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
-<span class="function">type_b_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TypeBClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">class</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> class</span><span class="symbol">-></span><span class="normal">static_float </span><span class="symbol">=</span><span class="normal"> </span><span class="number">3.14159265358979323846</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+<div class="informalexample"><pre class="programlisting">
+typedef struct {
+ GObjectClass parent_class;
+ gint static_integer;
+ gchar *dynamic_string;
+} TypeAClass;
+static void
+type_a_base_class_init (TypeAClass *class)
+{
+ class->dynamic_string = g_strdup ("some string");
+}
+static void
+type_a_base_class_finalize (TypeAClass *class)
+{
+ g_free (class->dynamic_string);
+}
+static void
+type_a_class_init (TypeAClass *class)
+{
+ class->static_integer = 42;
+}
+typedef struct {
+ TypeAClass parent_class;
+ gfloat static_float;
+ GString *dynamic_gstring;
+} TypeBClass;
+static void
+type_b_base_class_init (TypeBClass *class)
+{
+ class->dynamic_gstring = g_string_new ("some other string");
+}
+static void
+type_b_base_class_finalize (TypeBClass *class)
+{
+ g_string_free (class->dynamic_gstring);
+}
+static void
+type_b_class_init (TypeBClass *class)
+{
+ class->static_float = 3.14159265358979323846;
+}
+</pre></div>
<p>
Initialization of TypeBClass will first cause initialization of
TypeAClass (derived classes reference their parent classes, see
</p>
<p>
</p>
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>1
-2
-3
-4
-5
-6</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="gobject-Type-Information.html#G-DEFINE-TYPE-EXTENDED:CAPS">G_DEFINE_TYPE_EXTENDED</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GtkGadget</span><span class="symbol">,</span>
-<span class="normal"> gtk_gadget</span><span class="symbol">,</span>
-<span class="normal"> GTK_TYPE_WIDGET</span><span class="symbol">,</span>
-<span class="normal"> </span><span class="number">0</span><span class="symbol">,</span>
-<span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#G-IMPLEMENT-INTERFACE:CAPS">G_IMPLEMENT_INTERFACE</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">TYPE_GIZMO</span><span class="symbol">,</span>
-<span class="normal"> gtk_gadget_gizmo_init</span><span class="symbol">));</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
-
+<div class="informalexample"><pre class="programlisting">
+G_DEFINE_TYPE_EXTENDED (GtkGadget,
+ gtk_gadget,
+ GTK_TYPE_WIDGET,
+ 0,
+ G_IMPLEMENT_INTERFACE (TYPE_GIZMO,
+ gtk_gadget_gizmo_init));
+</pre></div>
<p>
expands to
</p>
-<div class="informalexample">
- <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
- <tbody>
- <tr>
- <td class="listing_lines" align="right"><pre>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</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">gtk_gadget_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkGadget</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">self</span><span class="symbol">);</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">gtk_gadget_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GtkGadgetClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">klass</span><span class="symbol">);</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="usertype">gpointer</span><span class="normal"> gtk_gadget_parent_class </span><span class="symbol">=</span><span class="normal"> <a href="./../glib/glib/glib-Standard-Macros.html#NULL:CAPS">NULL</a></span><span class="symbol">;</span>
-<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">gtk_gadget_class_intern_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">gpointer</span><span class="normal"> klass</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> gtk_gadget_parent_class </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#g-type-class-peek-parent">g_type_class_peek_parent</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">klass</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="function">gtk_gadget_class_init</span><span class="normal"> </span><span class="symbol">((</span><span class="normal">GtkGadgetClass</span><span class="symbol">*)</span><span class="normal"> klass</span><span class="symbol">);</span>
-<span class="cbracket">}</span>
-
-<span class="normal"><a href="gobject-Type-Information.html#GType">GType</a></span>
-<span class="function">gtk_gadget_get_type</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span>
-<span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">static</span><span class="normal"> </span><span class="keyword">volatile</span><span class="normal"> </span><span class="usertype">gsize</span><span class="normal"> g_define_type_id__volatile </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="keyword">if</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="./../glib/glib/glib-Threads.html#g-once-init-enter">g_once_init_enter</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">g_define_type_id__volatile</span><span class="symbol">))</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="usertype">GType</span><span class="normal"> g_define_type_id </span><span class="symbol">=</span>
-<span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#g-type-register-static-simple">g_type_register_static_simple</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GTK_TYPE_WIDGET</span><span class="symbol">,</span>
-<span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Quarks.html#g-intern-static-string">g_intern_static_string</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"GtkGadget"</span><span class="symbol">),</span>
-<span class="normal"> </span><span class="keyword">sizeof</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GtkGadgetClass</span><span class="symbol">),</span>
-<span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gobject-Type-Information.html#GClassInitFunc">GClassInitFunc</a></span><span class="symbol">)</span><span class="normal"> gtk_gadget_class_intern_init</span><span class="symbol">,</span>
-<span class="normal"> </span><span class="keyword">sizeof</span><span class="normal"> </span><span class="symbol">(</span><span class="normal">GtkGadget</span><span class="symbol">),</span>
-<span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gobject-Type-Information.html#GInstanceInitFunc">GInstanceInitFunc</a></span><span class="symbol">)</span><span class="normal"> gtk_gadget_init</span><span class="symbol">,</span>
-<span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gobject-Type-Information.html#GTypeFlags">GTypeFlags</a></span><span class="symbol">)</span><span class="normal"> flags</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="keyword">const</span><span class="normal"> </span><span class="usertype">GInterfaceInfo</span><span class="normal"> g_implement_interface_info </span><span class="symbol">=</span><span class="normal"> </span><span class="cbracket">{</span>
-<span class="normal"> </span><span class="symbol">(</span><span class="normal"><a href="gobject-Type-Information.html#GInterfaceInitFunc">GInterfaceInitFunc</a></span><span class="symbol">)</span><span class="normal"> gtk_gadget_gizmo_init</span>
-<span class="normal"> </span><span class="cbracket">}</span><span class="symbol">;</span>
-<span class="normal"> </span><span class="function"><a href="gobject-Type-Information.html#g-type-add-interface-static">g_type_add_interface_static</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">g_define_type_id</span><span class="symbol">,</span><span class="normal"> TYPE_GIZMO</span><span class="symbol">,</span><span class="normal"> </span><span class="symbol">&</span><span class="normal">g_implement_interface_info</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="cbracket">}</span>
-<span class="normal"> </span><span class="function"><a href="./../glib/glib/glib-Threads.html#g-once-init-leave">g_once_init_leave</a></span><span class="normal"> </span><span class="symbol">(&</span><span class="normal">g_define_type_id__volatile</span><span class="symbol">,</span><span class="normal"> g_define_type_id</span><span class="symbol">);</span>
-<span class="normal"> </span><span class="cbracket">}</span>
-<span class="normal"> </span><span class="keyword">return</span><span class="normal"> g_define_type_id__volatile</span><span class="symbol">;</span>
-<span class="cbracket">}</span></pre></td>
- </tr>
- </tbody>
- </table>
-</div>
+<div class="informalexample"><pre class="programlisting">
+static void gtk_gadget_init (GtkGadget *self);
+static void gtk_gadget_class_init (GtkGadgetClass *klass);
+static gpointer gtk_gadget_parent_class = NULL;
+static void gtk_gadget_class_intern_init (gpointer klass)
+{
+ gtk_gadget_parent_class = g_type_class_peek_parent (klass);
+ gtk_gadget_class_init ((GtkGadgetClass*) klass);
+}
+GType
+gtk_gadget_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+ if (g_once_init_enter (&g_define_type_id__volatile))
+ {
+ GType g_define_type_id =
+ g_type_register_static_simple (GTK_TYPE_WIDGET,
+ g_intern_static_string ("GtkGadget"),
+ sizeof (GtkGadgetClass),
+ (GClassInitFunc) gtk_gadget_class_intern_init,
+ sizeof (GtkGadget),
+ (GInstanceInitFunc) gtk_gadget_init,
+ (GTypeFlags) flags);
+ {
+ const GInterfaceInfo g_implement_interface_info = {
+ (GInterfaceInitFunc) gtk_gadget_gizmo_init
+ };
+ g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info);
+ }
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+ return g_define_type_id__volatile;
+}
+</pre></div>
<p>
The only pieces which have to be manually provided are the definitions of
the instance and class structure and the definitions of the instance and