source: trunk/third/libglade2/glade/glade-gtk.c @ 21576

Revision 21576, 42.0 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21575, which included commits to RCS files with non-trunk default branches.
Line 
1/* -*- Mode: C; c-basic-offset: 4 -*-
2 * libglade - a library for building interfaces from XML files at runtime
3 * Copyright (C) 1998-2002  James Henstridge <james@daa.com.au>
4 *
5 * glade-gtk.c: support for GTK+ widgets in libglade
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA  02111-1307, USA.
21 */
22#ifdef HAVE_CONFIG_H
23#  include <config.h>
24#endif
25
26#include <string.h>
27#include <stdlib.h>
28
29/* for GtkText et all */
30#ifndef GTK_ENABLE_BROKEN
31#define GTK_ENABLE_BROKEN
32#endif
33#ifdef GTK_DISABLE_DEPRECATED
34#undef GTK_DISABLE_DEPRECATED
35#endif
36#include <gtk/gtk.h>
37
38#include <glade/glade.h>
39#include <glade/glade-build.h>
40#include <glade/glade-private.h>
41
42#define INT(s)   (strtol ((s), NULL, 0))
43#define BOOL(s)  (g_ascii_tolower (*(s)) == 't' || g_ascii_tolower (*(s)) == 'y' || INT (s))
44#define FLOAT(s) (g_strtod ((s), NULL))
45
46void _glade_init_gtk_widgets(void);
47
48static void
49custom_noop (GladeXML *xml, GtkWidget *widget,
50             const char *name, const char *value)
51{
52    ;
53}
54
55static void
56set_visible(GladeXML *xml, GtkWidget *widget,
57            const gchar *prop_name, const gchar *prop_value)
58{
59    static GQuark visible_id = 0;
60
61    if (visible_id == 0)
62        visible_id = g_quark_from_static_string("Libglade::visible");
63
64    if (BOOL(prop_value))
65        g_object_set_qdata(G_OBJECT(widget), visible_id,GINT_TO_POINTER(TRUE));
66}
67
68static void
69set_tooltip(GladeXML *xml, GtkWidget *widget,
70            const gchar *prop_name, const gchar *prop_value)
71{
72    if (GTK_IS_TOOL_ITEM (widget))
73        gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (widget), xml->priv->tooltips,
74                                   prop_value, NULL);
75    else
76        gtk_tooltips_set_tip(xml->priv->tooltips, widget, prop_value, NULL);
77}
78
79static void
80set_has_default(GladeXML *xml, GtkWidget *widget,
81                const gchar *prop_name, const gchar *prop_value)
82{
83    if (BOOL(prop_value))
84        xml->priv->default_widget = widget;
85}
86
87static void
88set_has_focus(GladeXML *xml, GtkWidget *widget,
89              const gchar *prop_name, const gchar *prop_value)
90{
91    if (BOOL(prop_value))
92        xml->priv->focus_widget = widget;
93}
94
95static void
96pixmap_set_build_insensitive (GladeXML *xml, GtkWidget *w,
97                              const char *name, const char *value)
98{
99    gtk_pixmap_set_build_insensitive (GTK_PIXMAP (w), BOOL (value));
100}
101
102static void
103pixmap_set_filename (GladeXML *xml, GtkWidget *w,
104                     const char *name, const char *value)
105{
106    GdkPixbuf *pb;
107    char *file;
108    GdkPixmap *pixmap = NULL;
109    GdkBitmap *bitmap = NULL;
110    GdkColormap *cmap;
111   
112    file = glade_xml_relative_file (xml, value);
113    pb = gdk_pixbuf_new_from_file (file, NULL);
114    g_free (file);
115
116    if (!pb)
117        return;
118
119    cmap = gtk_widget_get_colormap (w);
120    gdk_pixbuf_render_pixmap_and_mask_for_colormap (pb, cmap, &pixmap, &bitmap, 127);
121    gtk_pixmap_set (GTK_PIXMAP (w), pixmap, bitmap);
122
123    if (pixmap) g_object_unref (pixmap);
124    if (bitmap) g_object_unref (bitmap);
125
126    g_object_unref (pb);
127}
128
129static void
130progress_set_format (GladeXML *xml, GtkWidget *w,
131                     const char *name, const char *value)
132{
133    gtk_progress_set_format_string (GTK_PROGRESS (w), value);
134}
135
136static void
137list_item_set_label (GladeXML *xml, GtkWidget *w,
138                     const char *name, const char *value)
139{
140    GtkWidget *child;
141
142    child = gtk_bin_get_child (GTK_BIN (w));
143    if (child)
144        gtk_container_remove (GTK_CONTAINER (w), child);
145   
146    /* copied from gtk_list_item_new_with_label() */
147    child = gtk_label_new (value);
148    gtk_misc_set_alignment (GTK_MISC (child), 0.0, 0.5);
149    gtk_misc_set_padding (GTK_MISC (child), 0, 1);
150
151    gtk_container_add (GTK_CONTAINER (w), child);
152    gtk_widget_show (child);
153}
154
155static void
156text_view_set_text (GladeXML *xml, GtkWidget *w,
157                    const char *name, const char *value)
158{
159    GtkTextBuffer *buffy;
160
161    buffy = gtk_text_buffer_new (NULL);
162    gtk_text_buffer_set_text (buffy, value, strlen (value));
163    gtk_text_view_set_buffer (GTK_TEXT_VIEW (w), buffy);
164    g_object_unref (G_OBJECT (buffy));
165}
166
167static void
168calendar_set_display_options (GladeXML *xml, GtkWidget *w,
169                              const char *name, const char *value)
170{
171    gtk_calendar_display_options (
172        GTK_CALENDAR (w),
173        glade_flags_from_string (GTK_TYPE_CALENDAR_DISPLAY_OPTIONS,
174                                 value));
175}
176
177static void
178clist_set_column_widths (GladeXML *xml, GtkWidget *w,
179                         const char *name, const char *value)
180{
181    char *pos = (char *)value;
182    int cols = 0;
183    while (pos && *pos) {
184        int width = strtol (pos, &pos, 10);
185        if (*pos == ',') pos++;
186        gtk_clist_set_column_width (GTK_CLIST (w), cols++, width);
187    }
188}
189
190static void
191clist_set_selection_mode (GladeXML *xml, GtkWidget *w,
192                          const char *name, const char *value)
193{
194    gtk_clist_set_selection_mode (
195        GTK_CLIST (w),
196        glade_enum_from_string (GTK_TYPE_SELECTION_MODE,
197                                value));
198}
199
200static void
201clist_set_shadow_type (GladeXML *xml, GtkWidget *w,
202                       const char *name, const char *value)
203{
204    gtk_clist_set_shadow_type (
205        GTK_CLIST (w),
206        glade_enum_from_string (GTK_TYPE_SHADOW_TYPE,
207                                value));
208}
209
210static void
211clist_set_show_titles (GladeXML *xml, GtkWidget *w,
212                       const char *name, const char *value)
213{
214    if (BOOL (value))
215        gtk_clist_column_titles_show (GTK_CLIST (w));
216    else
217        gtk_clist_column_titles_hide (GTK_CLIST (w));
218}
219
220static void
221tree_set_selection_mode (GladeXML *xml, GtkWidget *w,
222                         const char *name, const char *value)
223{
224    gtk_tree_set_selection_mode (
225        GTK_TREE (w),
226        glade_enum_from_string (GTK_TYPE_SELECTION_MODE, value));
227}
228
229static void
230tree_set_view_mode (GladeXML *xml, GtkWidget *w,
231                    const char *name, const char *value)
232{
233    gtk_tree_set_view_mode (
234        GTK_TREE (w),
235        glade_enum_from_string (GTK_TYPE_TREE_VIEW_MODE, value));
236}
237
238static void
239tree_set_view_line (GladeXML *xml, GtkWidget *w,
240                    const char *name, const char *value)
241{
242    gtk_tree_set_view_lines (GTK_TREE (w), BOOL (value));
243}
244
245static void
246list_set_selection_mode (GladeXML *xml, GtkWidget *w,
247                         const char *name, const char *value)
248{
249    gtk_list_set_selection_mode (
250        GTK_LIST (w),
251        glade_enum_from_string (GTK_TYPE_SELECTION_MODE, value));
252}
253
254static void
255check_menu_item_set_always_show_toggle (GladeXML *xml, GtkWidget *w,
256                                        const char *name, const char *value)
257{
258    gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (w), BOOL (value));
259}
260
261static void
262text_set_text (GladeXML *xml, GtkWidget *w,
263               const char *name, const char *value)
264{
265    int pos = 0;
266
267    gtk_editable_insert_text (GTK_EDITABLE (w), value, -1, &pos);
268}
269
270static void
271radio_menu_item_set_group (GladeXML *xml, GtkWidget *w,
272                           const char *name, const char *value)
273{
274    GtkWidget *group;
275
276    group = glade_xml_get_widget (xml, value);
277    if (!group) {
278        g_warning ("Radio button group %s could not be found", value);
279        return;
280    }
281
282    if (group == w) {
283        g_message ("Group is self, skipping.");
284        return;
285    }
286
287    gtk_radio_menu_item_set_group (
288        GTK_RADIO_MENU_ITEM (w),
289        gtk_radio_menu_item_get_group (
290            GTK_RADIO_MENU_ITEM (group)));
291}
292
293static void
294toolbar_set_tooltips (GladeXML *xml, GtkWidget *w,
295                      const char *name, const char *value)
296{
297    gtk_toolbar_set_tooltips (GTK_TOOLBAR (w), BOOL (value));
298}
299
300static void
301statusbar_set_has_resize_grip (GladeXML *xml, GtkWidget *w,
302                               const char *name, const char *value)
303{
304    gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (w), BOOL (value));
305}
306
307static void
308ruler_set_metric (GladeXML *xml, GtkWidget *w,
309                  const char *name, const char *value)
310{
311    gtk_ruler_set_metric (
312        GTK_RULER (w),
313        glade_enum_from_string (GTK_TYPE_METRIC_TYPE, value));
314}
315
316static void
317menu_item_set_label (GladeXML *xml, GtkWidget *w,
318                     const char *name, const char *value)
319{
320    GtkWidget *child = GTK_BIN (w)->child;
321
322    if (!child) {
323        child = gtk_accel_label_new("");
324        gtk_misc_set_alignment(GTK_MISC(child), 0.0, 0.5);
325        gtk_container_add(GTK_CONTAINER(w), child);
326        gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(child), w);
327        gtk_widget_show(child);
328    }
329
330    if (GTK_IS_LABEL (child))
331        gtk_label_set_text (GTK_LABEL (child), value);
332}
333
334static void
335menu_item_set_use_underline (GladeXML *xml, GtkWidget *w,
336                             const char *name, const char *value)
337{
338    GtkWidget *child = GTK_BIN (w)->child;
339
340    if (!child) {
341        child = gtk_accel_label_new("");
342        gtk_misc_set_alignment(GTK_MISC(child), 0.0, 0.5);
343        gtk_container_add(GTK_CONTAINER(w), child);
344        gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(child), w);
345        gtk_widget_show(child);
346    }
347
348    if (GTK_IS_LABEL (child))
349        gtk_label_set_use_underline (GTK_LABEL (child), BOOL (value));
350}
351
352static void
353menu_item_set_use_stock (GladeXML *xml, GtkWidget *w,
354                         const gchar *name, const gchar *value)
355{
356    GtkWidget *child = GTK_BIN (w)->child;
357
358    if (!child) {
359        child = gtk_accel_label_new("");
360        gtk_misc_set_alignment(GTK_MISC(child), 0.0, 0.5);
361        gtk_container_add(GTK_CONTAINER(w), child);
362        gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(child), w);
363        gtk_widget_show(child);
364    }
365
366    if (GTK_IS_LABEL (child) && BOOL(value)) {
367        const gchar *stock_id = gtk_label_get_label(GTK_LABEL(child));
368        GtkStockItem stock_item;
369
370        if (gtk_stock_lookup(stock_id, &stock_item)) {
371            /* put in the stock image next to the text.  Done before
372             * messing with the label child, so that stock_id doesn't
373             * become invalid. */
374            if (GTK_IS_IMAGE_MENU_ITEM(w)) {
375                GtkWidget *image =
376                    gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
377
378                gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(w), image);
379                gtk_widget_show(image);
380            }
381
382            gtk_label_set_text(GTK_LABEL(child), stock_item.label);
383            gtk_label_set_use_underline(GTK_LABEL(child), TRUE);
384
385            if (stock_item.keyval)
386                gtk_widget_add_accelerator (w,
387                                            "activate",
388                                            glade_xml_ensure_accel(xml),
389                                            stock_item.keyval,
390                                            stock_item.modifier,
391                                            GTK_ACCEL_VISIBLE);
392        } else {
393            g_warning("could not look up stock id '%s'", stock_id);
394        }
395    }
396}
397
398static void
399window_set_wmclass_name (GladeXML *xml, GtkWidget *w,
400                         const gchar *name, const gchar *value)
401{
402    GtkWindow *window = GTK_WINDOW(w);
403    gchar *wmclass = g_strdup(window->wmclass_class);
404
405    gtk_window_set_wmclass(window, value, wmclass);
406    g_free(wmclass);
407}
408
409static void
410window_set_wmclass_class (GladeXML *xml, GtkWidget *w,
411                          const gchar *name, const gchar *value)
412{
413    GtkWindow *window = GTK_WINDOW(w);
414    gchar *wmname = g_strdup(window->wmclass_name);
415
416    gtk_window_set_wmclass(window, wmname, value);
417    g_free(wmname);
418}
419
420static void
421entry_set_invisible_char (GladeXML *xml, GtkWidget *w,
422                          const gchar *name, const gchar *value)
423{
424    gtk_entry_set_invisible_char (GTK_ENTRY (w), value [0]);
425}
426
427static void
428button_set_response_id (GladeXML *xml, GtkWidget *w,
429                        const gchar *name, const gchar *value)
430{
431    g_object_set_data (G_OBJECT (w), "response_id",
432                       GINT_TO_POINTER (INT (value)));
433}
434
435static void
436toggle_tool_button_set_active (GladeXML *xml, GtkWidget *w,
437                               const char *name, const char *value)
438{
439    gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON (w),
440                                       BOOL (value));
441}
442
443static void
444tool_button_set_icon (GladeXML *xml, GtkWidget *w,
445                      const char *name, const char *value)
446{
447    GdkPixbuf *pb;
448    GtkWidget *image;
449    char *file;
450
451    file = glade_xml_relative_file (xml, value);
452    pb = gdk_pixbuf_new_from_file (file, NULL);
453    g_free (file);
454
455    if (!pb) {
456        g_warning ("Couldn't find image file: %s", value);
457        return;
458    }
459
460    image = gtk_image_new_from_pixbuf (pb);
461    g_object_unref (pb);
462
463    gtk_widget_show (image);
464    gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (w), image);
465}
466
467static void
468combo_box_set_items (GladeXML *xml, GtkWidget *w,
469                     const char *name, const char *value)
470{
471    GtkListStore *store;
472    GtkCellRenderer *cell;
473    gchar *items, *items_end, *item_start, *item_end;
474    GtkTreeIter iter;
475
476    /* If the "items" property is set, we create a simple model with just
477       one column of text. */
478    store = gtk_list_store_new (1, G_TYPE_STRING);
479    gtk_combo_box_set_model (GTK_COMBO_BOX (w), GTK_TREE_MODEL (store));
480
481    /* GtkComboBoxEntry creates the cell renderer itself, but we have to set
482       the column containing the text. */
483    if (GTK_IS_COMBO_BOX_ENTRY (w)) {
484        gtk_combo_box_entry_set_text_column (GTK_COMBO_BOX_ENTRY (w), 0);
485    } else {
486        cell = gtk_cell_renderer_text_new ();
487        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), cell, TRUE);
488        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), cell,
489                                        "text", 0,
490                                        NULL);
491    }
492
493    /* Now add the items one at a time. */
494    items = g_strdup (value);
495    items_end = &items[strlen (items)];
496    item_start = items;
497    while (item_start < items_end) {
498        item_end = strchr (item_start, '\n');
499        if (item_end == NULL)
500            item_end = items_end;
501        *item_end = '\0';
502
503        gtk_list_store_append (store, &iter);
504        gtk_list_store_set (store, &iter, 0, item_start, -1);
505
506        item_start = item_end + 1;
507    }
508    g_free (items);
509}
510
511static void
512menuitem_build_children(GladeXML *self, GtkWidget *w,
513                        GladeWidgetInfo *info)
514{
515    gint i;
516
517    g_object_ref(G_OBJECT(w));
518    for (i = 0; i < info->n_children; i++) {
519        GtkWidget       *child;
520        GladeWidgetInfo *childinfo = info->children[i].child;
521
522        if (info->children[i].internal_child) {
523            glade_xml_handle_internal_child(self, w, &info->children[i]);
524            continue;
525        }
526
527        child = glade_xml_build_widget(self, childinfo);
528
529        if (GTK_IS_MENU(child))
530            gtk_menu_item_set_submenu(GTK_MENU_ITEM(w), child);
531        else
532            gtk_container_add(GTK_CONTAINER(w), child);
533    }
534    g_object_unref(G_OBJECT(w));
535}
536
537static void
538gtk_dialog_build_children(GladeXML *self, GtkWidget *w,
539                          GladeWidgetInfo *info)
540
541{
542    GtkDialog *dialog = GTK_DIALOG (w);
543    GList *children, *list;
544
545    glade_standard_build_children (self, w, info);
546
547    if (dialog->action_area == NULL)
548        return;
549
550    /* repack children of action_area */
551    children = gtk_container_get_children(GTK_CONTAINER(dialog->action_area));
552    for (list = children; list; list = list->next) {
553        GtkWidget *child = GTK_WIDGET(list->data);
554
555        g_object_ref(child);
556        gtk_container_remove (GTK_CONTAINER (dialog->action_area), child);
557    }
558    for (list = children; list; list = list->next) {
559        GtkWidget *child = GTK_WIDGET(list->data);
560        gint response_id;
561
562        response_id = GPOINTER_TO_INT(g_object_steal_data(G_OBJECT(child),
563                                                          "response_id"));
564        gtk_dialog_add_action_widget(dialog, child, response_id);
565        g_object_unref(child);
566
567    }
568    g_list_free (children);
569}
570
571
572static void
573frame_build_children(GladeXML *self, GtkWidget *parent,
574                     GladeWidgetInfo *info)
575{
576    gint i, j;
577    enum {
578        FRAME_ITEM,
579        LABEL_ITEM
580    } type;
581
582    g_object_ref(G_OBJECT(parent));
583    for (i = 0; i < info->n_children; i++) {
584        GladeWidgetInfo *childinfo = info->children[i].child;
585        GtkWidget *child = glade_xml_build_widget(self, childinfo);
586
587        type = FRAME_ITEM;
588        /* there should really only be 2 children */
589        for (j = 0; j < info->children[i].n_properties; j++) {
590            if (!strcmp (info->children[i].properties[j].name, "type")) {
591                const char *value = info->children[i].properties[j].value;
592
593                if (!strcmp (value, "label_item"))
594                    type = LABEL_ITEM;
595                break;
596            }
597        }
598
599        if (type == LABEL_ITEM) {
600            gtk_frame_set_label_widget (GTK_FRAME (parent), child);
601        } else {
602            gtk_container_add (GTK_CONTAINER (parent), child);
603        }
604    }
605    g_object_unref(G_OBJECT(parent));
606}
607
608static void
609expander_build_children (GladeXML        *self,
610                         GtkWidget       *parent,
611                         GladeWidgetInfo *info)
612{
613    int i;
614
615    g_object_ref (parent);
616    for (i = 0; i < info->n_children; i++) {
617        GladeWidgetInfo *childinfo = info->children [i].child;
618        GtkWidget       *child;
619        gboolean         label_item = FALSE;
620        int              j;
621       
622        child = glade_xml_build_widget (self, childinfo);
623
624        /* there should really only be 2 children */
625        for (j = 0; j < info->children [i].n_properties; j++) {
626            if (!strcmp (info->children [i].properties[j].name, "type")) {
627                const char *value = info->children [i].properties [j].value;
628
629                if (!strcmp (value, "label_item"))
630                    label_item = TRUE;
631                break;
632            }
633        }
634
635        if (label_item)
636            gtk_expander_set_label_widget (GTK_EXPANDER (parent), child);
637        else
638            gtk_container_add (GTK_CONTAINER (parent), child);
639    }
640    g_object_unref (parent);
641}
642
643static void
644notebook_build_children(GladeXML *self, GtkWidget *parent,
645                        GladeWidgetInfo *info)
646{
647    gint i, j, tab = 0;
648    enum {
649        PANE_ITEM,
650        TAB_ITEM,
651        MENU_ITEM
652    } type;
653
654    g_object_ref(G_OBJECT(parent));
655    for (i = 0; i < info->n_children; i++) {
656        GladeWidgetInfo *childinfo = info->children[i].child;
657        GtkWidget *child = glade_xml_build_widget(self, childinfo);
658
659        type = PANE_ITEM;
660        for (j = 0; j < info->children[i].n_properties; j++) {
661            if (!strcmp (info->children[i].properties[j].name, "type")) {
662                const char *value = info->children[i].properties[j].value;
663
664                if (!strcmp (value, "tab"))
665                    type = TAB_ITEM;
666                break;
667            }
668        }
669
670        if (type == TAB_ITEM) { /* The GtkNotebook API blows */
671            GtkWidget *body;
672
673            body = gtk_notebook_get_nth_page (GTK_NOTEBOOK (parent), (tab - 1));
674            gtk_notebook_set_tab_label (GTK_NOTEBOOK (parent), body, child);
675        } else {
676            gtk_notebook_append_page (GTK_NOTEBOOK (parent), child, NULL);
677            tab++;
678        }
679    }
680    g_object_unref(G_OBJECT(parent));
681}
682
683static GtkWidget *
684build_preview (GladeXML *xml, GType widget_type,
685               GladeWidgetInfo *info)
686{
687    GtkWidget *preview;
688
689    GtkPreviewType type = GTK_PREVIEW_COLOR;
690    gboolean expand = TRUE;
691
692    int i;
693
694    for (i = 0; i < info->n_properties; i++) {
695        const char *name  = info->properties[i].name;
696        const char *value = info->properties[i].value;
697
698        if (!strcmp (name, "expand"))
699            expand = BOOL (value);
700        else if (!strcmp (name, "type"))
701            type = glade_enum_from_string (GTK_TYPE_PREVIEW_TYPE, value);
702    }
703
704    preview = gtk_preview_new (type);
705    gtk_preview_set_expand (GTK_PREVIEW (preview), expand);
706
707    return preview;
708}
709
710static void
711option_menu_build_children (GladeXML *xml, GtkWidget *parent,
712                            GladeWidgetInfo *info)
713{
714    int i, history = 0;
715
716    for (i = 0; i < info->n_children; i++) {
717        GtkWidget *child;
718        GladeWidgetInfo *childinfo = info->children[i].child;
719
720        if (strcmp(childinfo->classname, "GtkMenu") != 0) {
721            g_warning("the child of the option menu '%s' was not a GtkMenu",
722                      info->name);
723            continue;
724        }
725        child = glade_xml_build_widget(xml, childinfo);
726
727        gtk_option_menu_set_menu(GTK_OPTION_MENU(parent), child);
728    }
729
730    for (i = 0; i < info->n_properties; i++) {
731        const char *name  = info->properties[i].name;
732        const char *value = info->properties[i].value;
733
734        if (strcmp (name, "history"))
735            continue;
736
737        history = INT (value);
738        break;
739    }
740
741    /* we have to set the history *after* building the child menu */
742    gtk_option_menu_set_history (GTK_OPTION_MENU (parent), history);
743}
744
745static void
746clist_build_children(GladeXML *self, GtkWidget *parent,
747                     GladeWidgetInfo *info)
748{
749    int i;
750
751    g_object_ref (G_OBJECT (parent));
752    for (i = 0; i < info->n_children; i++) {
753        GladeWidgetInfo *childinfo;
754        GtkWidget *child = NULL;
755
756        childinfo = info->children[i].child;
757
758        /* treat GtkLabels specially */
759        if (!strcmp (childinfo->classname, "GtkLabel")) {
760            int j;
761            const char *label = NULL;
762
763            for (j = 0; j < childinfo->n_properties; j++) {
764                if (!strcmp (childinfo->properties[j].name, "label")) {
765                    label = childinfo->properties[j].value;
766                    break;
767                } else {
768                    g_warning ("Unknown CList child property: %s", childinfo->properties[j].name);
769                }
770            }
771
772            if (label) {
773                /* FIXME: translate ? */
774                gtk_clist_set_column_title (GTK_CLIST(parent), i, label);
775                child = gtk_clist_get_column_widget (GTK_CLIST (parent), i);
776                child = GTK_BIN(child)->child;
777                glade_xml_set_common_params(self, child, childinfo);
778            }
779        }
780
781        if (!child) {
782            child = glade_xml_build_widget (self, childinfo);
783            gtk_clist_set_column_widget (GTK_CLIST (parent), i, child);
784        }
785    }
786
787    g_object_unref (G_OBJECT (parent));
788}
789
790static void
791toolbar_build_children (GladeXML *xml, GtkWidget *parent,
792                        GladeWidgetInfo *info)
793{
794    int i;
795
796    g_object_ref (G_OBJECT (parent));
797
798    for (i = 0; i < info->n_children; i++) {
799        GladeChildInfo *childinfo;
800        GtkWidget *child = NULL;
801
802        childinfo = &info->children[i];
803
804        if (!strcmp (childinfo->child->classname, "toggle") ||
805            !strcmp (childinfo->child->classname, "radio") ||
806            !strcmp (childinfo->child->classname, "button")) {
807            const char *label = NULL, *stock = NULL, *group_name = NULL;
808            const char *tooltip = NULL;
809            char *icon = NULL;
810            gboolean use_stock = FALSE, active = FALSE, new_group = FALSE;
811            gboolean use_underline = FALSE;
812            GtkWidget *iconw = NULL;
813            int j;
814
815            for (j = 0; j < childinfo->child->n_properties; j++) {
816                const char *name  = childinfo->child->properties[j].name;
817                const char *value = childinfo->child->properties[j].value;
818
819                if (!strcmp (name, "label")) {
820                    label = value;
821                } else if (!strcmp (name, "use_stock")) {
822                    use_stock = TRUE;
823                } else if (!strcmp (name, "icon")) {
824                    g_free (icon);
825                    stock = NULL;
826                    icon = glade_xml_relative_file (xml, value);
827                } else if (!strcmp (name, "stock_pixmap")) {
828                    g_free (icon);
829                    icon = NULL;
830                    stock = value;
831                } else if (!strcmp (name, "active")) {
832                    active = BOOL (value);
833                } else  if (!strcmp (name, "group")) {
834                    group_name = value;
835                } else if (!strcmp (name, "new_group")) {
836                    new_group = BOOL (value);
837                } else if (!strcmp (name, "visible")) {
838                    /* ignore for now */
839                } else if (!strcmp (name, "tooltip")) {
840                    tooltip = value;
841                } else if (!strcmp (name, "use_underline")) {
842                    use_underline = BOOL (value);
843                } else if (!strcmp (name, "inconsistent")) {
844                    /* ignore for now */
845                } else {
846                    g_warning ("Unknown GtkToolbar child property: %s", name);
847                }
848            }
849
850            /* For stock items, we create the stock icon and get the label
851               here, partly because GTK+ doesn't have direct support for stock
852               toggle & radio items. */
853            if (use_stock) {
854                stock = label;
855                label = NULL;
856            }
857
858            if (stock) {
859                iconw = gtk_image_new_from_stock (
860                    stock, GTK_TOOLBAR (parent)->icon_size);
861                if (!iconw)
862                    g_warning ("Could not create stock item: %s", stock);
863            } else if (icon) {
864                iconw = gtk_image_new_from_file (icon);
865                g_free (icon);
866            }
867
868            if (iconw)
869                gtk_widget_show (iconw);
870
871            if (new_group)
872                gtk_toolbar_append_space (GTK_TOOLBAR (parent));
873
874            /* FIXME: these should be translated */
875            if (!strcmp (childinfo->child->classname, "toggle")) {
876                child = gtk_toolbar_append_element (
877                    GTK_TOOLBAR (parent),
878                    GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL,
879                    label, tooltip, NULL, iconw, NULL, NULL);
880                gtk_toggle_button_set_active
881                    (GTK_TOGGLE_BUTTON (child), active);
882            } else if (!strcmp (childinfo->child->classname, "radio")) {
883                child = gtk_toolbar_append_element (
884                    GTK_TOOLBAR (parent),
885                    GTK_TOOLBAR_CHILD_RADIOBUTTON, NULL,
886                    label, tooltip, NULL, iconw, NULL, NULL);
887
888                if (group_name) {
889                    g_object_set (G_OBJECT (child),
890                                  "group", glade_xml_get_widget (xml, group_name),
891                                  NULL);
892                }
893                gtk_toggle_button_set_active
894                    (GTK_TOGGLE_BUTTON (child), active);
895            } else
896                child = gtk_toolbar_append_item (
897                    GTK_TOOLBAR (parent),
898                    label, tooltip, NULL, iconw, NULL, NULL);
899           
900            /* GTK+ doesn't support use_underline directly, so we have to hack
901               it. */
902            if (use_underline) {
903                GList *elem = g_list_last (GTK_TOOLBAR (parent)->children);
904                GtkToolbarChild *toolbar_child = elem->data;
905                gtk_label_set_use_underline (GTK_LABEL (toolbar_child->label),
906                                             TRUE);
907            }
908
909            glade_xml_set_common_params (xml, child, childinfo->child);
910        } else {
911            child = glade_xml_build_widget (xml, childinfo->child);
912
913            if (GTK_IS_TOOL_ITEM (child))
914                gtk_toolbar_insert (GTK_TOOLBAR (parent), GTK_TOOL_ITEM (child), -1);
915            else
916                gtk_toolbar_append_widget (GTK_TOOLBAR (parent), child, NULL, NULL);
917        }
918    }
919}
920
921static void
922paned_build_children (GladeXML *xml, GtkWidget *w, GladeWidgetInfo *info)
923{
924    int i;
925    GtkWidget *child;
926    gboolean resize, shrink;
927    GladeChildInfo *cinfo;
928
929    if (info->n_children == 0)
930        return;
931   
932    cinfo = &info->children[0];
933    child = glade_xml_build_widget (xml, cinfo->child);
934   
935    resize = FALSE; shrink = TRUE;
936    for (i = 0; i < cinfo->n_properties; i++) {
937        const char *name  = cinfo->properties[i].name;
938        const char *value = cinfo->properties[i].value;
939
940        if (!strcmp (name, "resize"))
941            resize = BOOL (value);
942        else if (!strcmp (name, "shrink"))
943            shrink = BOOL (value);
944        else
945            g_warning ("Unknown GtkPaned child property: %s", name);
946    }
947
948    gtk_paned_pack1 (GTK_PANED(w), child, resize, shrink);
949   
950    if (info->n_children == 1)
951        return;
952
953    cinfo = &info->children[1];
954    child = glade_xml_build_widget (xml, cinfo->child);
955    resize = TRUE; shrink = TRUE;
956
957    for (i = 0; i < cinfo->n_properties; i++) {
958        const char *name  = cinfo->properties[i].name;
959        const char *value = cinfo->properties[i].value;
960
961        if (!strcmp (name, "resize"))
962            resize = BOOL (value);
963        else if (!strcmp (name, "shrink"))
964            shrink = BOOL (value);
965        else
966            g_warning ("Unknown GtkPaned child property: %s", name);
967    }
968       
969    gtk_paned_pack2 (GTK_PANED(w), child, resize, shrink);
970}
971
972static void
973layout_build_children (GladeXML *xml, GtkWidget *w, GladeWidgetInfo *info)
974{
975    gint i;
976
977    for (i = 0; i < info->n_children; i++) {
978        GladeWidgetInfo *childinfo = info->children[i].child;
979        GtkWidget *child = NULL;
980        gint j, x = 0, y = 0;
981
982        if (info->children[i].internal_child) {
983            glade_xml_handle_internal_child(xml, w, &info->children[i]);
984            continue;
985        }
986
987        child = glade_xml_build_widget(xml, childinfo);
988        for (j = 0; j < info->children[i].n_properties; j++) {
989            const gchar *name = info->children[i].properties[j].name;
990            const gchar *value = info->children[i].properties[j].value;
991
992            if (name[0] == 'x' && name[1] == '\0')
993                x = INT(value);
994            else if (name[0] == 'y' && name[1] == '\0')
995                y = INT(value);
996            else
997                g_warning("unknown child packing property %s for GtkLayout",
998                          name);
999        }
1000
1001        gtk_layout_put(GTK_LAYOUT(w), child, x, y);
1002    }
1003}
1004
1005static GtkWidget *
1006dialog_find_internal_child(GladeXML *xml, GtkWidget *parent,
1007                           const gchar *childname)
1008{
1009    if (!strcmp(childname, "vbox"))
1010        return GTK_DIALOG(parent)->vbox;
1011    if (!strcmp(childname, "action_area"))
1012        return GTK_DIALOG(parent)->action_area;
1013
1014    return NULL;
1015}
1016
1017static GtkWidget *
1018image_menu_find_internal_child(GladeXML *xml, GtkWidget *parent,
1019                               const gchar *childname)
1020{
1021    if (!strcmp(childname, "image")) {
1022        GtkWidget *pl;
1023
1024        pl = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (parent));
1025        if (!pl) {
1026            pl = gtk_image_new ();
1027
1028            gtk_image_menu_item_set_image (
1029                GTK_IMAGE_MENU_ITEM (parent), pl);
1030        }
1031
1032        return pl;
1033    }
1034    return NULL;
1035}
1036
1037static GtkWidget *
1038scrolled_window_find_internal_child(GladeXML *xml, GtkWidget *parent,
1039                                    const gchar *childname)
1040{
1041    if (!strcmp(childname, "vscrollbar"))
1042        return GTK_SCROLLED_WINDOW (parent)->vscrollbar;
1043    if (!strcmp(childname, "hscrollbar"))
1044        return GTK_SCROLLED_WINDOW (parent)->hscrollbar;
1045    return NULL;
1046}
1047
1048static GtkWidget *
1049filesel_find_internal_child(GladeXML *xml, GtkWidget *parent,
1050                            const gchar *childname)
1051{
1052    if (!strcmp(childname, "vbox"))
1053        return GTK_DIALOG(parent)->vbox;
1054    if (!strcmp(childname, "action_area"))
1055        return GTK_DIALOG(parent)->action_area;
1056    if (!strcmp(childname, "ok_button"))
1057        return GTK_FILE_SELECTION(parent)->ok_button;
1058    if (!strcmp(childname, "cancel_button"))
1059        return GTK_FILE_SELECTION(parent)->cancel_button;
1060    if (!strcmp(childname, "help_button"))
1061        return GTK_FILE_SELECTION(parent)->help_button;
1062    return NULL;
1063}
1064
1065static GtkWidget *
1066colorseldlg_find_internal_child(GladeXML *xml, GtkWidget *parent,
1067                                const gchar *childname)
1068{
1069    if (!strcmp(childname, "vbox"))
1070        return GTK_DIALOG(parent)->vbox;
1071    if (!strcmp(childname, "action_area"))
1072        return GTK_DIALOG(parent)->action_area;
1073    if (!strcmp(childname, "ok_button"))
1074        return GTK_COLOR_SELECTION_DIALOG(parent)->ok_button;
1075    if (!strcmp(childname, "cancel_button"))
1076        return GTK_COLOR_SELECTION_DIALOG(parent)->cancel_button;
1077    if (!strcmp(childname, "help_button"))
1078        return GTK_COLOR_SELECTION_DIALOG(parent)->help_button;
1079    if (!strcmp(childname, "color_selection"))
1080        return GTK_COLOR_SELECTION_DIALOG(parent)->colorsel;
1081    return NULL;
1082}
1083
1084static GtkWidget *
1085fontseldlg_find_internal_child(GladeXML *xml, GtkWidget *parent,
1086                               const gchar *childname)
1087{
1088    if (!strcmp(childname, "vbox"))
1089        return GTK_DIALOG(parent)->vbox;
1090    if (!strcmp(childname, "action_area"))
1091        return GTK_DIALOG(parent)->action_area;
1092    if (!strcmp(childname, "ok_button"))
1093        return GTK_FONT_SELECTION_DIALOG(parent)->ok_button;
1094    if (!strcmp(childname, "cancel_button"))
1095        return GTK_FONT_SELECTION_DIALOG(parent)->cancel_button;
1096    if (!strcmp(childname, "apply_button"))
1097        return GTK_FONT_SELECTION_DIALOG(parent)->apply_button;
1098    if (!strcmp(childname, "font_selection"))
1099        return GTK_FONT_SELECTION_DIALOG(parent)->fontsel;
1100    return NULL;
1101}
1102
1103static GtkWidget *
1104combo_find_internal_child(GladeXML *xml, GtkWidget *parent,
1105                          const gchar *childname)
1106{
1107    if (!strcmp(childname, "entry"))
1108        return GTK_COMBO(parent)->entry;
1109    if (!strcmp(childname, "button"))
1110        return GTK_COMBO(parent)->button;
1111    if (!strcmp(childname, "popup"))
1112        return GTK_COMBO(parent)->popup;
1113    if (!strcmp(childname, "popwin"))
1114        return GTK_COMBO(parent)->popwin;
1115    if (!strcmp(childname, "list"))
1116        return GTK_COMBO(parent)->list;
1117    return NULL;
1118}
1119
1120static GtkWidget *
1121combo_box_entry_find_internal_child(GladeXML *xml, GtkWidget *parent,
1122                                    const gchar *childname)
1123{
1124    if (!strcmp(childname, "entry"))
1125        return gtk_bin_get_child(GTK_BIN(parent));
1126    return NULL;
1127}
1128
1129void
1130_glade_init_gtk_widgets(void)
1131{
1132    glade_register_custom_prop (GTK_TYPE_WIDGET, "visible", set_visible);
1133    glade_register_custom_prop (GTK_TYPE_WIDGET, "tooltip", set_tooltip);
1134    glade_register_custom_prop (GTK_TYPE_WIDGET, "has_default", set_has_default);
1135    glade_register_custom_prop (GTK_TYPE_WIDGET, "has_focus", set_has_focus);
1136
1137    glade_register_custom_prop (GTK_TYPE_PIXMAP, "build_insensitive", pixmap_set_build_insensitive);
1138    glade_register_custom_prop (GTK_TYPE_PIXMAP, "filename", pixmap_set_filename);
1139    glade_register_custom_prop (GTK_TYPE_PROGRESS, "format", progress_set_format);
1140    glade_register_custom_prop (GTK_TYPE_OPTION_MENU, "history", custom_noop);
1141    glade_register_custom_prop (GTK_TYPE_TEXT_VIEW, "text", text_view_set_text);
1142    glade_register_custom_prop (GTK_TYPE_CALENDAR, "display_options", calendar_set_display_options);
1143    glade_register_custom_prop (GTK_TYPE_CLIST, "column_widths", clist_set_column_widths);
1144    glade_register_custom_prop (GTK_TYPE_CLIST, "selection_mode", clist_set_selection_mode);
1145    glade_register_custom_prop (GTK_TYPE_CLIST, "shadow_type", clist_set_shadow_type);
1146    glade_register_custom_prop (GTK_TYPE_CLIST, "show_titles", clist_set_show_titles);
1147    glade_register_custom_prop (GTK_TYPE_TREE, "selection_mode", tree_set_selection_mode);
1148    glade_register_custom_prop (GTK_TYPE_TREE, "view_mode", tree_set_view_mode);
1149    glade_register_custom_prop (GTK_TYPE_TREE, "view_line", tree_set_view_line);
1150    glade_register_custom_prop (GTK_TYPE_LIST, "selection_mode", list_set_selection_mode);
1151    glade_register_custom_prop (GTK_TYPE_CHECK_MENU_ITEM, "always_show_toggle",
1152                                check_menu_item_set_always_show_toggle);
1153    glade_register_custom_prop (GTK_TYPE_TEXT, "text", text_set_text);
1154    glade_register_custom_prop (GTK_TYPE_RADIO_MENU_ITEM, "group",
1155                                radio_menu_item_set_group);
1156    glade_register_custom_prop (GTK_TYPE_TOOLBAR, "tooltips", toolbar_set_tooltips);
1157    glade_register_custom_prop (GTK_TYPE_STATUSBAR, "has_resize_grip", statusbar_set_has_resize_grip);
1158    glade_register_custom_prop (GTK_TYPE_RULER, "metric", ruler_set_metric);
1159    glade_register_custom_prop (GTK_TYPE_MENU_ITEM, "label", menu_item_set_label);
1160    glade_register_custom_prop (GTK_TYPE_MENU_ITEM, "use_underline", menu_item_set_use_underline);
1161    glade_register_custom_prop (GTK_TYPE_MENU_ITEM, "use_stock", menu_item_set_use_stock);
1162    glade_register_custom_prop (GTK_TYPE_WINDOW, "wmclass_name", window_set_wmclass_name);
1163    glade_register_custom_prop (GTK_TYPE_WINDOW, "wmclass_class", window_set_wmclass_class);
1164    glade_register_custom_prop (GTK_TYPE_LIST_ITEM, "label", list_item_set_label);
1165    glade_register_custom_prop (GTK_TYPE_BUTTON, "response_id", button_set_response_id);
1166    glade_register_custom_prop (GTK_TYPE_ENTRY, "invisible_char", entry_set_invisible_char);
1167    glade_register_custom_prop (GTK_TYPE_TOGGLE_TOOL_BUTTON, "active", toggle_tool_button_set_active);
1168    glade_register_custom_prop (GTK_TYPE_TOOL_BUTTON, "icon", tool_button_set_icon);
1169    glade_register_custom_prop (GTK_TYPE_COMBO_BOX, "items", combo_box_set_items);
1170
1171    glade_register_widget (GTK_TYPE_ACCEL_LABEL, glade_standard_build_widget,
1172                           NULL, NULL);
1173    glade_register_widget (GTK_TYPE_ALIGNMENT, glade_standard_build_widget,
1174                           glade_standard_build_children, NULL);
1175    glade_register_widget (GTK_TYPE_ARROW, glade_standard_build_widget,
1176                           NULL, NULL);
1177    glade_register_widget (GTK_TYPE_ASPECT_FRAME, glade_standard_build_widget,
1178                           frame_build_children, NULL);
1179    glade_register_widget (GTK_TYPE_BUTTON, glade_standard_build_widget,
1180                           glade_standard_build_children, NULL);
1181    glade_register_widget (GTK_TYPE_CALENDAR, glade_standard_build_widget,
1182                           NULL, NULL);
1183    glade_register_widget (GTK_TYPE_CHECK_BUTTON, glade_standard_build_widget,
1184                           glade_standard_build_children, NULL);
1185    glade_register_widget (GTK_TYPE_CHECK_MENU_ITEM, glade_standard_build_widget,
1186                           menuitem_build_children, NULL);
1187    glade_register_widget (GTK_TYPE_CLIST, glade_standard_build_widget,
1188                           clist_build_children, NULL);
1189    glade_register_widget (GTK_TYPE_COLOR_BUTTON, glade_standard_build_widget,
1190                           NULL, NULL);
1191    glade_register_widget (GTK_TYPE_COLOR_SELECTION, glade_standard_build_widget,
1192                           NULL, NULL);
1193    glade_register_widget (GTK_TYPE_COLOR_SELECTION_DIALOG, NULL,
1194                           glade_standard_build_children, colorseldlg_find_internal_child);
1195    glade_register_widget (GTK_TYPE_COMBO, glade_standard_build_widget,
1196                           glade_standard_build_children, combo_find_internal_child);
1197    glade_register_widget (GTK_TYPE_COMBO_BOX, glade_standard_build_widget,
1198                           NULL, NULL);
1199    glade_register_widget (GTK_TYPE_COMBO_BOX_ENTRY, glade_standard_build_widget,
1200                           glade_standard_build_children, combo_box_entry_find_internal_child);
1201    glade_register_widget (GTK_TYPE_CTREE, glade_standard_build_widget,
1202                           clist_build_children, NULL);
1203    glade_register_widget (GTK_TYPE_CURVE, glade_standard_build_widget,
1204                           NULL, NULL);
1205    glade_register_widget (GTK_TYPE_DIALOG, NULL,
1206                           gtk_dialog_build_children, dialog_find_internal_child);
1207    glade_register_widget (GTK_TYPE_DRAWING_AREA, glade_standard_build_widget,
1208                           NULL, NULL);
1209    glade_register_widget (GTK_TYPE_ENTRY, glade_standard_build_widget,
1210                           NULL, NULL);
1211    glade_register_widget (GTK_TYPE_EVENT_BOX, glade_standard_build_widget,
1212                           glade_standard_build_children, NULL);
1213    glade_register_widget (GTK_TYPE_EXPANDER, glade_standard_build_widget,
1214                           expander_build_children, NULL);
1215    glade_register_widget (GTK_TYPE_FILE_CHOOSER, glade_standard_build_widget,
1216                           NULL, NULL);
1217    glade_register_widget (GTK_TYPE_FILE_CHOOSER_DIALOG, glade_standard_build_widget,
1218                           gtk_dialog_build_children, dialog_find_internal_child);
1219    glade_register_widget (GTK_TYPE_FILE_SELECTION, NULL,
1220                           glade_standard_build_children, filesel_find_internal_child);
1221    glade_register_widget (GTK_TYPE_FIXED, glade_standard_build_widget,
1222                           glade_standard_build_children, NULL);
1223    glade_register_widget (GTK_TYPE_FONT_BUTTON, glade_standard_build_widget,
1224                           NULL, NULL);
1225    glade_register_widget (GTK_TYPE_FONT_SELECTION, glade_standard_build_widget,
1226                           NULL, NULL);
1227    glade_register_widget (GTK_TYPE_FONT_SELECTION_DIALOG, NULL,
1228                           glade_standard_build_children, fontseldlg_find_internal_child);
1229    glade_register_widget (GTK_TYPE_FRAME, glade_standard_build_widget,
1230                           frame_build_children, NULL);
1231    glade_register_widget (GTK_TYPE_GAMMA_CURVE, glade_standard_build_widget,
1232                           NULL, NULL);
1233    glade_register_widget (GTK_TYPE_HANDLE_BOX, glade_standard_build_widget,
1234                           glade_standard_build_children, NULL);
1235    glade_register_widget (GTK_TYPE_HBUTTON_BOX, glade_standard_build_widget,
1236                           glade_standard_build_children, NULL);
1237    glade_register_widget (GTK_TYPE_HBOX, glade_standard_build_widget,
1238                           glade_standard_build_children, NULL);
1239    glade_register_widget (GTK_TYPE_HPANED, glade_standard_build_widget,
1240                           paned_build_children, NULL);
1241    glade_register_widget (GTK_TYPE_HRULER, glade_standard_build_widget,
1242                           NULL, NULL);
1243    glade_register_widget (GTK_TYPE_HSCALE, glade_standard_build_widget,
1244                           NULL, NULL);
1245    glade_register_widget (GTK_TYPE_HSCROLLBAR, glade_standard_build_widget,
1246                           NULL, NULL);
1247    glade_register_widget (GTK_TYPE_HSEPARATOR, glade_standard_build_widget,
1248                           NULL, NULL);
1249    glade_register_widget (GTK_TYPE_IMAGE, glade_standard_build_widget,
1250                           NULL, NULL);
1251    glade_register_widget (GTK_TYPE_IMAGE_MENU_ITEM, glade_standard_build_widget,
1252                           menuitem_build_children, image_menu_find_internal_child);
1253    glade_register_widget (GTK_TYPE_INPUT_DIALOG, NULL,
1254                           glade_standard_build_children, NULL);
1255    glade_register_widget (GTK_TYPE_LABEL, glade_standard_build_widget,
1256                           NULL, NULL);
1257    glade_register_widget (GTK_TYPE_LAYOUT, glade_standard_build_widget,
1258                           layout_build_children, NULL);
1259    glade_register_widget (GTK_TYPE_LIST, glade_standard_build_widget,
1260                           glade_standard_build_children, NULL);
1261    glade_register_widget (GTK_TYPE_LIST_ITEM, glade_standard_build_widget,
1262                           glade_standard_build_children, NULL);
1263    glade_register_widget (GTK_TYPE_MENU, glade_standard_build_widget,
1264                           glade_standard_build_children, NULL);
1265    glade_register_widget (GTK_TYPE_MENU_BAR, glade_standard_build_widget,
1266                           glade_standard_build_children, NULL);
1267    glade_register_widget (GTK_TYPE_MENU_ITEM, glade_standard_build_widget,
1268                           menuitem_build_children, NULL);
1269    glade_register_widget (GTK_TYPE_MESSAGE_DIALOG, NULL,
1270                           glade_standard_build_children, NULL);
1271    glade_register_widget (GTK_TYPE_NOTEBOOK, glade_standard_build_widget,
1272                           notebook_build_children, NULL);
1273    glade_register_widget (GTK_TYPE_OPTION_MENU, glade_standard_build_widget,
1274                           option_menu_build_children, NULL);
1275    glade_register_widget (GTK_TYPE_PIXMAP, glade_standard_build_widget,
1276                           NULL, NULL);
1277#ifdef HAVE_GTK_PLUG
1278    glade_register_widget (GTK_TYPE_PLUG, NULL,
1279                           NULL, NULL);
1280#endif
1281    glade_register_widget (GTK_TYPE_PREVIEW, build_preview,
1282                           NULL, NULL);
1283    glade_register_widget (GTK_TYPE_PROGRESS, glade_standard_build_widget,
1284                           NULL, NULL);
1285    glade_register_widget (GTK_TYPE_PROGRESS_BAR, glade_standard_build_widget,
1286                           NULL, NULL);
1287    glade_register_widget (GTK_TYPE_RADIO_BUTTON, glade_standard_build_widget,
1288                           glade_standard_build_children, NULL);
1289    glade_register_widget (GTK_TYPE_RADIO_MENU_ITEM, glade_standard_build_widget,
1290                           menuitem_build_children, NULL);
1291    glade_register_widget (GTK_TYPE_RADIO_TOOL_BUTTON, glade_standard_build_widget,
1292                           NULL, NULL);
1293    glade_register_widget (GTK_TYPE_SCROLLED_WINDOW, glade_standard_build_widget,
1294                           glade_standard_build_children,
1295                           scrolled_window_find_internal_child);
1296    glade_register_widget (GTK_TYPE_SEPARATOR_MENU_ITEM, glade_standard_build_widget,
1297                           NULL, NULL);
1298    glade_register_widget (GTK_TYPE_SEPARATOR_TOOL_ITEM, glade_standard_build_widget,
1299                           NULL, NULL);
1300#ifdef HAVE_GTK_PLUG
1301    glade_register_widget (GTK_TYPE_SOCKET, glade_standard_build_widget,
1302                           NULL, NULL);
1303#endif
1304    glade_register_widget (GTK_TYPE_SPIN_BUTTON, glade_standard_build_widget,
1305                           NULL, NULL);
1306    glade_register_widget (GTK_TYPE_STATUSBAR, glade_standard_build_widget,
1307                           NULL, NULL);
1308    glade_register_widget (GTK_TYPE_TABLE, glade_standard_build_widget,
1309                           glade_standard_build_children, NULL);
1310    glade_register_widget (GTK_TYPE_TEAROFF_MENU_ITEM, glade_standard_build_widget,
1311                           NULL, NULL);
1312    glade_register_widget (GTK_TYPE_TEXT, glade_standard_build_widget,
1313                           NULL, NULL);
1314    glade_register_widget (GTK_TYPE_TEXT_VIEW, glade_standard_build_widget,
1315                           NULL, NULL);
1316    glade_register_widget (GTK_TYPE_TIPS_QUERY, glade_standard_build_widget,
1317                           NULL, NULL);
1318    glade_register_widget (GTK_TYPE_TOGGLE_BUTTON, glade_standard_build_widget,
1319                           glade_standard_build_children, NULL);
1320    glade_register_widget (GTK_TYPE_TOGGLE_TOOL_BUTTON, glade_standard_build_widget,
1321                           NULL, NULL);
1322    glade_register_widget (GTK_TYPE_TOOLBAR, glade_standard_build_widget,
1323                           toolbar_build_children, NULL);
1324    glade_register_widget (GTK_TYPE_TOOL_ITEM, glade_standard_build_widget,
1325                           glade_standard_build_children, NULL);
1326    glade_register_widget (GTK_TYPE_TOOL_BUTTON, glade_standard_build_widget,
1327                           NULL, NULL);
1328    glade_register_widget (GTK_TYPE_TREE, glade_standard_build_widget,
1329                           NULL, NULL);
1330    glade_register_widget (GTK_TYPE_TREE_VIEW, glade_standard_build_widget,
1331                           NULL, NULL);
1332    glade_register_widget (GTK_TYPE_VBUTTON_BOX, glade_standard_build_widget,
1333                           glade_standard_build_children, NULL);
1334    glade_register_widget (GTK_TYPE_VBOX, glade_standard_build_widget,
1335                           glade_standard_build_children, NULL);
1336    glade_register_widget (GTK_TYPE_VPANED, glade_standard_build_widget,
1337                           paned_build_children, NULL);
1338    glade_register_widget (GTK_TYPE_VRULER, glade_standard_build_widget,
1339                           NULL, NULL);
1340    glade_register_widget (GTK_TYPE_VSCALE, glade_standard_build_widget,
1341                           NULL, NULL);
1342    glade_register_widget (GTK_TYPE_VSCROLLBAR, glade_standard_build_widget,
1343                           NULL, NULL);
1344    glade_register_widget (GTK_TYPE_VSEPARATOR, glade_standard_build_widget,
1345                           NULL, NULL);
1346    glade_register_widget (GTK_TYPE_VIEWPORT, glade_standard_build_widget,
1347                           glade_standard_build_children, NULL);
1348    glade_register_widget (GTK_TYPE_WINDOW, NULL,
1349                           glade_standard_build_children, NULL);
1350
1351    glade_provide("gtk");
1352}
Note: See TracBrowser for help on using the repository browser.