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 | |
---|
46 | void _glade_init_gtk_widgets(void); |
---|
47 | |
---|
48 | static void |
---|
49 | custom_noop (GladeXML *xml, GtkWidget *widget, |
---|
50 | const char *name, const char *value) |
---|
51 | { |
---|
52 | ; |
---|
53 | } |
---|
54 | |
---|
55 | static void |
---|
56 | set_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 | |
---|
68 | static void |
---|
69 | set_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 | |
---|
79 | static void |
---|
80 | set_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 | |
---|
87 | static void |
---|
88 | set_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 | |
---|
95 | static void |
---|
96 | pixmap_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 | |
---|
102 | static void |
---|
103 | pixmap_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 | |
---|
129 | static void |
---|
130 | progress_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 | |
---|
136 | static void |
---|
137 | list_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 | |
---|
155 | static void |
---|
156 | text_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 | |
---|
167 | static void |
---|
168 | calendar_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 | |
---|
177 | static void |
---|
178 | clist_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 | |
---|
190 | static void |
---|
191 | clist_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 | |
---|
200 | static void |
---|
201 | clist_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 | |
---|
210 | static void |
---|
211 | clist_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 | |
---|
220 | static void |
---|
221 | tree_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 | |
---|
229 | static void |
---|
230 | tree_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 | |
---|
238 | static void |
---|
239 | tree_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 | |
---|
245 | static void |
---|
246 | list_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 | |
---|
254 | static void |
---|
255 | check_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 | |
---|
261 | static void |
---|
262 | text_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 | |
---|
270 | static void |
---|
271 | radio_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 | |
---|
293 | static void |
---|
294 | toolbar_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 | |
---|
300 | static void |
---|
301 | statusbar_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 | |
---|
307 | static void |
---|
308 | ruler_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 | |
---|
316 | static void |
---|
317 | menu_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 | |
---|
334 | static void |
---|
335 | menu_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 | |
---|
352 | static void |
---|
353 | menu_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 | |
---|
398 | static void |
---|
399 | window_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 | |
---|
409 | static void |
---|
410 | window_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 | |
---|
420 | static void |
---|
421 | entry_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 | |
---|
427 | static void |
---|
428 | button_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 | |
---|
435 | static void |
---|
436 | toggle_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 | |
---|
443 | static void |
---|
444 | tool_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 | |
---|
467 | static void |
---|
468 | combo_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 | |
---|
511 | static void |
---|
512 | menuitem_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 | |
---|
537 | static void |
---|
538 | gtk_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 | |
---|
572 | static void |
---|
573 | frame_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 | |
---|
608 | static void |
---|
609 | expander_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 | |
---|
643 | static void |
---|
644 | notebook_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 | |
---|
683 | static GtkWidget * |
---|
684 | build_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 | |
---|
710 | static void |
---|
711 | option_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 | |
---|
745 | static void |
---|
746 | clist_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 | |
---|
790 | static void |
---|
791 | toolbar_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 | |
---|
921 | static void |
---|
922 | paned_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 | |
---|
972 | static void |
---|
973 | layout_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 | |
---|
1005 | static GtkWidget * |
---|
1006 | dialog_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 | |
---|
1017 | static GtkWidget * |
---|
1018 | image_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 | |
---|
1037 | static GtkWidget * |
---|
1038 | scrolled_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 | |
---|
1048 | static GtkWidget * |
---|
1049 | filesel_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 | |
---|
1065 | static GtkWidget * |
---|
1066 | colorseldlg_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 | |
---|
1084 | static GtkWidget * |
---|
1085 | fontseldlg_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 | |
---|
1103 | static GtkWidget * |
---|
1104 | combo_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 | |
---|
1120 | static GtkWidget * |
---|
1121 | combo_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 | |
---|
1129 | void |
---|
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 | } |
---|