1 | #include <gtk/gtk.h> |
2 | #include <glib/gstdio.h> |
3 | |
4 | static void |
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 | 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 | |
23 | static void |
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 |
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 | 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 | |
63 | static void |
64 | show_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 | |
73 | static void |
74 | show_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 | |
87 | static void |
88 | add_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 | |
103 | static void |
104 | add_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 | |
110 | static void |
111 | show_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 | |
125 | static void |
126 | (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 | |
140 | static void |
141 | show_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 | |
156 | static void |
157 | (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 | |
172 | static void |
173 | (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 | |
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 |
197 | my_dialog_init (MyDialog *dialog) |
198 | { |
199 | gtk_widget_init_template (GTK_WIDGET (dialog)); |
200 | } |
201 | |
202 | static void |
203 | my_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 | |
217 | static void |
218 | show_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 | |
232 | static void |
233 | show_dialog_flex_template (GtkWindow *parent) |
234 | { |
235 | GtkWidget *dialog; |
236 | gboolean ; |
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 | |
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 |
266 | my_dialog2_init (MyDialog2 *dialog) |
267 | { |
268 | gtk_widget_init_template (GTK_WIDGET (dialog)); |
269 | } |
270 | |
271 | static void |
272 | my_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 | |
288 | static void |
289 | (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 | |
304 | int |
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), 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 | |