]> Pileus Git - ~andy/gtk/blob - docs/tools/widgets.c
Merge branch 'master' into broadway
[~andy/gtk] / docs / tools / widgets.c
1 #include "config.h"
2
3 #include <gtk/gtkunixprint.h>
4 #include <gdk/gdkkeysyms.h>
5 #include <X11/Xatom.h>
6 #include <gdkx.h>
7 #include "widgets.h"
8
9 #define SMALL_WIDTH  240
10 #define SMALL_HEIGHT 75
11 #define MEDIUM_WIDTH 240
12 #define MEDIUM_HEIGHT 165
13 #define LARGE_WIDTH 240
14 #define LARGE_HEIGHT 240
15
16 static Window
17 find_toplevel_window (Window xid)
18 {
19   Window root, parent, *children;
20   guint nchildren;
21
22   do
23     {
24       if (XQueryTree (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xid, &root,
25                       &parent, &children, &nchildren) == 0)
26         {
27           g_warning ("Couldn't find window manager window");
28           return None;
29         }
30
31       if (root == parent)
32         return xid;
33
34       xid = parent;
35     }
36   while (TRUE);
37 }
38
39
40 static gboolean
41 adjust_size_callback (WidgetInfo *info)
42 {
43   Window toplevel;
44   Window root;
45   GdkWindow *window;
46   gint tx;
47   gint ty;
48   guint twidth;
49   guint theight;
50   guint tborder_width;
51   guint tdepth;
52   gint target_width = 0;
53   gint target_height = 0;
54
55   window = gtk_widget_get_window (info->window);
56   toplevel = find_toplevel_window (GDK_WINDOW_XID (window));
57   XGetGeometry (GDK_WINDOW_XDISPLAY (window),
58                 toplevel,
59                 &root, &tx, &ty, &twidth, &theight, &tborder_width, &tdepth);
60
61   switch (info->size)
62     {
63     case SMALL:
64       target_width = SMALL_WIDTH;
65       target_height = SMALL_HEIGHT;
66       break;
67     case MEDIUM:
68       target_width = MEDIUM_WIDTH;
69       target_height = MEDIUM_HEIGHT;
70       break;
71     case LARGE:
72       target_width = LARGE_WIDTH;
73       target_height = LARGE_HEIGHT;
74       break;
75     case ASIS:
76       target_width = twidth;
77       target_height = theight;
78       break;
79     }
80
81   if (twidth > target_width ||
82       theight > target_height)
83     {
84       gtk_widget_set_size_request (info->window,
85                                    2 + target_width - (twidth - target_width), /* Dunno why I need the +2 fudge factor; */
86                                    2 + target_height - (theight - target_height));
87     }
88   return FALSE;
89 }
90
91 static void
92 realize_callback (GtkWidget  *widget,
93                   WidgetInfo *info)
94 {
95   gdk_threads_add_timeout (500, (GSourceFunc)adjust_size_callback, info);
96 }
97
98 static WidgetInfo *
99 new_widget_info (const char *name,
100                  GtkWidget  *widget,
101                  WidgetSize  size)
102 {
103   WidgetInfo *info;
104
105   info = g_new0 (WidgetInfo, 1);
106   info->name = g_strdup (name);
107   info->size = size;
108   if (GTK_IS_WINDOW (widget))
109     {
110       info->window = widget;
111       gtk_window_set_resizable (GTK_WINDOW (info->window), FALSE);
112       info->include_decorations = TRUE;
113       g_signal_connect (info->window, "realize", G_CALLBACK (realize_callback), info);
114     }
115   else
116     {
117       info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
118       gtk_window_set_has_resize_grip (GTK_WINDOW (info->window), FALSE);
119       info->include_decorations = FALSE;
120       gtk_widget_show_all (widget);
121       gtk_container_add (GTK_CONTAINER (info->window), widget);
122     }
123   info->no_focus = TRUE;
124
125   gtk_widget_set_app_paintable (info->window, TRUE);
126   g_signal_connect (info->window, "focus", G_CALLBACK (gtk_true), NULL);
127   gtk_container_set_border_width (GTK_CONTAINER (info->window), 12);
128
129   switch (size)
130     {
131     case SMALL:
132       gtk_widget_set_size_request (info->window,
133                                    240, 75);
134       break;
135     case MEDIUM:
136       gtk_widget_set_size_request (info->window,
137                                    240, 165);
138       break;
139     case LARGE:
140       gtk_widget_set_size_request (info->window,
141                                    240, 240);
142       break;
143     default:
144         break;
145     }
146
147   return info;
148 }
149
150 static WidgetInfo *
151 create_button (void)
152 {
153   GtkWidget *widget;
154   GtkWidget *align;
155
156   widget = gtk_button_new_with_mnemonic ("_Button");
157   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
158   gtk_container_add (GTK_CONTAINER (align), widget);
159
160   return new_widget_info ("button", align, SMALL);
161 }
162
163 static WidgetInfo *
164 create_switch (void)
165 {
166   GtkWidget *widget;
167   GtkWidget *align;
168   GtkWidget *sw;
169
170   widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
171   sw = gtk_switch_new ();
172   gtk_switch_set_active (GTK_SWITCH (sw), TRUE);
173   gtk_box_pack_start (GTK_BOX (widget), sw, TRUE, TRUE, 0);
174   sw = gtk_switch_new ();
175   gtk_box_pack_start (GTK_BOX (widget), sw, TRUE, TRUE, 0);
176
177   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
178   gtk_container_add (GTK_CONTAINER (align), widget);
179
180   return new_widget_info ("switch", align, SMALL);
181 }
182
183 static WidgetInfo *
184 create_toggle_button (void)
185 {
186   GtkWidget *widget;
187   GtkWidget *align;
188
189   widget = gtk_toggle_button_new_with_mnemonic ("_Toggle Button");
190   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
191   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
192   gtk_container_add (GTK_CONTAINER (align), widget);
193
194   return new_widget_info ("toggle-button", align, SMALL);
195 }
196
197 static WidgetInfo *
198 create_check_button (void)
199 {
200   GtkWidget *widget;
201   GtkWidget *align;
202
203   widget = gtk_check_button_new_with_mnemonic ("_Check Button");
204   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
205   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
206   gtk_container_add (GTK_CONTAINER (align), widget);
207
208   return new_widget_info ("check-button", align, SMALL);
209 }
210
211 static WidgetInfo *
212 create_link_button (void)
213 {
214   GtkWidget *widget;
215   GtkWidget *align;
216
217   widget = gtk_link_button_new_with_label ("http://www.gtk.org", "Link Button");
218   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
219   gtk_container_add (GTK_CONTAINER (align), widget);
220
221   return new_widget_info ("link-button", align, SMALL);
222 }
223
224 static WidgetInfo *
225 create_entry (void)
226 {
227   GtkWidget *widget;
228   GtkWidget *align;
229
230   widget = gtk_entry_new ();
231   gtk_entry_set_text (GTK_ENTRY (widget), "Entry");
232   gtk_editable_set_position (GTK_EDITABLE (widget), -1);
233   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
234   gtk_container_add (GTK_CONTAINER (align), widget);
235
236   return  new_widget_info ("entry", align, SMALL);
237 }
238
239 static WidgetInfo *
240 create_radio (void)
241 {
242   GtkWidget *widget;
243   GtkWidget *radio;
244   GtkWidget *align;
245
246   widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
247   radio = gtk_radio_button_new_with_mnemonic (NULL, "Radio Button _One");
248   gtk_box_pack_start (GTK_BOX (widget), radio, FALSE, FALSE, 0);
249   radio = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (radio), "Radio Button _Two");
250   gtk_box_pack_start (GTK_BOX (widget), radio, FALSE, FALSE, 0);
251   radio = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (radio), "Radio Button T_hree");
252   gtk_box_pack_start (GTK_BOX (widget), radio, FALSE, FALSE, 0);
253   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
254   gtk_container_add (GTK_CONTAINER (align), widget);
255
256   return new_widget_info ("radio-group", align, MEDIUM);
257 }
258
259 static WidgetInfo *
260 create_label (void)
261 {
262   GtkWidget *widget;
263   GtkWidget *align;
264
265   widget = gtk_label_new ("Label");
266   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
267   gtk_container_add (GTK_CONTAINER (align), widget);
268
269   return new_widget_info ("label", align, SMALL);
270 }
271
272 static WidgetInfo *
273 create_accel_label (void)
274 {
275   WidgetInfo *info;
276   GtkWidget *widget, *button, *box;
277   GtkAccelGroup *accel_group;
278
279   widget = gtk_accel_label_new ("Accel Label");
280
281   button = gtk_button_new_with_label ("Quit");
282   gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
283   gtk_widget_set_no_show_all (button, TRUE);
284
285   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
286   gtk_container_add (GTK_CONTAINER (box), widget);
287   gtk_container_add (GTK_CONTAINER (box), button);
288
289   gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
290   accel_group = gtk_accel_group_new();
291
292   info = new_widget_info ("accel-label", box, SMALL);
293
294   gtk_widget_add_accelerator (button, "activate", accel_group, GDK_KEY_Q, GDK_CONTROL_MASK,
295                               GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
296
297   return info;
298 }
299
300 static WidgetInfo *
301 create_combo_box_entry (void)
302 {
303   GtkWidget *widget;
304   GtkWidget *align;
305   GtkWidget *child;
306   GtkTreeModel *model;
307   
308   gtk_rc_parse_string ("style \"combo-box-entry-style\" {\n"
309                        "  GtkComboBox::appears-as-list = 1\n"
310                        "}\n"
311                        "widget_class \"GtkComboBoxEntry\" style \"combo-box-entry-style\"\n" );
312
313   model = (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING);
314   widget = g_object_new (GTK_TYPE_COMBO_BOX,
315                          "has-entry", TRUE,
316                          "model", model,
317                          "entry-text-column", 0,
318                          NULL);
319   g_object_unref (model);
320
321   child = gtk_bin_get_child (GTK_BIN (widget));
322   gtk_entry_set_text (GTK_ENTRY (child), "Combo Box Entry");
323   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
324   gtk_container_add (GTK_CONTAINER (align), widget);
325
326   return new_widget_info ("combo-box-entry", align, SMALL);
327 }
328
329 static WidgetInfo *
330 create_combo_box (void)
331 {
332   GtkWidget *widget;
333   GtkWidget *align;
334   
335   gtk_rc_parse_string ("style \"combo-box-style\" {\n"
336                        "  GtkComboBox::appears-as-list = 0\n"
337                        "}\n"
338                        "widget_class \"GtkComboBox\" style \"combo-box-style\"\n" );
339
340   widget = gtk_combo_box_text_new ();
341   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (widget), "Combo Box");
342   gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
343   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
344   gtk_container_add (GTK_CONTAINER (align), widget);
345
346   return new_widget_info ("combo-box", align, SMALL);
347 }
348
349 static WidgetInfo *
350 create_recent_chooser_dialog (void)
351 {
352   WidgetInfo *info;
353   GtkWidget *widget;
354
355   widget = gtk_recent_chooser_dialog_new ("Recent Chooser Dialog",
356                                           NULL,
357                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
358                                           GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
359                                           NULL); 
360   gtk_window_set_default_size (GTK_WINDOW (widget), 505, 305);
361   
362   info = new_widget_info ("recentchooserdialog", widget, ASIS);
363   info->include_decorations = TRUE;
364
365   return info;
366 }
367
368 static WidgetInfo *
369 create_text_view (void)
370 {
371   GtkWidget *widget;
372   GtkWidget *text_view;
373
374   widget = gtk_frame_new (NULL);
375   gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
376   text_view = gtk_text_view_new ();
377   gtk_container_add (GTK_CONTAINER (widget), text_view);
378   /* Bad hack to add some size to the widget */
379   gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)),
380                             "Multiline\nText\n\n", -1);
381   gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (text_view), FALSE);
382
383   return new_widget_info ("multiline-text", widget, MEDIUM);
384 }
385
386 static WidgetInfo *
387 create_tree_view (void)
388 {
389   GtkWidget *widget;
390   GtkWidget *tree_view;
391   GtkListStore *list_store;
392   GtkTreeIter iter;
393   WidgetInfo *info;
394
395   widget = gtk_frame_new (NULL);
396   gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
397   list_store = gtk_list_store_new (1, G_TYPE_STRING);
398   gtk_list_store_append (list_store, &iter);
399   gtk_list_store_set (list_store, &iter, 0, "Line One", -1);
400   gtk_list_store_append (list_store, &iter);
401   gtk_list_store_set (list_store, &iter, 0, "Line Two", -1);
402   gtk_list_store_append (list_store, &iter);
403   gtk_list_store_set (list_store, &iter, 0, "Line Three", -1);
404
405   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
406   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
407                                                0, "List and Tree",
408                                                gtk_cell_renderer_text_new (),
409                                                "text", 0, NULL);
410   gtk_container_add (GTK_CONTAINER (widget), tree_view);
411
412   info = new_widget_info ("list-and-tree", widget, MEDIUM);
413   info->no_focus = FALSE;
414
415   return info;
416 }
417
418 static WidgetInfo *
419 create_icon_view (void)
420 {
421   GtkWidget *widget;
422   GtkWidget *vbox;
423   GtkWidget *align;
424   GtkWidget *icon_view;
425   GtkListStore *list_store;
426   GtkTreeIter iter;
427   GdkPixbuf *pixbuf;
428   WidgetInfo *info;
429
430   widget = gtk_frame_new (NULL);
431   gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN);
432   list_store = gtk_list_store_new (2, G_TYPE_STRING, GDK_TYPE_PIXBUF);
433   gtk_list_store_append (list_store, &iter);
434   pixbuf = gdk_pixbuf_new_from_file ("folder.png", NULL);
435   gtk_list_store_set (list_store, &iter, 0, "One", 1, pixbuf, -1);
436   gtk_list_store_append (list_store, &iter);
437   pixbuf = gdk_pixbuf_new_from_file ("gnome.png", NULL);
438   gtk_list_store_set (list_store, &iter, 0, "Two", 1, pixbuf, -1);
439
440   icon_view = gtk_icon_view_new();
441
442   gtk_icon_view_set_model (GTK_ICON_VIEW (icon_view), GTK_TREE_MODEL (list_store));
443   gtk_icon_view_set_text_column (GTK_ICON_VIEW (icon_view), 0);
444   gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icon_view), 1);
445
446   gtk_container_add (GTK_CONTAINER (widget), icon_view);
447
448   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
449   align = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
450   gtk_container_add (GTK_CONTAINER (align), widget);
451   gtk_box_pack_start (GTK_BOX (vbox), align, TRUE, TRUE, 0);
452   gtk_box_pack_start (GTK_BOX (vbox),
453                       gtk_label_new ("Icon View"),
454                       FALSE, FALSE, 0);
455
456   info = new_widget_info ("icon-view", vbox, MEDIUM);
457   info->no_focus = FALSE;
458
459   return info;
460 }
461
462 static WidgetInfo *
463 create_color_button (void)
464 {
465   GtkWidget *vbox;
466   GtkWidget *picker;
467   GtkWidget *align;
468   GdkColor color;
469
470   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
471   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
472   color.red = 0x1e<<8;  /* Go Gagne! */
473   color.green = 0x90<<8;
474   color.blue = 0xff<<8;
475   picker = gtk_color_button_new_with_color (&color);
476   gtk_container_add (GTK_CONTAINER (align), picker);
477   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
478   gtk_box_pack_start (GTK_BOX (vbox),
479                       gtk_label_new ("Color Button"),
480                       FALSE, FALSE, 0);
481
482   return new_widget_info ("color-button", vbox, SMALL);
483 }
484
485 static WidgetInfo *
486 create_font_button (void)
487 {
488   GtkWidget *vbox;
489   GtkWidget *picker;
490   GtkWidget *align;
491
492   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
493   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
494   picker = gtk_font_button_new_with_font ("Sans Serif 10");
495   gtk_container_add (GTK_CONTAINER (align), picker);
496   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
497   gtk_box_pack_start (GTK_BOX (vbox),
498                       gtk_label_new ("Font Button"),
499                       FALSE, FALSE, 0);
500
501   return new_widget_info ("font-button", vbox, SMALL);
502 }
503
504 static WidgetInfo *
505 create_file_button (void)
506 {
507   GtkWidget *vbox;
508   GtkWidget *vbox2;
509   GtkWidget *picker;
510   GtkWidget *align;
511
512   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
513   vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
514   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
515   picker = gtk_file_chooser_button_new ("File Chooser Button",
516                                         GTK_FILE_CHOOSER_ACTION_OPEN);
517   gtk_widget_set_size_request (picker, 150, -1);
518   gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (picker), "/etc/yum.conf");
519   gtk_container_add (GTK_CONTAINER (align), picker);
520   gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 0);
521   gtk_box_pack_start (GTK_BOX (vbox2),
522                       gtk_label_new ("File Button (Files)"),
523                       FALSE, FALSE, 0);
524
525   gtk_box_pack_start (GTK_BOX (vbox),
526                       vbox2, TRUE, TRUE, 0);
527   gtk_box_pack_start (GTK_BOX (vbox),
528                       gtk_separator_new (GTK_ORIENTATION_HORIZONTAL),
529                       FALSE, FALSE, 0);
530
531   vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
532   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
533   picker = gtk_file_chooser_button_new ("File Chooser Button",
534                                         GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
535   gtk_widget_set_size_request (picker, 150, -1);
536   gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (picker), "/");
537   gtk_container_add (GTK_CONTAINER (align), picker);
538   gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 0);
539   gtk_box_pack_start (GTK_BOX (vbox2),
540                       gtk_label_new ("File Button (Select Folder)"),
541                       FALSE, FALSE, 0);
542   gtk_box_pack_start (GTK_BOX (vbox),
543                       vbox2, TRUE, TRUE, 0);
544
545   return new_widget_info ("file-button", vbox, MEDIUM);
546 }
547
548 static WidgetInfo *
549 create_separator (void)
550 {
551   GtkWidget *hbox;
552   GtkWidget *vbox;
553
554   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
555   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
556   gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
557   gtk_box_pack_start (GTK_BOX (hbox),
558                       gtk_separator_new (GTK_ORIENTATION_HORIZONTAL),
559                       TRUE, TRUE, 0);
560   gtk_box_pack_start (GTK_BOX (hbox),
561                       gtk_separator_new (GTK_ORIENTATION_VERTICAL),
562                       TRUE, TRUE, 0);
563   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
564   gtk_box_pack_start (GTK_BOX (vbox),
565                       g_object_new (GTK_TYPE_LABEL,
566                                     "label", "Horizontal and Vertical\nSeparators",
567                                     "justify", GTK_JUSTIFY_CENTER,
568                                     NULL),
569                       FALSE, FALSE, 0);
570   return new_widget_info ("separator", vbox, MEDIUM);
571 }
572
573 static WidgetInfo *
574 create_panes (void)
575 {
576   GtkWidget *hbox;
577   GtkWidget *vbox;
578   GtkWidget *pane;
579
580   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
581   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
582   gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
583   pane = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
584   gtk_paned_pack1 (GTK_PANED (pane),
585                    g_object_new (GTK_TYPE_FRAME,
586                                  "shadow", GTK_SHADOW_IN,
587                                  NULL),
588                    FALSE, FALSE);
589   gtk_paned_pack2 (GTK_PANED (pane),
590                    g_object_new (GTK_TYPE_FRAME,
591                                  "shadow", GTK_SHADOW_IN,
592                                  NULL),
593                    FALSE, FALSE);
594   gtk_box_pack_start (GTK_BOX (hbox),
595                       pane,
596                       TRUE, TRUE, 0);
597   pane = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
598   gtk_paned_pack1 (GTK_PANED (pane),
599                    g_object_new (GTK_TYPE_FRAME,
600                                  "shadow", GTK_SHADOW_IN,
601                                  NULL),
602                    FALSE, FALSE);
603   gtk_paned_pack2 (GTK_PANED (pane),
604                    g_object_new (GTK_TYPE_FRAME,
605                                  "shadow", GTK_SHADOW_IN,
606                                  NULL),
607                    FALSE, FALSE);
608   gtk_box_pack_start (GTK_BOX (hbox),
609                       pane,
610                       TRUE, TRUE, 0);
611   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
612   gtk_box_pack_start (GTK_BOX (vbox),
613                       g_object_new (GTK_TYPE_LABEL,
614                                     "label", "Horizontal and Vertical\nPanes",
615                                     "justify", GTK_JUSTIFY_CENTER,
616                                     NULL),
617                       FALSE, FALSE, 0);
618   return new_widget_info ("panes", vbox, MEDIUM);
619 }
620
621 static WidgetInfo *
622 create_frame (void)
623 {
624   GtkWidget *widget;
625
626   widget = gtk_frame_new ("Frame");
627
628   return new_widget_info ("frame", widget, MEDIUM);
629 }
630
631 static WidgetInfo *
632 create_window (void)
633 {
634   WidgetInfo *info;
635   GtkWidget *widget;
636
637   widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
638   info = new_widget_info ("window", widget, MEDIUM);
639   info->include_decorations = TRUE;
640   gtk_window_set_title (GTK_WINDOW (info->window), "Window");
641
642   return info;
643 }
644
645 static WidgetInfo *
646 create_colorsel (void)
647 {
648   WidgetInfo *info;
649   GtkWidget *widget;
650   GtkColorSelection *colorsel;
651   GtkColorSelectionDialog *selection_dialog;
652   GdkColor color;
653
654   widget = gtk_color_selection_dialog_new ("Color Selection Dialog");
655   selection_dialog = GTK_COLOR_SELECTION_DIALOG (widget);
656   colorsel = GTK_COLOR_SELECTION (gtk_color_selection_dialog_get_color_selection (selection_dialog));
657
658   color.red   = 0x7979;
659   color.green = 0xdbdb;
660   color.blue  = 0x9595;
661
662   gtk_color_selection_set_previous_color (colorsel, &color);
663   
664   color.red   = 0x7d7d;
665   color.green = 0x9393;
666   color.blue  = 0xc3c3;
667   
668   gtk_color_selection_set_current_color (colorsel, &color);
669
670   info = new_widget_info ("colorsel", widget, ASIS);
671   info->include_decorations = TRUE;
672
673   return info;
674 }
675
676 static WidgetInfo *
677 create_fontsel (void)
678 {
679   WidgetInfo *info;
680   GtkWidget *widget;
681
682   widget = gtk_font_selection_dialog_new ("Font Selection Dialog");
683   info = new_widget_info ("fontsel", widget, ASIS);
684   info->include_decorations = TRUE;
685
686   return info;
687 }
688
689 static WidgetInfo *
690 create_filesel (void)
691 {
692   WidgetInfo *info;
693   GtkWidget *widget;
694
695   widget = gtk_file_chooser_dialog_new ("File Chooser Dialog",
696                                         NULL,
697                                         GTK_FILE_CHOOSER_ACTION_OPEN,
698                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
699                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
700                                         NULL); 
701   gtk_window_set_default_size (GTK_WINDOW (widget), 505, 305);
702   
703   info = new_widget_info ("filechooser", widget, ASIS);
704   info->include_decorations = TRUE;
705
706   return info;
707 }
708
709 static WidgetInfo *
710 create_print_dialog (void)
711 {
712   WidgetInfo *info;
713   GtkWidget *widget;
714
715   widget = gtk_print_unix_dialog_new ("Print Dialog", NULL);   
716   gtk_widget_set_size_request (widget, 505, 350);
717   info = new_widget_info ("printdialog", widget, ASIS);
718   info->include_decorations = TRUE;
719
720   return info;
721 }
722
723 static WidgetInfo *
724 create_page_setup_dialog (void)
725 {
726   WidgetInfo *info;
727   GtkWidget *widget;
728   GtkPageSetup *page_setup;
729   GtkPrintSettings *settings;
730
731   page_setup = gtk_page_setup_new ();
732   settings = gtk_print_settings_new ();
733   widget = gtk_page_setup_unix_dialog_new ("Page Setup Dialog", NULL);   
734   gtk_page_setup_unix_dialog_set_page_setup (GTK_PAGE_SETUP_UNIX_DIALOG (widget),
735                                              page_setup);
736   gtk_page_setup_unix_dialog_set_print_settings (GTK_PAGE_SETUP_UNIX_DIALOG (widget),
737                                                  settings);
738
739   info = new_widget_info ("pagesetupdialog", widget, ASIS);
740   gtk_widget_set_app_paintable (info->window, FALSE);
741   info->include_decorations = TRUE;
742
743   return info;
744 }
745
746 static WidgetInfo *
747 create_toolbar (void)
748 {
749   GtkWidget *widget, *menu;
750   GtkToolItem *item;
751
752   widget = gtk_toolbar_new ();
753
754   item = gtk_tool_button_new_from_stock (GTK_STOCK_NEW);
755   gtk_toolbar_insert (GTK_TOOLBAR (widget), item, -1);
756
757   item = gtk_menu_tool_button_new_from_stock (GTK_STOCK_OPEN);
758   menu = gtk_menu_new ();
759   gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (item), menu);
760   gtk_toolbar_insert (GTK_TOOLBAR (widget), item, -1);
761
762   item = gtk_tool_button_new_from_stock (GTK_STOCK_REFRESH);
763   gtk_toolbar_insert (GTK_TOOLBAR (widget), item, -1);
764
765   gtk_toolbar_set_show_arrow (GTK_TOOLBAR (widget), FALSE);
766
767   return new_widget_info ("toolbar", widget, SMALL);
768 }
769
770 static WidgetInfo *
771 create_toolpalette (void)
772 {
773   GtkWidget *widget, *group;
774   GtkToolItem *item;
775
776   widget = gtk_tool_palette_new ();
777   group = gtk_tool_item_group_new ("Tools");
778   gtk_container_add (GTK_CONTAINER (widget), group);
779   item = gtk_tool_button_new_from_stock (GTK_STOCK_ABOUT);
780   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
781   item = gtk_tool_button_new_from_stock (GTK_STOCK_FILE);
782   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
783   item = gtk_tool_button_new_from_stock (GTK_STOCK_CONNECT);
784   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
785
786   group = gtk_tool_item_group_new ("More tools");
787   gtk_container_add (GTK_CONTAINER (widget), group);
788   item = gtk_tool_button_new_from_stock (GTK_STOCK_CUT);
789   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
790   item = gtk_tool_button_new_from_stock (GTK_STOCK_EXECUTE);
791   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
792   item = gtk_tool_button_new_from_stock (GTK_STOCK_CANCEL);
793   gtk_tool_item_group_insert (GTK_TOOL_ITEM_GROUP (group), item, -1);
794
795   return new_widget_info ("toolpalette", widget, MEDIUM);
796 }
797
798 static WidgetInfo *
799 create_menubar (void)
800 {
801   GtkWidget *widget, *vbox, *align, *item;
802
803   widget = gtk_menu_bar_new ();
804
805   item = gtk_menu_item_new_with_mnemonic ("_File");
806   gtk_menu_shell_append (GTK_MENU_SHELL (widget), item);
807
808   item = gtk_menu_item_new_with_mnemonic ("_Edit");
809   gtk_menu_shell_append (GTK_MENU_SHELL (widget), item);
810
811   item = gtk_menu_item_new_with_mnemonic ("_Help");
812   gtk_menu_shell_append (GTK_MENU_SHELL (widget), item);
813
814   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
815   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
816   gtk_container_add (GTK_CONTAINER (align), widget);
817   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
818   gtk_box_pack_start (GTK_BOX (vbox),
819                       gtk_label_new ("Menu Bar"),
820                       FALSE, FALSE, 0);
821
822   return new_widget_info ("menubar", vbox, SMALL);
823 }
824
825 static WidgetInfo *
826 create_message_dialog (void)
827 {
828   GtkWidget *widget;
829
830   widget = gtk_message_dialog_new (NULL,
831                                    0,
832                                    GTK_MESSAGE_INFO,
833                                    GTK_BUTTONS_OK,
834                                    NULL);
835   gtk_window_set_icon_name (GTK_WINDOW (widget), "edit-copy");
836   gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (widget),
837                                  "<b>Message Dialog</b>\n\nWith secondary text");
838   return new_widget_info ("messagedialog", widget, ASIS);
839 }
840
841 static WidgetInfo *
842 create_about_dialog (void)
843 {
844   GtkWidget *widget;
845   const gchar *authors[] = {
846     "Peter Mattis",
847     "Spencer Kimball",
848     "Josh MacDonald",
849     "and many more...",
850     NULL
851   };
852
853   widget = gtk_about_dialog_new ();
854   g_object_set (widget,
855                 "program-name", "GTK+ Code Demos",
856                 "version", PACKAGE_VERSION,
857                 "copyright", "(C) 1997-2009 The GTK+ Team",
858                 "website", "http://www.gtk.org",
859                 "comments", "Program to demonstrate GTK+ functions.",
860                 "logo-icon-name", "help-about",
861                 "title", "About GTK+ Code Demos",
862                 "authors", authors,
863                 NULL);
864   gtk_window_set_icon_name (GTK_WINDOW (widget), "help-about");
865   return new_widget_info ("aboutdialog", widget, ASIS);
866 }
867
868 static WidgetInfo *
869 create_notebook (void)
870 {
871   GtkWidget *widget;
872
873   widget = gtk_notebook_new ();
874
875   gtk_notebook_append_page (GTK_NOTEBOOK (widget), 
876                             gtk_label_new ("Notebook"),
877                             NULL);
878   gtk_notebook_append_page (GTK_NOTEBOOK (widget), gtk_event_box_new (), NULL);
879   gtk_notebook_append_page (GTK_NOTEBOOK (widget), gtk_event_box_new (), NULL);
880
881   return new_widget_info ("notebook", widget, MEDIUM);
882 }
883
884 static WidgetInfo *
885 create_progressbar (void)
886 {
887   GtkWidget *vbox;
888   GtkWidget *widget;
889   GtkWidget *align;
890
891   widget = gtk_progress_bar_new ();
892   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 0.5);
893
894   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
895   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
896   gtk_container_add (GTK_CONTAINER (align), widget);
897   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
898   gtk_box_pack_start (GTK_BOX (vbox),
899                       gtk_label_new ("Progress Bar"),
900                       FALSE, FALSE, 0);
901
902   return new_widget_info ("progressbar", vbox, SMALL);
903 }
904
905 static WidgetInfo *
906 create_scrolledwindow (void)
907 {
908   GtkWidget *scrolledwin, *label;
909
910   scrolledwin = gtk_scrolled_window_new (NULL, NULL);
911   label = gtk_label_new ("Scrolled Window");
912
913   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolledwin), 
914                                          label);
915
916   return new_widget_info ("scrolledwindow", scrolledwin, MEDIUM);
917 }
918
919 static WidgetInfo *
920 create_spinbutton (void)
921 {
922   GtkWidget *widget;
923   GtkWidget *vbox, *align;
924
925   widget = gtk_spin_button_new_with_range (0.0, 100.0, 1.0);
926
927   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
928   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
929   gtk_container_add (GTK_CONTAINER (align), widget);
930   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
931   gtk_box_pack_start (GTK_BOX (vbox),
932                       gtk_label_new ("Spin Button"),
933                       FALSE, FALSE, 0);
934
935   return new_widget_info ("spinbutton", vbox, SMALL);
936 }
937
938 static WidgetInfo *
939 create_statusbar (void)
940 {
941   WidgetInfo *info;
942   GtkWidget *widget;
943   GtkWidget *vbox, *align;
944
945   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
946   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
947   gtk_container_add (GTK_CONTAINER (align), gtk_label_new ("Status Bar"));
948   gtk_box_pack_start (GTK_BOX (vbox),
949                       align,
950                       TRUE, TRUE, 0);
951   widget = gtk_statusbar_new ();
952   align = gtk_alignment_new (0.5, 1.0, 1.0, 0.0);
953   gtk_container_add (GTK_CONTAINER (align), widget);
954   gtk_statusbar_push (GTK_STATUSBAR (widget), 0, "Hold on...");
955
956   gtk_box_pack_end (GTK_BOX (vbox), align, FALSE, FALSE, 0);
957
958   info = new_widget_info ("statusbar", vbox, SMALL);
959   gtk_container_set_border_width (GTK_CONTAINER (info->window), 0);
960
961   return info;
962 }
963
964 static WidgetInfo *
965 create_scales (void)
966 {
967   GtkWidget *hbox;
968   GtkWidget *vbox;
969
970   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
971   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
972   gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
973   gtk_box_pack_start (GTK_BOX (hbox),
974                       gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
975                                                 0.0, 100.0, 1.0),
976                       TRUE, TRUE, 0);
977   gtk_box_pack_start (GTK_BOX (hbox),
978                       gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL,
979                                                 0.0, 100.0, 1.0),
980                       TRUE, TRUE, 0);
981   gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
982   gtk_box_pack_start (GTK_BOX (vbox),
983                       g_object_new (GTK_TYPE_LABEL,
984                                     "label", "Horizontal and Vertical\nScales",
985                                     "justify", GTK_JUSTIFY_CENTER,
986                                     NULL),
987                       FALSE, FALSE, 0);
988   return new_widget_info ("scales", vbox, MEDIUM);}
989
990 static WidgetInfo *
991 create_image (void)
992 {
993   GtkWidget *widget;
994   GtkWidget *align, *vbox;
995
996   widget = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, 
997                                      GTK_ICON_SIZE_DND);
998
999   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
1000   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
1001   gtk_container_add (GTK_CONTAINER (align), widget);
1002   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
1003   gtk_box_pack_start (GTK_BOX (vbox),
1004                       gtk_label_new ("Image"),
1005                       FALSE, FALSE, 0);
1006
1007   return new_widget_info ("image", vbox, SMALL);
1008 }
1009
1010 static WidgetInfo *
1011 create_spinner (void)
1012 {
1013   GtkWidget *widget;
1014   GtkWidget *align, *vbox;
1015
1016   widget = gtk_spinner_new ();
1017   gtk_widget_set_size_request (widget, 24, 24);
1018
1019   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
1020   align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
1021   gtk_container_add (GTK_CONTAINER (align), widget);
1022   gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
1023   gtk_box_pack_start (GTK_BOX (vbox),
1024                       gtk_label_new ("Spinner"),
1025                       FALSE, FALSE, 0);
1026
1027   return new_widget_info ("spinner", vbox, SMALL);
1028 }
1029
1030 static WidgetInfo *
1031 create_volume_button (void)
1032 {
1033   GtkWidget *button, *widget;
1034   GtkWidget *plus_button;
1035
1036   button = gtk_volume_button_new ();
1037   gtk_scale_button_set_value (GTK_SCALE_BUTTON (button), 33);
1038   /* Hack: get the private dock */
1039   plus_button = gtk_scale_button_get_plus_button (GTK_SCALE_BUTTON (button));
1040   widget = gtk_widget_get_parent (gtk_widget_get_parent (gtk_widget_get_parent (plus_button)));
1041   gtk_widget_show_all (widget);
1042   return new_widget_info ("volumebutton", widget, ASIS);
1043 }
1044
1045 static WidgetInfo *
1046 create_assistant (void)
1047 {
1048   GtkWidget *widget;
1049   GtkWidget *page1, *page2;
1050   WidgetInfo *info;
1051
1052   widget = gtk_assistant_new ();
1053   gtk_window_set_title (GTK_WINDOW (widget), "Assistant");
1054
1055   page1 = gtk_label_new ("Assistant");
1056   gtk_widget_show (page1);
1057   gtk_widget_set_size_request (page1, 300, 140);
1058   gtk_assistant_prepend_page (GTK_ASSISTANT (widget), page1);
1059   gtk_assistant_set_page_title (GTK_ASSISTANT (widget), page1, "Assistant page");
1060   gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page1, TRUE);
1061
1062   page2 = gtk_label_new (NULL);
1063   gtk_widget_show (page2);
1064   gtk_assistant_append_page (GTK_ASSISTANT (widget), page2);
1065   gtk_assistant_set_page_type (GTK_ASSISTANT (widget), page2, GTK_ASSISTANT_PAGE_CONFIRM);
1066
1067   info = new_widget_info ("assistant", widget, ASIS);
1068   info->include_decorations = TRUE;
1069
1070   return info;
1071 }
1072
1073 GList *
1074 get_all_widgets (void)
1075 {
1076   GList *retval = NULL;
1077
1078   retval = g_list_prepend (retval, create_toolpalette ());
1079   retval = g_list_prepend (retval, create_spinner ());
1080   retval = g_list_prepend (retval, create_about_dialog ());
1081   retval = g_list_prepend (retval, create_accel_label ());
1082   retval = g_list_prepend (retval, create_button ());
1083   retval = g_list_prepend (retval, create_check_button ());
1084   retval = g_list_prepend (retval, create_color_button ());
1085   retval = g_list_prepend (retval, create_combo_box ());
1086   retval = g_list_prepend (retval, create_combo_box_entry ());
1087   retval = g_list_prepend (retval, create_entry ());
1088   retval = g_list_prepend (retval, create_file_button ());
1089   retval = g_list_prepend (retval, create_font_button ());
1090   retval = g_list_prepend (retval, create_frame ());
1091   retval = g_list_prepend (retval, create_icon_view ());
1092   retval = g_list_prepend (retval, create_image ());
1093   retval = g_list_prepend (retval, create_label ());
1094   retval = g_list_prepend (retval, create_link_button ());
1095   retval = g_list_prepend (retval, create_menubar ());
1096   retval = g_list_prepend (retval, create_message_dialog ());
1097   retval = g_list_prepend (retval, create_notebook ());
1098   retval = g_list_prepend (retval, create_panes ());
1099   retval = g_list_prepend (retval, create_progressbar ());
1100   retval = g_list_prepend (retval, create_radio ());
1101   retval = g_list_prepend (retval, create_scales ());
1102   retval = g_list_prepend (retval, create_scrolledwindow ());
1103   retval = g_list_prepend (retval, create_separator ());
1104   retval = g_list_prepend (retval, create_spinbutton ());
1105   retval = g_list_prepend (retval, create_statusbar ());
1106   retval = g_list_prepend (retval, create_text_view ());
1107   retval = g_list_prepend (retval, create_toggle_button ());
1108   retval = g_list_prepend (retval, create_toolbar ());
1109   retval = g_list_prepend (retval, create_tree_view ());
1110   retval = g_list_prepend (retval, create_window ());
1111   retval = g_list_prepend (retval, create_colorsel ());
1112   retval = g_list_prepend (retval, create_filesel ());
1113   retval = g_list_prepend (retval, create_fontsel ());
1114   retval = g_list_prepend (retval, create_assistant ());
1115   retval = g_list_prepend (retval, create_recent_chooser_dialog ());
1116   retval = g_list_prepend (retval, create_page_setup_dialog ());
1117   retval = g_list_prepend (retval, create_print_dialog ());
1118   retval = g_list_prepend (retval, create_volume_button ());
1119   retval = g_list_prepend (retval, create_switch ());
1120
1121   return retval;
1122 }