111
111
an example of the suggested way to implement property pages, you may of course choose
112
112
a different way):
114
<div class="informalexample"><pre class="programlisting">
115
##ifndef __TAG_PAGE_H__
116
##define __TAG_PAGE_H__
117
##include <thunarx/thunarx.h>
119
typedef struct _TagPageClass TagPageClass;
120
typedef struct _TagPage TagPage;
121
#define TAG_TYPE_PAGE (tag_page_get_type ())
122
#define TAG_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TAG_TYPE_PAGE, TagPage))
123
#define TAG_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TAG_TYPE_PAGE, TagPageClass))
124
#define TAG_IS_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TAG_TYPE_PAGE))
125
#define TAG_IS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TAG_TYPE_PAGE))
126
#define TAG_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TAG_TYPE_PAGE, TagPageClass))
127
/* these two functions are implemented automatically by the THUNARX_DEFINE_TYPE macro */
128
GType tag_page_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL;
129
void tag_page_register_type (ThunarxProviderPlugin *plugin) G_GNUC_INTERNAL;
130
GtkWidget *tag_page_new (ThunarxFileInfo *file) G_GNUC_INTERNAL G_GNUC_MALLOC;
131
ThunarxFileInfo *tag_page_get_file (TagPage *tag_page) G_GNUC_INTERNAL;
132
void tag_page_set_file (TagPage *tag_page,
133
ThunarxFileInfo *file) G_GNUC_INTERNAL;
135
##endif /* !__TAG_PAGE_H__ */
114
<div class="informalexample">
115
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
118
<td class="listing_lines" align="right"><pre>1
139
<td class="listing_code"><pre class="programlisting"><span class="preproc">#</span><span class="normal">#ifndef __TAG_PAGE_H__</span>
140
<span class="preproc">#</span><span class="normal">#define __TAG_PAGE_H__</span>
141
<span class="preproc">#</span><span class="normal">#include </span><span class="symbol"><</span><span class="normal">thunarx</span><span class="symbol">/</span><span class="normal">thunarx</span><span class="symbol">.</span><span class="normal">h</span><span class="symbol">></span>
142
<span class="normal"><a href="/usr/share/gtk-doc/html/glib/glib-Miscellaneous-Macros.html#G-BEGIN-DECLS:CAPS">G_BEGIN_DECLS</a></span><span class="symbol">;</span>
143
<span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="classname">_TagPageClass</span><span class="normal"> TagPageClass</span><span class="symbol">;</span>
144
<span class="keyword">typedef</span><span class="normal"> </span><span class="keyword">struct</span><span class="normal"> </span><span class="classname">_TagPage</span><span class="normal"> TagPage</span><span class="symbol">;</span>
145
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_TYPE_PAGE</span><span class="normal"> </span><span class="symbol">(</span><span class="function">tag_page_get_type</span><span class="normal"> </span><span class="symbol">())</span>
146
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_PAGE</span><span class="symbol">(</span><span class="normal">obj</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Type-Information.html#G-TYPE-CHECK-INSTANCE-CAST:CAPS">G_TYPE_CHECK_INSTANCE_CAST</a></span><span class="normal"> </span><span class="symbol">((</span><span class="normal">obj</span><span class="symbol">),</span><span class="normal"> TAG_TYPE_PAGE</span><span class="symbol">,</span><span class="normal"> TagPage</span><span class="symbol">))</span>
147
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_PAGE_CLASS</span><span class="symbol">(</span><span class="normal">klass</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Type-Information.html#G-TYPE-CHECK-CLASS-CAST:CAPS">G_TYPE_CHECK_CLASS_CAST</a></span><span class="normal"> </span><span class="symbol">((</span><span class="normal">klass</span><span class="symbol">),</span><span class="normal"> TAG_TYPE_PAGE</span><span class="symbol">,</span><span class="normal"> TagPageClass</span><span class="symbol">))</span>
148
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_IS_PAGE</span><span class="symbol">(</span><span class="normal">obj</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Type-Information.html#G-TYPE-CHECK-INSTANCE-TYPE:CAPS">G_TYPE_CHECK_INSTANCE_TYPE</a></span><span class="normal"> </span><span class="symbol">((</span><span class="normal">obj</span><span class="symbol">),</span><span class="normal"> TAG_TYPE_PAGE</span><span class="symbol">))</span>
149
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_IS_PAGE_CLASS</span><span class="symbol">(</span><span class="normal">klass</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Type-Information.html#G-TYPE-CHECK-CLASS-TYPE:CAPS">G_TYPE_CHECK_CLASS_TYPE</a></span><span class="normal"> </span><span class="symbol">((</span><span class="normal">klass</span><span class="symbol">),</span><span class="normal"> TAG_TYPE_PAGE</span><span class="symbol">))</span>
150
<span class="preproc">#define</span><span class="normal"> </span><span class="function">TAG_PAGE_GET_CLASS</span><span class="symbol">(</span><span class="normal">obj</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Type-Information.html#G-TYPE-INSTANCE-GET-CLASS:CAPS">G_TYPE_INSTANCE_GET_CLASS</a></span><span class="normal"> </span><span class="symbol">((</span><span class="normal">obj</span><span class="symbol">),</span><span class="normal"> TAG_TYPE_PAGE</span><span class="symbol">,</span><span class="normal"> TagPageClass</span><span class="symbol">))</span>
151
<span class="comment">/* these two functions are implemented automatically by the THUNARX_DEFINE_TYPE macro */</span>
152
<span class="usertype">GType</span><span class="normal"> </span><span class="function">tag_page_get_type</span><span class="normal"> </span><span class="symbol">(</span><span class="type">void</span><span class="symbol">)</span><span class="normal"> <a href="/usr/share/gtk-doc/html/glib/glib-Miscellaneous-Macros.html#G-GNUC-CONST:CAPS">G_GNUC_CONST</a></span><span class="symbol">;</span>
153
<span class="type">void</span><span class="normal"> </span><span class="function">tag_page_register_type</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">ThunarxProviderPlugin</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">plugin</span><span class="symbol">);</span>
154
<span class="usertype">GtkWidget</span><span class="normal"> </span><span class="symbol">*</span><span class="function">tag_page_new</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">ThunarxFileInfo</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">file</span><span class="symbol">)</span><span class="normal"> <a href="/usr/share/gtk-doc/html/glib/glib-Miscellaneous-Macros.html#G-GNUC-MALLOC:CAPS">G_GNUC_MALLOC</a></span><span class="symbol">;</span>
155
<span class="usertype">ThunarxFileInfo</span><span class="normal"> </span><span class="symbol">*</span><span class="function">tag_page_get_file</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TagPage</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">tag_page</span><span class="symbol">);</span>
156
<span class="type">void</span><span class="normal"> </span><span class="function">tag_page_set_file</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TagPage</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">tag_page</span><span class="symbol">,</span>
157
<span class="normal"> </span><span class="usertype">ThunarxFileInfo</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">file</span><span class="symbol">);</span>
158
<span class="normal"><a href="/usr/share/gtk-doc/html/glib/glib-Miscellaneous-Macros.html#G-END-DECLS:CAPS">G_END_DECLS</a></span><span class="symbol">;</span>
159
<span class="preproc">#</span><span class="normal">#endif </span><span class="comment">/* !__TAG_PAGE_H__ */</span></pre></td>
138
166
And the <code class="filename">tag-page.c</code> source file could look like this:
140
<div class="informalexample"><pre class="programlisting">
141
##include "tag-page.h"
142
/* Property identifiers */
148
static void tag_page_class_init (TagPageClass *klass);
149
static void tag_page_init (TagPage *tag_page);
150
static void tag_page_finalize (GObject *object);
151
static void tag_page_get_property (GObject *object,
155
static void tag_page_set_property (GObject *object,
159
static void tag_page_file_changed (ThunarxFileInfo *file,
163
ThunarxPropertyPageClass __parent__;
167
ThunarxPropertyPage __parent__;
168
ThunarxFileInfo *file;
169
/* your widgets... */
171
/* implements the tag_page_get_type() and tag_page_register_type() functions */
172
THUNARX_DEFINE_TYPE (TagPage, tag_page, THUNARX_TYPE_PROPERTY_PAGE);
174
tag_page_class_init (TagPageClass *klass)
176
GObjectClass *gobject_class;
177
gobject_class = G_OBJECT_CLASS (klass);
178
gobject_class->finalize = tag_page_finalize;
179
gobject_class->get_property = tag_page_get_property;
180
gobject_class->set_property = tag_page_set_property;
184
* The <a class="link" href="ThunarxFileInfo.html" title="ThunarxFileInfo">ThunarxFileInfo</a> displayed by this TagPage.
186
g_object_class_install_property (gobject_class,
188
g_param_spec_object ("file", "file", "file,
189
THUNARX_TYPE_FILE_INFO,
193
tag_page_init (TagPage *tag_page)
196
/* you can of course also use a GtkVBox here, or whatever */
197
table = gtk_table_new (2, 2, FALSE);
198
gtk_container_add (GTK_CONTAINER (tag_page), table);
199
gtk_widget_show (table);
200
/* add your widgets to the table... */
203
tag_page_finalize (GObject *object)
205
TagPage *tag_page = TAG_PAGE (object);
206
/* disconnect from the file */
207
tag_page_set_file (tag_page, NULL);
208
/* release any additional resources... */
209
(*G_OBJECT_CLASS (tag_page_parent_class)->finalize) (object);
212
tag_page_get_property (GObject *object,
217
TagPage *tag_page = TAG_PAGE (object);
221
g_value_set_object (value, tag_page_get_file (tag_page));
224
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
229
tag_page_set_property (GObject *object,
234
TagPage *tag_page = TAG_PAGE (object);
238
tag_page_set_file (tag_page, g_value_get_object (value));
241
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
246
tag_page_file_changed (ThunarxFileInfo *file,
249
/* update your user interface elements in the tag_page
250
* to display the new state of the file...
254
tag_page_new (ThunarxFileInfo *file)
256
return g_object_new (TAG_TYPE_PAGE, "file", file, NULL);
259
tag_page_get_file (TagPage *tag_page)
261
g_return_val_if_fail (TAG_IS_PAGE (tag_page), NULL);
262
return tag_page->file;
265
tag_page_set_file (TagPage *tag_page,
266
ThunarxFileInfo *file)
268
g_return_if_fail (TAG_IS_PAGE (tag_page));
269
g_return_if_fail (file == NULL || THUNARX_IS_FILE_INFO (file));
270
if (tag_page->file != NULL)
272
g_signal_handlers_disconnect_by_func (tag_page->file, tag_page_file_changed, tag_page);
273
g_object_unref (G_OBJECT (tag_page->file));
275
tag_page->file = file;
279
tag_page_file_changed (file, tag_page);
280
g_signal_connect (file, "changed", G_CALLBACK (tag_page_file_changed), tag_page);
282
g_object_notify (G_OBJECT (tag_page), "file");
168
<div class="informalexample">
169
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
172
<td class="listing_lines" align="right"><pre>1
315
<td class="listing_code"><pre class="programlisting"><span class="preproc">#</span><span class="normal">#include </span><span class="string">"tag-page.h"</span>
316
<span class="comment">/* Property identifiers */</span>
317
<span class="keyword">enum</span>
318
<span class="cbracket">{</span>
319
<span class="normal"> PROP_0</span><span class="symbol">,</span>
320
<span class="normal"> PROP_FILE</span><span class="symbol">,</span>
321
<span class="cbracket">}</span><span class="symbol">;</span>
322
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TagPageClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">klass</span><span class="symbol">);</span>
323
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TagPage</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">tag_page</span><span class="symbol">);</span>
324
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_finalize</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">object</span><span class="symbol">);</span>
325
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_get_property</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">object</span><span class="symbol">,</span>
326
<span class="normal"> </span><span class="usertype">guint</span><span class="normal"> prop_id</span><span class="symbol">,</span>
327
<span class="normal"> </span><span class="usertype">GValue</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">value</span><span class="symbol">,</span>
328
<span class="normal"> </span><span class="usertype">GParamSpec</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">pspec</span><span class="symbol">);</span>
329
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_set_property</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">GObject</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">object</span><span class="symbol">,</span>
330
<span class="normal"> </span><span class="usertype">guint</span><span class="normal"> prop_id</span><span class="symbol">,</span>
331
<span class="normal"> </span><span class="keyword">const</span><span class="normal"> </span><span class="usertype">GValue</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">value</span><span class="symbol">,</span>
332
<span class="normal"> </span><span class="usertype">GParamSpec</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">pspec</span><span class="symbol">);</span>
333
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span><span class="normal"> </span><span class="function">tag_page_file_changed</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">ThunarxFileInfo</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">file</span><span class="symbol">,</span>
334
<span class="normal"> </span><span class="usertype">TagPage</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">tag_page</span><span class="symbol">);</span>
335
<span class="keyword">struct</span><span class="normal"> </span><span class="classname">_TagPageClass</span>
336
<span class="cbracket">{</span>
337
<span class="normal"> ThunarxPropertyPageClass __parent__</span><span class="symbol">;</span>
338
<span class="cbracket">}</span><span class="symbol">;</span>
339
<span class="keyword">struct</span><span class="normal"> </span><span class="classname">_TagPage</span>
340
<span class="cbracket">{</span>
341
<span class="normal"> <a href="ThunarxPropertyPage.html">ThunarxPropertyPage</a> __parent__</span><span class="symbol">;</span>
342
<span class="normal"> </span><span class="usertype">ThunarxFileInfo</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">file</span><span class="symbol">;</span>
343
<span class="normal"> </span><span class="comment">/* your widgets... */</span>
344
<span class="cbracket">}</span><span class="symbol">;</span>
345
<span class="comment">/* implements the tag_page_get_type() and tag_page_register_type() functions */</span>
346
<span class="function"><a href="ThunarxProviderPlugin.html#THUNARX-DEFINE-TYPE:CAPS">THUNARX_DEFINE_TYPE</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">TagPage</span><span class="symbol">,</span><span class="normal"> tag_page</span><span class="symbol">,</span><span class="normal"> THUNARX_TYPE_PROPERTY_PAGE</span><span class="symbol">);</span>
347
<span class="keyword">static</span><span class="normal"> </span><span class="type">void</span>
348
<span class="function">tag_page_class_init</span><span class="normal"> </span><span class="symbol">(</span><span class="usertype">TagPageClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">klass</span><span class="symbol">)</span>
349
<span class="cbracket">{</span>
350
<span class="normal"> </span><span class="usertype">GObjectClass</span><span class="normal"> </span><span class="symbol">*</span><span class="normal">gobject_class</span><span class="symbol">;</span>
351
<span class="normal"> gobject_class </span><span class="symbol">=</span><span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-The-Base-Object-Type.html#G-OBJECT-CLASS:CAPS">G_OBJECT_CLASS</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">klass</span><span class="symbol">);</span>
352
<span class="normal"> gobject_class</span><span class="symbol">-></span><span class="normal">finalize </span><span class="symbol">=</span><span class="normal"> tag_page_finalize</span><span class="symbol">;</span>
353
<span class="normal"> gobject_class</span><span class="symbol">-></span><span class="normal">get_property </span><span class="symbol">=</span><span class="normal"> tag_page_get_property</span><span class="symbol">;</span>
354
<span class="normal"> gobject_class</span><span class="symbol">-></span><span class="normal">set_property </span><span class="symbol">=</span><span class="normal"> tag_page_set_property</span><span class="symbol">;</span>
355
<span class="normal"> </span><span class="comment">/**</span>
356
<span class="comment"> * TagPage:file:</span>
357
<span class="comment"> *</span>
358
<span class="comment"> * The </span><span class="keyword"><a</span><span class="normal"> </span><span class="type">class</span><span class="symbol">=</span><span class="string">"link"</span><span class="normal"> </span><span class="type">href</span><span class="symbol">=</span><span class="string">"ThunarxFileInfo.html"</span><span class="normal"> </span><span class="type">title</span><span class="symbol">=</span><span class="string">"ThunarxFileInfo"</span><span class="keyword">></span><span class="comment">ThunarxFileInfo</span><span class="keyword"></a></span><span class="comment"> displayed by this </span><span class="keyword"><GTKDOCLINK</span><span class="normal"> </span><span class="type">HREF</span><span class="symbol">=</span><span class="string">"TagPage"</span><span class="keyword">></span><span class="comment">TagPage</span><span class="keyword"></GTKDOCLINK></span><span class="comment">.</span>
359
<span class="comment"> **/</span>
360
<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-The-Base-Object-Type.html#g-object-class-install-property">g_object_class_install_property</a></span><span class="normal"> </span><span class="symbol">(</span><span class="normal">gobject_class</span><span class="symbol">,</span>
361
<span class="normal"> PROP_FILE</span><span class="symbol">,</span>
362
<span class="normal"> </span><span class="function"><a href="/usr/share/gtk-doc/html/gobject/gobject-Standard-Parameter-and-Value-Types.html#g-param-spec-object">g_param_spec_object</a></span><span class="normal"> </span><span class="symbol">(</span><span class="string">"file"</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"file"</span><span class="symbol">,</span><span class="normal"> </span><span class="string">"file,</span>
363
<span class="string"> THUNARX_TYPE_FILE_INFO,</span>
364
<span class="string"> G_PARAM_READWRITE));</span>
365
<span class="string">}</span>
366
<span class="string">static void</span>
367
<span class="string">tag_page_init (TagPage *tag_page)</span>
368
<span class="string">{</span>
369
<span class="string"> GtkWidget *table;</span>
370
<span class="string"> /* you can of course also use a GtkVBox here, or whatever */</span>
371
<span class="string"> table = gtk_table_new (2, 2, FALSE);</span>
372
<span class="string"> gtk_container_add (GTK_CONTAINER (tag_page), table);</span>
373
<span class="string"> gtk_widget_show (table);</span>
374
<span class="string"> /* add your widgets to the table... */</span>
375
<span class="string">}</span>
376
<span class="string">static void</span>
377
<span class="string">tag_page_finalize (GObject *object)</span>
378
<span class="string">{</span>
379
<span class="string"> TagPage *tag_page = TAG_PAGE (object);</span>
380
<span class="string"> /* disconnect from the file */</span>
381
<span class="string"> tag_page_set_file (tag_page, NULL);</span>
382
<span class="string"> /* release any additional resources... */</span>
383
<span class="string"> (*G_OBJECT_CLASS (tag_page_parent_class)->finalize) (object);</span>
384
<span class="string">}</span>
385
<span class="string">static void</span>
386
<span class="string">tag_page_get_property (GObject *object,</span>
387
<span class="string"> guint prop_id,</span>
388
<span class="string"> GValue *value,</span>
389
<span class="string"> GParamSpec *pspec)</span>
390
<span class="string">{</span>
391
<span class="string"> TagPage *tag_page = TAG_PAGE (object);</span>
392
<span class="string"> switch (prop_id)</span>
393
<span class="string"> {</span>
394
<span class="string"> case PROP_FILE:</span>
395
<span class="string"> g_value_set_object (value, tag_page_get_file (tag_page));</span>
396
<span class="string"> break;</span>
397
<span class="string"> default:</span>
398
<span class="string"> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);</span>
399
<span class="string"> break;</span>
400
<span class="string"> }</span>
401
<span class="string">}</span>
402
<span class="string">static void</span>
403
<span class="string">tag_page_set_property (GObject *object,</span>
404
<span class="string"> guint prop_id,</span>
405
<span class="string"> const GValue *value,</span>
406
<span class="string"> GParamSpec *pspec)</span>
407
<span class="string">{</span>
408
<span class="string"> TagPage *tag_page = TAG_PAGE (object);</span>
409
<span class="string"> switch (prop_id)</span>
410
<span class="string"> {</span>
411
<span class="string"> case PROP_FILE:</span>
412
<span class="string"> tag_page_set_file (tag_page, g_value_get_object (value));</span>
413
<span class="string"> break;</span>
414
<span class="string"> default:</span>
415
<span class="string"> G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);</span>
416
<span class="string"> break;</span>
417
<span class="string"> }</span>
418
<span class="string">}</span>
419
<span class="string">static void</span>
420
<span class="string">tag_page_file_changed (ThunarxFileInfo *file,</span>
421
<span class="string"> TagPage *tag_page)</span>
422
<span class="string">{</span>
423
<span class="string"> /* update your user interface elements in the tag_page</span>
424
<span class="string"> * to display the new state of the file...</span>
425
<span class="string"> */</span>
426
<span class="string">}</span>
427
<span class="string">GtkWidget*</span>
428
<span class="string">tag_page_new (ThunarxFileInfo *file)</span>
429
<span class="string">{</span>
430
<span class="string"> return g_object_new (TAG_TYPE_PAGE, "</span><span class="normal">file</span><span class="string">", file, NULL);</span>
431
<span class="string">}</span>
432
<span class="string">ThunarxFileInfo*</span>
433
<span class="string">tag_page_get_file (TagPage *tag_page)</span>
434
<span class="string">{</span>
435
<span class="string"> g_return_val_if_fail (TAG_IS_PAGE (tag_page), NULL);</span>
436
<span class="string"> return tag_page->file;</span>
437
<span class="string">}</span>
438
<span class="string">void</span>
439
<span class="string">tag_page_set_file (TagPage *tag_page,</span>
440
<span class="string"> ThunarxFileInfo *file)</span>
441
<span class="string">{</span>
442
<span class="string"> g_return_if_fail (TAG_IS_PAGE (tag_page));</span>
443
<span class="string"> g_return_if_fail (file == NULL || THUNARX_IS_FILE_INFO (file));</span>
444
<span class="string"> if (tag_page->file != NULL)</span>
445
<span class="string"> {</span>
446
<span class="string"> g_signal_handlers_disconnect_by_func (tag_page->file, tag_page_file_changed, tag_page);</span>
447
<span class="string"> g_object_unref (G_OBJECT (tag_page->file));</span>
448
<span class="string"> }</span>
449
<span class="string"> tag_page->file = file;</span>
450
<span class="string"> if (file != NULL)</span>
451
<span class="string"> {</span>
452
<span class="string"> g_object_ref (file);</span>
453
<span class="string"> tag_page_file_changed (file, tag_page);</span>
454
<span class="string"> g_signal_connect (file, "</span><span class="normal">changed</span><span class="string">", G_CALLBACK (tag_page_file_changed), tag_page);</span>
455
<span class="string"> }</span>
456
<span class="string"> g_object_notify (G_OBJECT (tag_page), "</span><span class="normal">file</span><span class="string">");</span>
457
<span class="string">}</span></pre></td>
286
464
If this seems to be too complicated to you, just don't follow the suggestion. But keep in mind, that
287
465
while the above solution is a little longer than a less structured solution, it yields great flexbility