1/* Dialogs
2 * #Keywords: GtkMessageDialog
3 *
4 * Dialogs are used to pop up transient windows for information
5 * and user feedback.
6 */
7
8#include <glib/gi18n.h>
9#include <gtk/gtk.h>
10
11static GtkWidget *window = NULL;
12static GtkWidget *entry1 = NULL;
13static GtkWidget *entry2 = NULL;
14
15static void
16message_dialog_clicked (GtkButton *button,
17 gpointer user_data)
18{
19 GtkWidget *dialog;
20 static int i = 1;
21
22 dialog = gtk_message_dialog_new (GTK_WINDOW (window),
23 flags: GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
24 type: GTK_MESSAGE_INFO,
25 buttons: GTK_BUTTONS_OK_CANCEL,
26 message_format: "Test message");
27 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
28 ngettext ("Has been shown once", "Has been shown %d times", i), i);
29 g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
30 gtk_widget_show (widget: dialog);
31 i++;
32}
33
34typedef struct {
35 GtkWidget *local_entry1;
36 GtkWidget *local_entry2;
37 GtkWidget *global_entry1;
38 GtkWidget *global_entry2;
39} ResponseData;
40
41static void
42on_dialog_response (GtkDialog *dialog,
43 int response,
44 gpointer user_data)
45{
46 ResponseData *data = user_data;
47
48 if (response == GTK_RESPONSE_OK)
49 {
50 gtk_editable_set_text (GTK_EDITABLE (data->global_entry1),
51 text: gtk_editable_get_text (GTK_EDITABLE (data->local_entry1)));
52 gtk_editable_set_text (GTK_EDITABLE (data->global_entry2),
53 text: gtk_editable_get_text (GTK_EDITABLE (data->local_entry2)));
54 }
55
56 gtk_window_destroy (GTK_WINDOW (dialog));
57}
58
59static void
60interactive_dialog_clicked (GtkButton *button,
61 gpointer user_data)
62{
63 GtkWidget *content_area;
64 GtkWidget *dialog;
65 GtkWidget *table;
66 GtkWidget *local_entry1;
67 GtkWidget *local_entry2;
68 GtkWidget *label;
69 ResponseData *data;
70
71 dialog = gtk_dialog_new_with_buttons (title: "Interactive Dialog",
72 GTK_WINDOW (window),
73 flags: GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR,
74 _("_OK"), GTK_RESPONSE_OK,
75 _("_Cancel"), GTK_RESPONSE_CANCEL,
76 NULL);
77
78 gtk_dialog_set_default_response (GTK_DIALOG (dialog), response_id: GTK_RESPONSE_OK);
79
80 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
81
82 table = gtk_grid_new ();
83 gtk_widget_set_hexpand (widget: table, TRUE);
84 gtk_widget_set_vexpand (widget: table, TRUE);
85 gtk_widget_set_halign (widget: table, align: GTK_ALIGN_CENTER);
86 gtk_widget_set_valign (widget: table, align: GTK_ALIGN_CENTER);
87 gtk_box_append (GTK_BOX (content_area), child: table);
88 gtk_grid_set_row_spacing (GTK_GRID (table), spacing: 6);
89 gtk_grid_set_column_spacing (GTK_GRID (table), spacing: 6);
90
91 label = gtk_label_new_with_mnemonic (str: "_Entry 1");
92 gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 0, width: 1, height: 1);
93 local_entry1 = gtk_entry_new ();
94 gtk_editable_set_text (GTK_EDITABLE (local_entry1), text: gtk_editable_get_text (GTK_EDITABLE (entry1)));
95 gtk_grid_attach (GTK_GRID (table), child: local_entry1, column: 1, row: 0, width: 1, height: 1);
96 gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: local_entry1);
97
98 label = gtk_label_new_with_mnemonic (str: "E_ntry 2");
99 gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 1, width: 1, height: 1);
100
101 local_entry2 = gtk_entry_new ();
102 gtk_editable_set_text (GTK_EDITABLE (local_entry2), text: gtk_editable_get_text (GTK_EDITABLE (entry2)));
103 gtk_grid_attach (GTK_GRID (table), child: local_entry2, column: 1, row: 1, width: 1, height: 1);
104 gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: local_entry2);
105
106 data = g_new (ResponseData, 1);
107 data->local_entry1 = local_entry1;
108 data->local_entry2 = local_entry2;
109 data->global_entry1 = entry1;
110 data->global_entry2 = entry2;
111
112 g_signal_connect_data (instance: dialog, detailed_signal: "response",
113 G_CALLBACK (on_dialog_response),
114 data, destroy_data: (GClosureNotify) g_free,
115 connect_flags: 0);
116
117 gtk_widget_show (widget: dialog);
118}
119
120GtkWidget *
121do_dialog (GtkWidget *do_widget)
122{
123 GtkWidget *vbox;
124 GtkWidget *vbox2;
125 GtkWidget *hbox;
126 GtkWidget *button;
127 GtkWidget *table;
128 GtkWidget *label;
129
130 if (!window)
131 {
132 window = gtk_window_new ();
133 gtk_window_set_display (GTK_WINDOW (window),
134 display: gtk_widget_get_display (widget: do_widget));
135 gtk_window_set_title (GTK_WINDOW (window), title: "Dialogs");
136 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
137 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
138
139 vbox = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 8);
140 gtk_widget_set_margin_start (widget: vbox, margin: 8);
141 gtk_widget_set_margin_end (widget: vbox, margin: 8);
142 gtk_widget_set_margin_top (widget: vbox, margin: 8);
143 gtk_widget_set_margin_bottom (widget: vbox, margin: 8);
144 gtk_window_set_child (GTK_WINDOW (window), child: vbox);
145
146 /* Standard message dialog */
147 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 8);
148 gtk_box_append (GTK_BOX (vbox), child: hbox);
149 button = gtk_button_new_with_mnemonic (label: "_Message Dialog");
150 g_signal_connect (button, "clicked",
151 G_CALLBACK (message_dialog_clicked), NULL);
152 gtk_box_append (GTK_BOX (hbox), child: button);
153
154 gtk_box_append (GTK_BOX (vbox), child: gtk_separator_new (orientation: GTK_ORIENTATION_HORIZONTAL));
155
156 /* Interactive dialog*/
157 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 8);
158 gtk_box_append (GTK_BOX (vbox), child: hbox);
159 vbox2 = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0);
160
161 button = gtk_button_new_with_mnemonic (label: "_Interactive Dialog");
162 g_signal_connect (button, "clicked",
163 G_CALLBACK (interactive_dialog_clicked), NULL);
164 gtk_box_append (GTK_BOX (hbox), child: vbox2);
165 gtk_box_append (GTK_BOX (vbox2), child: button);
166
167 table = gtk_grid_new ();
168 gtk_grid_set_row_spacing (GTK_GRID (table), spacing: 4);
169 gtk_grid_set_column_spacing (GTK_GRID (table), spacing: 4);
170 gtk_box_append (GTK_BOX (hbox), child: table);
171
172 label = gtk_label_new_with_mnemonic (str: "_Entry 1");
173 gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 0, width: 1, height: 1);
174
175 entry1 = gtk_entry_new ();
176 gtk_grid_attach (GTK_GRID (table), child: entry1, column: 1, row: 0, width: 1, height: 1);
177 gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget: entry1);
178
179 label = gtk_label_new_with_mnemonic (str: "E_ntry 2");
180 gtk_grid_attach (GTK_GRID (table), child: label, column: 0, row: 1, width: 1, height: 1);
181
182 entry2 = gtk_entry_new ();
183 gtk_grid_attach (GTK_GRID (table), child: entry2, column: 1, row: 1, width: 1, height: 1);
184 }
185
186 if (!gtk_widget_get_visible (widget: window))
187 gtk_widget_show (widget: window);
188 else
189 gtk_window_destroy (GTK_WINDOW (window));
190
191 return window;
192}
193

source code of gtk/demos/gtk-demo/dialog.c