]> Pileus Git - ~andy/gtk/blob - tests/testassistant.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testassistant.c
1 /* 
2  * GTK - The GIMP Toolkit
3  * Copyright (C) 1999  Red Hat, Inc.
4  * Copyright (C) 2002  Anders Carlsson <andersca@gnu.org>
5  * Copyright (C) 2003  Matthias Clasen <mclasen@redhat.com>
6  * Copyright (C) 2005  Carlos Garnacho Parro <carlosg@gnome.org>
7  *
8  * All rights reserved.
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #include <gtk/gtk.h>
25
26 static GtkWidget*
27 get_test_page (const gchar *text)
28 {
29   return gtk_label_new (text);
30 }
31
32 typedef struct {
33   GtkAssistant *assistant;
34   GtkWidget    *page;
35 } PageData;
36
37 static void
38 complete_cb (GtkWidget *check, 
39              gpointer   data)
40 {
41   PageData *pdata = data;
42   gboolean complete;
43
44   complete = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check));
45
46   gtk_assistant_set_page_complete (pdata->assistant,
47                                    pdata->page,
48                                    complete);
49 }
50              
51 static GtkWidget *
52 add_completion_test_page (GtkWidget   *assistant,
53                           const gchar *text, 
54                           gboolean     visible,
55                           gboolean     complete)
56 {
57   GtkWidget *page;
58   GtkWidget *check;
59   PageData *pdata;
60
61   page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
62   check = gtk_check_button_new_with_label ("Complete");
63
64   gtk_container_add (GTK_CONTAINER (page), gtk_label_new (text));
65   gtk_container_add (GTK_CONTAINER (page), check);
66   
67   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), complete);
68
69   pdata = g_new (PageData, 1);
70   pdata->assistant = GTK_ASSISTANT (assistant);
71   pdata->page = page;
72   g_signal_connect (G_OBJECT (check), "toggled", 
73                     G_CALLBACK (complete_cb), pdata);
74
75
76   if (visible)
77     gtk_widget_show_all (page);
78
79   gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
80   gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, text);
81   gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, complete);
82
83   return page;
84 }
85
86 static void
87 cancel_callback (GtkWidget *widget)
88 {
89   g_print ("cancel\n");
90
91   gtk_widget_hide (widget);
92 }
93
94 static void
95 close_callback (GtkWidget *widget)
96 {
97   g_print ("close\n");
98
99   gtk_widget_hide (widget);
100 }
101
102 static void
103 apply_callback (GtkWidget *widget)
104 {
105   g_print ("apply\n");
106 }
107
108 static gboolean
109 progress_timeout (GtkWidget *assistant)
110 {
111   GtkWidget *page, *progress;
112   gint current_page;
113   gdouble value;
114
115   current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (assistant));
116   page = gtk_assistant_get_nth_page (GTK_ASSISTANT (assistant), current_page);
117   progress = gtk_bin_get_child (GTK_BIN (page));
118
119   value  = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress));
120   value += 0.1;
121   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), value);
122
123   if (value >= 1.0)
124     {
125       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
126       return FALSE;
127     }
128
129   return TRUE;
130 }
131
132 static void
133 prepare_callback (GtkWidget *widget, GtkWidget *page)
134 {
135   if (GTK_IS_LABEL (page))
136     g_print ("prepare: %s\n", gtk_label_get_text (GTK_LABEL (page)));
137   else if (gtk_assistant_get_page_type (GTK_ASSISTANT (widget), page) == GTK_ASSISTANT_PAGE_PROGRESS)
138     {
139       GtkWidget *progress;
140
141       progress = gtk_bin_get_child (GTK_BIN (page));
142       gtk_assistant_set_page_complete (GTK_ASSISTANT (widget), page, FALSE);
143       gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), 0.0);
144       gdk_threads_add_timeout (300, (GSourceFunc) progress_timeout, widget);
145     }
146   else
147     g_print ("prepare: %d\n", gtk_assistant_get_current_page (GTK_ASSISTANT (widget)));
148 }
149
150 static void
151 create_simple_assistant (GtkWidget *widget)
152 {
153   static GtkWidget *assistant = NULL;
154
155   if (!assistant)
156     {
157       GtkWidget *page;
158
159       assistant = gtk_assistant_new ();
160       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
161
162       g_signal_connect (G_OBJECT (assistant), "cancel",
163                         G_CALLBACK (cancel_callback), NULL);
164       g_signal_connect (G_OBJECT (assistant), "close",
165                         G_CALLBACK (close_callback), NULL);
166       g_signal_connect (G_OBJECT (assistant), "apply",
167                         G_CALLBACK (apply_callback), NULL);
168       g_signal_connect (G_OBJECT (assistant), "prepare",
169                         G_CALLBACK (prepare_callback), NULL);
170
171       page = get_test_page ("Page 1");
172       gtk_widget_show (page);
173       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
174       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
175       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
176
177       page = get_test_page ("Page 2");
178       gtk_widget_show (page);
179       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
180       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
181       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
182       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
183     }
184
185   if (!gtk_widget_get_visible (assistant))
186     gtk_widget_show (assistant);
187   else
188     {
189       gtk_widget_destroy (assistant);
190       assistant = NULL;
191     }
192 }
193
194 static void
195 create_anonymous_assistant (GtkWidget *widget)
196 {
197   static GtkWidget *assistant = NULL;
198
199   if (!assistant)
200     {
201       GtkWidget *page;
202
203       assistant = gtk_assistant_new ();
204       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
205
206       g_signal_connect (G_OBJECT (assistant), "cancel",
207                         G_CALLBACK (cancel_callback), NULL);
208       g_signal_connect (G_OBJECT (assistant), "close",
209                         G_CALLBACK (close_callback), NULL);
210       g_signal_connect (G_OBJECT (assistant), "apply",
211                         G_CALLBACK (apply_callback), NULL);
212       g_signal_connect (G_OBJECT (assistant), "prepare",
213                         G_CALLBACK (prepare_callback), NULL);
214
215       page = get_test_page ("Page 1");
216       gtk_widget_show (page);
217       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
218       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
219
220       page = get_test_page ("Page 2");
221       gtk_widget_show (page);
222       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
223       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
224       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
225     }
226
227   if (!gtk_widget_get_visible (assistant))
228     gtk_widget_show (assistant);
229   else
230     {
231       gtk_widget_destroy (assistant);
232       assistant = NULL;
233     }
234 }
235
236 static void
237 visible_cb (GtkWidget *check, 
238             gpointer   data)
239 {
240   GtkWidget *page = data;
241   gboolean visible;
242
243   visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check));
244
245   g_object_set (G_OBJECT (page), "visible", visible, NULL);
246 }
247
248 static void
249 create_generous_assistant (GtkWidget *widget)
250 {
251   static GtkWidget *assistant = NULL;
252
253   if (!assistant)
254     {
255       GtkWidget *page, *next, *check;
256       PageData  *pdata;
257
258       assistant = gtk_assistant_new ();
259       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
260
261       g_signal_connect (G_OBJECT (assistant), "cancel",
262                         G_CALLBACK (cancel_callback), NULL);
263       g_signal_connect (G_OBJECT (assistant), "close",
264                         G_CALLBACK (close_callback), NULL);
265       g_signal_connect (G_OBJECT (assistant), "apply",
266                         G_CALLBACK (apply_callback), NULL);
267       g_signal_connect (G_OBJECT (assistant), "prepare",
268                         G_CALLBACK (prepare_callback), NULL);
269
270       page = get_test_page ("Introduction");
271       gtk_widget_show (page);
272       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
273       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
274       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
275       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
276
277       page = add_completion_test_page (assistant, "Content", TRUE, FALSE);
278       next = add_completion_test_page (assistant, "More Content", TRUE, TRUE);
279
280       check = gtk_check_button_new_with_label ("Next page visible");
281       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
282       g_signal_connect (G_OBJECT (check), "toggled", 
283                         G_CALLBACK (visible_cb), next);
284       gtk_widget_show (check);
285       gtk_container_add (GTK_CONTAINER (page), check);
286       
287       add_completion_test_page (assistant, "Even More Content", TRUE, TRUE);
288
289       page = get_test_page ("Confirmation");
290       gtk_widget_show (page);
291       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
292       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
293       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
294       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
295
296       page = gtk_alignment_new (0.5, 0.5, 0.9, 0.0);
297       gtk_container_add (GTK_CONTAINER (page), gtk_progress_bar_new ());
298       gtk_widget_show_all (page);
299       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
300       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Progress");
301       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_PROGRESS);
302
303       page = gtk_check_button_new_with_label ("Summary complete");
304       gtk_widget_show (page);
305       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
306       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Summary");
307       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_SUMMARY);
308
309       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (page),
310                                     gtk_assistant_get_page_complete (GTK_ASSISTANT (assistant),
311                                                                      page));
312
313       pdata = g_new (PageData, 1);
314       pdata->assistant = GTK_ASSISTANT (assistant);
315       pdata->page = page;
316       g_signal_connect (page, "toggled",
317                       G_CALLBACK (complete_cb), pdata);
318     }
319
320   if (!gtk_widget_get_visible (assistant))
321     gtk_widget_show (assistant);
322   else
323     {
324       gtk_widget_destroy (assistant);
325       assistant = NULL;
326     }
327 }
328
329 static gchar selected_branch = 'A';
330
331 static void
332 select_branch (GtkWidget *widget, gchar branch)
333 {
334   selected_branch = branch;
335 }
336
337 static gint
338 nonlinear_assistant_forward_page (gint current_page, gpointer data)
339 {
340   switch (current_page)
341     {
342     case 0:
343       if (selected_branch == 'A')
344         return 1;
345       else
346         return 2;
347     case 1:
348     case 2:
349       return 3;
350     default:
351       return -1;
352     }
353 }
354
355 static void
356 create_nonlinear_assistant (GtkWidget *widget)
357 {
358   static GtkWidget *assistant = NULL;
359
360   if (!assistant)
361     {
362       GtkWidget *page, *button;
363
364       assistant = gtk_assistant_new ();
365       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
366
367       g_signal_connect (G_OBJECT (assistant), "cancel",
368                         G_CALLBACK (cancel_callback), NULL);
369       g_signal_connect (G_OBJECT (assistant), "close",
370                         G_CALLBACK (close_callback), NULL);
371       g_signal_connect (G_OBJECT (assistant), "apply",
372                         G_CALLBACK (apply_callback), NULL);
373       g_signal_connect (G_OBJECT (assistant), "prepare",
374                         G_CALLBACK (prepare_callback), NULL);
375
376       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
377                                            nonlinear_assistant_forward_page,
378                                            NULL, NULL);
379
380       page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
381
382       button = gtk_radio_button_new_with_label (NULL, "branch A");
383       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
384       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('A'));
385       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
386       
387       button = gtk_radio_button_new_with_label (gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
388                                                 "branch B");
389       gtk_box_pack_start (GTK_BOX (page), button, FALSE, FALSE, 0);
390       g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (select_branch), GINT_TO_POINTER ('B'));
391
392       gtk_widget_show_all (page);
393       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
394       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
395       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
396       
397       page = get_test_page ("Page 2A");
398       gtk_widget_show (page);
399       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
400       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
401       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
402
403       page = get_test_page ("Page 2B");
404       gtk_widget_show (page);
405       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
406       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
407       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
408
409       page = get_test_page ("Confirmation");
410       gtk_widget_show (page);
411       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
412       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
413       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
414       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
415     }
416
417   if (!gtk_widget_get_visible (assistant))
418     gtk_widget_show (assistant);
419   else
420     {
421       gtk_widget_destroy (assistant);
422       assistant = NULL;
423     }
424 }
425
426 static gint
427 looping_assistant_forward_page (gint current_page, gpointer data)
428 {
429   switch (current_page)
430     {
431     case 0:
432       return 1;
433     case 1:
434       return 2;
435     case 2:
436       return 3;
437     case 3:
438       {
439         GtkAssistant *assistant;
440         GtkWidget *page;
441
442         assistant = (GtkAssistant*) data;
443         page = gtk_assistant_get_nth_page (assistant, current_page);
444
445         if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (page)))
446           return 0;
447         else
448           return 4;
449       }
450     case 4:
451     default:
452       return -1;
453     }
454 }
455
456 static void
457 create_looping_assistant (GtkWidget *widget)
458 {
459   static GtkWidget *assistant = NULL;
460
461   if (!assistant)
462     {
463       GtkWidget *page;
464
465       assistant = gtk_assistant_new ();
466       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
467
468       g_signal_connect (G_OBJECT (assistant), "cancel",
469                         G_CALLBACK (cancel_callback), NULL);
470       g_signal_connect (G_OBJECT (assistant), "close",
471                         G_CALLBACK (close_callback), NULL);
472       g_signal_connect (G_OBJECT (assistant), "apply",
473                         G_CALLBACK (apply_callback), NULL);
474       g_signal_connect (G_OBJECT (assistant), "prepare",
475                         G_CALLBACK (prepare_callback), NULL);
476
477       gtk_assistant_set_forward_page_func (GTK_ASSISTANT (assistant),
478                                            looping_assistant_forward_page,
479                                            assistant, NULL);
480
481       page = get_test_page ("Introduction");
482       gtk_widget_show (page);
483       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
484       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Introduction");
485       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_INTRO);
486       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
487
488       page = get_test_page ("Content");
489       gtk_widget_show (page);
490       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
491       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Content");
492       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
493
494       page = get_test_page ("More content");
495       gtk_widget_show (page);
496       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
497       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "More content");
498       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
499
500       page = gtk_check_button_new_with_label ("Loop?");
501       gtk_widget_show (page);
502       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
503       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Loop?");
504       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
505       
506       page = get_test_page ("Confirmation");
507       gtk_widget_show (page);
508       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
509       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Confirmation");
510       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
511       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
512     }
513
514   if (!gtk_widget_get_visible (assistant))
515     gtk_widget_show (assistant);
516   else
517     {
518       gtk_widget_destroy (assistant);
519       assistant = NULL;
520     }
521 }
522
523 static void
524 toggle_invisible (GtkButton *button, GtkAssistant *assistant)
525 {
526   GtkWidget *page;
527
528   page = gtk_assistant_get_nth_page (assistant, 1);
529
530   gtk_widget_set_visible (page, !gtk_widget_get_visible (page));
531 }
532
533 static void
534 create_full_featured_assistant (GtkWidget *widget)
535 {
536   static GtkWidget *assistant = NULL;
537
538   if (!assistant)
539     {
540       GtkWidget *page, *button;
541
542       assistant = gtk_assistant_new ();
543       gtk_window_set_default_size (GTK_WINDOW (assistant), 400, 300);
544
545       button = gtk_button_new_from_stock (GTK_STOCK_STOP);
546       gtk_widget_show (button);
547       gtk_assistant_add_action_widget (GTK_ASSISTANT (assistant), button);
548       g_signal_connect (button, "clicked",
549                         G_CALLBACK (toggle_invisible), assistant);
550
551       g_signal_connect (G_OBJECT (assistant), "cancel",
552                         G_CALLBACK (cancel_callback), NULL);
553       g_signal_connect (G_OBJECT (assistant), "close",
554                         G_CALLBACK (close_callback), NULL);
555       g_signal_connect (G_OBJECT (assistant), "apply",
556                         G_CALLBACK (apply_callback), NULL);
557       g_signal_connect (G_OBJECT (assistant), "prepare",
558                         G_CALLBACK (prepare_callback), NULL);
559
560       page = get_test_page ("Page 1");
561       gtk_widget_show (page);
562       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
563       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 1");
564       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
565
566       page = get_test_page ("Invisible page");
567       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
568       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 2");
569       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
570
571       page = get_test_page ("Page 3");
572       gtk_widget_show (page);
573       gtk_assistant_append_page (GTK_ASSISTANT (assistant), page);
574       gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), page, "Page 3");
575       gtk_assistant_set_page_type  (GTK_ASSISTANT (assistant), page, GTK_ASSISTANT_PAGE_CONFIRM);
576       gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), page, TRUE);
577     }
578
579   if (!gtk_widget_get_visible (assistant))
580     gtk_widget_show (assistant);
581   else
582     {
583       gtk_widget_destroy (assistant);
584       assistant = NULL;
585     }
586 }
587
588 struct {
589   gchar *text;
590   void  (*func) (GtkWidget *widget);
591 } buttons[] =
592   {
593     { "simple assistant",        create_simple_assistant },
594     { "anonymous assistant",        create_anonymous_assistant },
595     { "generous assistant",      create_generous_assistant },
596     { "nonlinear assistant",     create_nonlinear_assistant },
597     { "looping assistant",       create_looping_assistant },
598     { "full featured assistant", create_full_featured_assistant },
599   };
600
601 int
602 main (int argc, gchar *argv[])
603 {
604   GtkWidget *window, *box, *button;
605   gint i;
606
607   gtk_init (&argc, &argv);
608
609   if (g_getenv ("RTL"))
610     gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
611
612   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
613
614   g_signal_connect (G_OBJECT (window), "destroy",
615                     G_CALLBACK (gtk_main_quit), NULL);
616   g_signal_connect (G_OBJECT (window), "delete-event",
617                     G_CALLBACK (gtk_false), NULL);
618
619   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
620   gtk_container_add (GTK_CONTAINER (window), box);
621
622   for (i = 0; i < G_N_ELEMENTS (buttons); i++)
623     {
624       button = gtk_button_new_with_label (buttons[i].text);
625
626       if (buttons[i].func)
627         g_signal_connect (G_OBJECT (button), "clicked",
628                           G_CALLBACK (buttons[i].func), NULL);
629
630       gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
631     }
632
633   gtk_widget_show_all (window);
634   gtk_main ();
635
636   return 0;
637 }