1 #include <gtk/gtk.h>
2 #include <glib/gstdio.h>
3 
4 static void
show_message_dialog1(GtkWindow * parent)5 show_message_dialog1 (GtkWindow *parent)
6 {
7   GtkWidget *dialog;
8 
9   dialog = GTK_WIDGET (gtk_message_dialog_new (parent,
10                                                GTK_DIALOG_MODAL|
11                                                GTK_DIALOG_DESTROY_WITH_PARENT|
12                                                GTK_DIALOG_USE_HEADER_BAR,
13                                                GTK_MESSAGE_INFO,
14                                                GTK_BUTTONS_OK,
15                                                "Oops! Something went wrong."));
16   gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
17                                             "Unhandled error message: SSH program unexpectedly exited");
18 
19   gtk_window_present (GTK_WINDOW (dialog));
20   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
21 }
22 
23 static void
show_message_dialog1a(GtkWindow * parent)24 show_message_dialog1a (GtkWindow *parent)
25 {
26   GtkWidget *dialog;
27 
28   dialog = GTK_WIDGET (gtk_message_dialog_new (parent,
29                                                GTK_DIALOG_MODAL|
30                                                GTK_DIALOG_DESTROY_WITH_PARENT|
31                                                GTK_DIALOG_USE_HEADER_BAR,
32                                                GTK_MESSAGE_INFO,
33                                                GTK_BUTTONS_OK,
34                                                "The system network services are not compatible with this version."));
35 
36   gtk_window_present (GTK_WINDOW (dialog));
37   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
38 }
39 
40 static void
show_message_dialog2(GtkWindow * parent)41 show_message_dialog2 (GtkWindow *parent)
42 {
43   GtkWidget *dialog;
44 
45   dialog = GTK_WIDGET (gtk_message_dialog_new (parent,
46                                                GTK_DIALOG_MODAL|
47                                                GTK_DIALOG_DESTROY_WITH_PARENT|
48                                                GTK_DIALOG_USE_HEADER_BAR,
49                                                GTK_MESSAGE_INFO,
50                                                GTK_BUTTONS_NONE,
51                                                "Empty all items from Wastebasket?"));
52   gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
53                                             "All items in the Wastebasket will be permanently deleted");
54   gtk_dialog_add_buttons (GTK_DIALOG (dialog),
55                           "Cancel", GTK_RESPONSE_CANCEL,
56                           "Empty Wastebasket", GTK_RESPONSE_OK,
57                           NULL);
58 
59   gtk_window_present (GTK_WINDOW (dialog));
60   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
61 }
62 
63 static void
show_color_chooser(GtkWindow * parent)64 show_color_chooser (GtkWindow *parent)
65 {
66   GtkWidget *dialog;
67 
68   dialog = gtk_color_chooser_dialog_new ("Builtin", parent);
69   gtk_window_present (GTK_WINDOW (dialog));
70   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
71 }
72 
73 static void
show_color_chooser_generic(GtkWindow * parent)74 show_color_chooser_generic (GtkWindow *parent)
75 {
76   GtkWidget *dialog;
77 
78   dialog = g_object_new (GTK_TYPE_COLOR_CHOOSER_DIALOG,
79                          "title", "Generic Builtin",
80                          "transient-for", parent,
81                          NULL);
82 
83   gtk_window_present (GTK_WINDOW (dialog));
84   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
85 }
86 
87 static void
add_content(GtkWidget * dialog)88 add_content (GtkWidget *dialog)
89 {
90   GtkWidget *label;
91 
92   label = gtk_label_new ("content");
93   gtk_widget_set_margin_start (label, 50);
94   gtk_widget_set_margin_end (label, 50);
95   gtk_widget_set_margin_top (label, 50);
96   gtk_widget_set_margin_bottom (label, 50);
97   gtk_widget_set_hexpand (label, TRUE);
98   gtk_widget_set_vexpand (label, TRUE);
99 
100   gtk_box_append (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), label);
101 }
102 
103 static void
add_buttons(GtkWidget * dialog)104 add_buttons (GtkWidget *dialog)
105 {
106   gtk_dialog_add_button (GTK_DIALOG (dialog), "Done", GTK_RESPONSE_OK);
107   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
108 }
109 
110 static void
show_dialog(GtkWindow * parent)111 show_dialog (GtkWindow *parent)
112 {
113   GtkWidget *dialog;
114 
115   dialog = gtk_dialog_new_with_buttons ("Simple", parent,
116 					GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
117 				        "Close", GTK_RESPONSE_CLOSE,
118                                         NULL);
119 
120   add_content (dialog);
121   gtk_window_present (GTK_WINDOW (dialog));
122   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
123 }
124 
125 static void
show_dialog_with_header(GtkWindow * parent)126 show_dialog_with_header (GtkWindow *parent)
127 {
128   GtkWidget *dialog;
129 
130   dialog = gtk_dialog_new_with_buttons ("With Header", parent,
131 					GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
132 				        "Close", GTK_RESPONSE_CLOSE,
133                                         NULL);
134 
135   add_content (dialog);
136   gtk_window_present (GTK_WINDOW (dialog));
137   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
138 }
139 
140 static void
show_dialog_with_buttons(GtkWindow * parent)141 show_dialog_with_buttons (GtkWindow *parent)
142 {
143   GtkWidget *dialog;
144 
145   dialog = gtk_dialog_new_with_buttons ("With Buttons", parent,
146 					GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
147 				        "Close", GTK_RESPONSE_CLOSE,
148 				        "Frob", 25,
149                                         NULL);
150 
151   add_content (dialog);
152   gtk_window_present (GTK_WINDOW (dialog));
153   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
154 }
155 
156 static void
show_dialog_with_header_buttons(GtkWindow * parent)157 show_dialog_with_header_buttons (GtkWindow *parent)
158 {
159   GtkWidget *dialog;
160 
161   dialog = gtk_dialog_new_with_buttons ("Header & Buttons", parent,
162 					GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
163 				        "Close", GTK_RESPONSE_CLOSE,
164 				        "Frob", 25,
165                                         NULL);
166 
167   add_content (dialog);
168   gtk_window_present (GTK_WINDOW (dialog));
169   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
170 }
171 
172 static void
show_dialog_with_header_buttons2(GtkWindow * parent)173 show_dialog_with_header_buttons2 (GtkWindow *parent)
174 {
175   GtkBuilder *builder;
176   GtkWidget *dialog;
177 
178   builder = gtk_builder_new_from_file ("dialog.ui");
179   dialog = (GtkWidget *)gtk_builder_get_object (builder, "dialog");
180   g_object_unref (builder);
181   gtk_window_present (GTK_WINDOW (dialog));
182   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
183 }
184 
185 typedef struct {
186   GtkDialog parent;
187 } MyDialog;
188 
189 typedef struct {
190   GtkDialogClass parent_class;
191 } MyDialogClass;
192 
193 static GType my_dialog_get_type (void);
194 G_DEFINE_TYPE (MyDialog, my_dialog, GTK_TYPE_DIALOG);
195 
196 static void
my_dialog_init(MyDialog * dialog)197 my_dialog_init (MyDialog *dialog)
198 {
199   gtk_widget_init_template (GTK_WIDGET (dialog));
200 }
201 
202 static void
my_dialog_class_init(MyDialogClass * class)203 my_dialog_class_init (MyDialogClass *class)
204 {
205   char *buffer;
206   gsize size;
207   GBytes *bytes;
208 
209   if (!g_file_get_contents ("mydialog.ui", &buffer, &size, NULL))
210     g_error ("Template file mydialog.ui not found");
211 
212   bytes = g_bytes_new_static (buffer, size);
213   gtk_widget_class_set_template (GTK_WIDGET_CLASS (class), bytes);
214   g_bytes_unref (bytes);
215 }
216 
217 static void
show_dialog_from_template(GtkWindow * parent)218 show_dialog_from_template (GtkWindow *parent)
219 {
220   GtkWidget *dialog;
221 
222   dialog = g_object_new (my_dialog_get_type (),
223                          "title", "Template",
224                          "transient-for", parent,
225                          NULL);
226 
227   add_content (dialog);
228   gtk_window_present (GTK_WINDOW (dialog));
229   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
230 }
231 
232 static void
show_dialog_flex_template(GtkWindow * parent)233 show_dialog_flex_template (GtkWindow *parent)
234 {
235   GtkWidget *dialog;
236   gboolean use_header;
237 
238   g_object_get (gtk_settings_get_default (),
239                 "gtk-dialogs-use-header", &use_header,
240                 NULL);
241   dialog = g_object_new (my_dialog_get_type (),
242                          "title", "Flexible Template",
243                          "transient-for", parent,
244                          "use-header-bar", use_header,
245                          NULL);
246 
247   add_content (dialog);
248   gtk_window_present (GTK_WINDOW (dialog));
249   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
250 }
251 
252 typedef struct {
253   GtkDialog parent;
254 
255   GtkWidget *content;
256 } MyDialog2;
257 
258 typedef struct {
259   GtkDialogClass parent_class;
260 } MyDialog2Class;
261 
262 static GType my_dialog2_get_type (void);
263 G_DEFINE_TYPE (MyDialog2, my_dialog2, GTK_TYPE_DIALOG);
264 
265 static void
my_dialog2_init(MyDialog2 * dialog)266 my_dialog2_init (MyDialog2 *dialog)
267 {
268   gtk_widget_init_template (GTK_WIDGET (dialog));
269 }
270 
271 static void
my_dialog2_class_init(MyDialog2Class * class)272 my_dialog2_class_init (MyDialog2Class *class)
273 {
274   char *buffer;
275   gsize size;
276   GBytes *bytes;
277 
278   if (!g_file_get_contents ("mydialog2.ui", &buffer, &size, NULL))
279     g_error ("Template file mydialog2.ui not found");
280 
281   bytes = g_bytes_new_static (buffer, size);
282   gtk_widget_class_set_template (GTK_WIDGET_CLASS (class), bytes);
283   g_bytes_unref (bytes);
284 
285   gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), MyDialog2, content);
286 }
287 
288 static void
show_dialog_from_template_with_header(GtkWindow * parent)289 show_dialog_from_template_with_header (GtkWindow *parent)
290 {
291   GtkWidget *dialog;
292 
293   dialog = g_object_new (my_dialog2_get_type (),
294                          "transient-for", parent,
295                          "use-header-bar", TRUE,
296                          NULL);
297 
298   add_buttons (dialog);
299   add_content (dialog);
300   gtk_window_present (GTK_WINDOW (dialog));
301   g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
302 }
303 
304 int
main(int argc,char * argv[])305 main (int argc, char *argv[])
306 {
307   GtkWidget *window;
308   GtkWidget *vbox;
309   GtkWidget *box;
310   GtkWidget *button;
311 
312 #ifdef GTK_SRCDIR
313   g_chdir (GTK_SRCDIR);
314 #endif
315 
316   gtk_init ();
317 
318   window = gtk_window_new ();
319   gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
320 
321   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
322   gtk_widget_set_halign (vbox, GTK_ALIGN_FILL);
323   gtk_widget_set_valign (vbox, GTK_ALIGN_CENTER);
324   gtk_window_set_child (GTK_WINDOW (window), vbox);
325 
326   box = gtk_flow_box_new ();
327   gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (box), GTK_SELECTION_NONE);
328   gtk_widget_set_hexpand (box, TRUE);
329   gtk_box_append (GTK_BOX (vbox), box);
330 
331   button = gtk_button_new_with_label ("Message dialog");
332   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_message_dialog1), window);
333   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
334 
335   button = gtk_button_new_with_label ("Message with icon");
336   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_message_dialog1a), window);
337   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
338 
339   button = gtk_button_new_with_label ("Confirmation dialog");
340   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_message_dialog2), window);
341   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
342 
343   button = gtk_button_new_with_label ("Builtin");
344   button = gtk_button_new_with_label ("Builtin");
345   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_color_chooser), window);
346   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
347 
348   button = gtk_button_new_with_label ("Generic Builtin");
349   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_color_chooser_generic), window);
350   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
351 
352   button = gtk_button_new_with_label ("Simple");
353   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog), window);
354   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
355 
356   button = gtk_button_new_with_label ("With Header");
357   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_with_header), window);
358   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
359 
360   button = gtk_button_new_with_label ("With Buttons");
361   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_with_buttons), window);
362   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
363 
364   button = gtk_button_new_with_label ("Header & Buttons");
365   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_with_header_buttons), window);
366   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
367 
368   button = gtk_button_new_with_label ("Header & Buttons & Builder");
369   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_with_header_buttons2), window);
370   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
371 
372   button = gtk_button_new_with_label ("Template");
373   button = gtk_button_new_with_label ("Template");
374   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_from_template), window);
375   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
376 
377   button = gtk_button_new_with_label ("Template With Header");
378   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_from_template_with_header), window);
379   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
380 
381   button = gtk_button_new_with_label ("Flexible Template");
382   g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog_flex_template), window);
383   gtk_flow_box_insert (GTK_FLOW_BOX (box), button, -1);
384 
385   button = gtk_check_button_new_with_label ("Dialogs have headers");
386   g_object_bind_property (gtk_settings_get_default (), "gtk-dialogs-use-header",
387                           button, "active",
388                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
389   gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
390   gtk_box_append (GTK_BOX (vbox), button);
391 
392   button = gtk_spinner_new ();
393   gtk_spinner_start (GTK_SPINNER (button));
394   gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
395   gtk_box_append (GTK_BOX (vbox), button);
396 
397   while (TRUE)
398     g_main_context_iteration (NULL, TRUE);
399 
400   return 0;
401 }
402 
403