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