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