1#include <gtk/gtk.h>
2#include <glib/gstdio.h>
3
4static void
5show_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 message_format: "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
23static void
24show_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
40static void
41show_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 message_format: "All items in the Wastebasket will be permanently deleted");
54 gtk_dialog_add_buttons (GTK_DIALOG (dialog),
55 first_button_text: "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
63static void
64show_color_chooser (GtkWindow *parent)
65{
66 GtkWidget *dialog;
67
68 dialog = gtk_color_chooser_dialog_new (title: "Builtin", parent);
69 gtk_window_present (GTK_WINDOW (dialog));
70 g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
71}
72
73static void
74show_color_chooser_generic (GtkWindow *parent)
75{
76 GtkWidget *dialog;
77
78 dialog = g_object_new (GTK_TYPE_COLOR_CHOOSER_DIALOG,
79 first_property_name: "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
87static void
88add_content (GtkWidget *dialog)
89{
90 GtkWidget *label;
91
92 label = gtk_label_new (str: "content");
93 gtk_widget_set_margin_start (widget: label, margin: 50);
94 gtk_widget_set_margin_end (widget: label, margin: 50);
95 gtk_widget_set_margin_top (widget: label, margin: 50);
96 gtk_widget_set_margin_bottom (widget: label, margin: 50);
97 gtk_widget_set_hexpand (widget: label, TRUE);
98 gtk_widget_set_vexpand (widget: label, TRUE);
99
100 gtk_box_append (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), child: label);
101}
102
103static void
104add_buttons (GtkWidget *dialog)
105{
106 gtk_dialog_add_button (GTK_DIALOG (dialog), button_text: "Done", response_id: GTK_RESPONSE_OK);
107 gtk_dialog_set_default_response (GTK_DIALOG (dialog), response_id: GTK_RESPONSE_OK);
108}
109
110static void
111show_dialog (GtkWindow *parent)
112{
113 GtkWidget *dialog;
114
115 dialog = gtk_dialog_new_with_buttons (title: "Simple", parent,
116 flags: GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
117 first_button_text: "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
125static void
126show_dialog_with_header (GtkWindow *parent)
127{
128 GtkWidget *dialog;
129
130 dialog = gtk_dialog_new_with_buttons (title: "With Header", parent,
131 flags: GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
132 first_button_text: "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
140static void
141show_dialog_with_buttons (GtkWindow *parent)
142{
143 GtkWidget *dialog;
144
145 dialog = gtk_dialog_new_with_buttons (title: "With Buttons", parent,
146 flags: GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
147 first_button_text: "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
156static void
157show_dialog_with_header_buttons (GtkWindow *parent)
158{
159 GtkWidget *dialog;
160
161 dialog = gtk_dialog_new_with_buttons (title: "Header & Buttons", parent,
162 flags: GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
163 first_button_text: "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
172static void
173show_dialog_with_header_buttons2 (GtkWindow *parent)
174{
175 GtkBuilder *builder;
176 GtkWidget *dialog;
177
178 builder = gtk_builder_new_from_file (filename: "dialog.ui");
179 dialog = (GtkWidget *)gtk_builder_get_object (builder, name: "dialog");
180 g_object_unref (object: builder);
181 gtk_window_present (GTK_WINDOW (dialog));
182 g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
183}
184
185typedef struct {
186 GtkDialog parent;
187} MyDialog;
188
189typedef struct {
190 GtkDialogClass parent_class;
191} MyDialogClass;
192
193static GType my_dialog_get_type (void);
194G_DEFINE_TYPE (MyDialog, my_dialog, GTK_TYPE_DIALOG);
195
196static void
197my_dialog_init (MyDialog *dialog)
198{
199 gtk_widget_init_template (GTK_WIDGET (dialog));
200}
201
202static void
203my_dialog_class_init (MyDialogClass *class)
204{
205 char *buffer;
206 gsize size;
207 GBytes *bytes;
208
209 if (!g_file_get_contents (filename: "mydialog.ui", contents: &buffer, length: &size, NULL))
210 g_error ("Template file mydialog.ui not found");
211
212 bytes = g_bytes_new_static (data: buffer, size);
213 gtk_widget_class_set_template (GTK_WIDGET_CLASS (class), template_bytes: bytes);
214 g_bytes_unref (bytes);
215}
216
217static void
218show_dialog_from_template (GtkWindow *parent)
219{
220 GtkWidget *dialog;
221
222 dialog = g_object_new (object_type: my_dialog_get_type (),
223 first_property_name: "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
232static void
233show_dialog_flex_template (GtkWindow *parent)
234{
235 GtkWidget *dialog;
236 gboolean use_header;
237
238 g_object_get (object: gtk_settings_get_default (),
239 first_property_name: "gtk-dialogs-use-header", &use_header,
240 NULL);
241 dialog = g_object_new (object_type: my_dialog_get_type (),
242 first_property_name: "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
252typedef struct {
253 GtkDialog parent;
254
255 GtkWidget *content;
256} MyDialog2;
257
258typedef struct {
259 GtkDialogClass parent_class;
260} MyDialog2Class;
261
262static GType my_dialog2_get_type (void);
263G_DEFINE_TYPE (MyDialog2, my_dialog2, GTK_TYPE_DIALOG);
264
265static void
266my_dialog2_init (MyDialog2 *dialog)
267{
268 gtk_widget_init_template (GTK_WIDGET (dialog));
269}
270
271static void
272my_dialog2_class_init (MyDialog2Class *class)
273{
274 char *buffer;
275 gsize size;
276 GBytes *bytes;
277
278 if (!g_file_get_contents (filename: "mydialog2.ui", contents: &buffer, length: &size, NULL))
279 g_error ("Template file mydialog2.ui not found");
280
281 bytes = g_bytes_new_static (data: buffer, size);
282 gtk_widget_class_set_template (GTK_WIDGET_CLASS (class), template_bytes: bytes);
283 g_bytes_unref (bytes);
284
285 gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), MyDialog2, content);
286}
287
288static void
289show_dialog_from_template_with_header (GtkWindow *parent)
290{
291 GtkWidget *dialog;
292
293 dialog = g_object_new (object_type: my_dialog2_get_type (),
294 first_property_name: "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
304int
305main (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), width: 600, height: 400);
320
321 vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 5);
322 gtk_widget_set_halign (widget: vbox, align: GTK_ALIGN_FILL);
323 gtk_widget_set_valign (widget: vbox, align: GTK_ALIGN_CENTER);
324 gtk_window_set_child (GTK_WINDOW (window), child: vbox);
325
326 box = gtk_flow_box_new ();
327 gtk_flow_box_set_selection_mode (GTK_FLOW_BOX (box), mode: GTK_SELECTION_NONE);
328 gtk_widget_set_hexpand (widget: box, TRUE);
329 gtk_box_append (GTK_BOX (vbox), child: box);
330
331 button = gtk_button_new_with_label (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), widget: button, position: -1);
334
335 button = gtk_button_new_with_label (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), widget: button, position: -1);
338
339 button = gtk_button_new_with_label (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), widget: button, position: -1);
342
343 button = gtk_button_new_with_label (label: "Builtin");
344 button = gtk_button_new_with_label (label: "Builtin");
345 g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_color_chooser), window);
346 gtk_flow_box_insert (GTK_FLOW_BOX (box), widget: button, position: -1);
347
348 button = gtk_button_new_with_label (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), widget: button, position: -1);
351
352 button = gtk_button_new_with_label (label: "Simple");
353 g_signal_connect_swapped (button, "clicked", G_CALLBACK (show_dialog), window);
354 gtk_flow_box_insert (GTK_FLOW_BOX (box), widget: button, position: -1);
355
356 button = gtk_button_new_with_label (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), widget: button, position: -1);
359
360 button = gtk_button_new_with_label (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), widget: button, position: -1);
363
364 button = gtk_button_new_with_label (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), widget: button, position: -1);
367
368 button = gtk_button_new_with_label (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), widget: button, position: -1);
371
372 button = gtk_button_new_with_label (label: "Template");
373 button = gtk_button_new_with_label (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), widget: button, position: -1);
376
377 button = gtk_button_new_with_label (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), widget: button, position: -1);
380
381 button = gtk_button_new_with_label (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), widget: button, position: -1);
384
385 button = gtk_check_button_new_with_label (label: "Dialogs have headers");
386 g_object_bind_property (source: gtk_settings_get_default (), source_property: "gtk-dialogs-use-header",
387 target: button, target_property: "active",
388 flags: G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE);
389 gtk_widget_set_halign (widget: button, align: GTK_ALIGN_CENTER);
390 gtk_box_append (GTK_BOX (vbox), child: button);
391
392 button = gtk_spinner_new ();
393 gtk_spinner_start (GTK_SPINNER (button));
394 gtk_widget_set_halign (widget: button, align: GTK_ALIGN_CENTER);
395 gtk_box_append (GTK_BOX (vbox), child: button);
396
397 while (TRUE)
398 g_main_context_iteration (NULL, TRUE);
399
400 return 0;
401}
402
403

source code of gtk/tests/testdialog.c