Commit ed33abb70f0f75289e7ad56b571a1301e25981d8
1 parent
7727b019
Exists in
master
and in
1 other branch
Refactoring popup engine.
Showing
6 changed files
with
119 additions
and
37 deletions
Show diff stats
src/dialogs/popups.c
... | ... | @@ -40,6 +40,24 @@ |
40 | 40 | |
41 | 41 | g_return_val_if_fail(GTK_IS_WIDGET(widget),GTK_RESPONSE_NONE); |
42 | 42 | |
43 | + // Check if the dialog is enabled | |
44 | + if(popup->name && GTK_IS_V3270(widget)) { | |
45 | + | |
46 | + GtkResponseType response = GTK_RESPONSE_NONE; | |
47 | + | |
48 | + v3270_signal_emit( | |
49 | + widget, | |
50 | + V3270_SIGNAL_LOAD_POPUP_RESPONSE, | |
51 | + popup->name, | |
52 | + response, | |
53 | + &response | |
54 | + ); | |
55 | + | |
56 | + if(response != GTK_RESPONSE_NONE) | |
57 | + return response; | |
58 | + | |
59 | + } | |
60 | + | |
43 | 61 | // Popup settings. |
44 | 62 | static const struct _settings { |
45 | 63 | GtkMessageType type; |
... | ... | @@ -51,40 +69,30 @@ |
51 | 69 | { |
52 | 70 | .type = GTK_MESSAGE_INFO, |
53 | 71 | .button = N_("_Ok"), |
54 | - .title = N_("Information") | |
55 | - | |
56 | 72 | }, |
57 | 73 | |
58 | 74 | // LIB3270_NOTIFY_WARNING - Warning message. |
59 | 75 | { |
60 | 76 | .type = GTK_MESSAGE_WARNING, |
61 | 77 | .button = N_("_Ok"), |
62 | - .title = N_("Warning") | |
63 | - | |
64 | 78 | }, |
65 | 79 | |
66 | 80 | // LIB3270_NOTIFY_ERROR - Error message. |
67 | 81 | { |
68 | 82 | .type = GTK_MESSAGE_ERROR, |
69 | 83 | .button = N_("_Ok"), |
70 | - .title = N_("Error") | |
71 | - | |
72 | 84 | }, |
73 | 85 | |
74 | 86 | // LIB3270_NOTIFY_CRITICAL - Critical error, user can abort application. |
75 | 87 | { |
76 | 88 | .type = GTK_MESSAGE_ERROR, |
77 | 89 | .button = N_("_Close"), |
78 | - .title = N_("Critical Error") | |
79 | - | |
80 | 90 | }, |
81 | 91 | |
82 | 92 | // LIB3270_NOTIFY_SECURE - Secure host dialog. |
83 | 93 | { |
84 | 94 | .type = GTK_MESSAGE_OTHER, |
85 | 95 | .button = N_("_Ok"), |
86 | - .title = N_("Security alert") | |
87 | - | |
88 | 96 | } |
89 | 97 | |
90 | 98 | }; |
... | ... | @@ -96,22 +104,46 @@ |
96 | 104 | GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, |
97 | 105 | settings[popup->type].type, |
98 | 106 | GTK_BUTTONS_NONE, |
99 | - "%s",popup->summary | |
107 | + "<b><big>%s</big></b>",popup->summary | |
100 | 108 | ); |
101 | 109 | |
102 | 110 | if(popup->body) { |
103 | - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",popup->body); | |
111 | + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"<small>%s</small>",popup->body); | |
104 | 112 | } |
105 | 113 | |
106 | 114 | if(popup->title) { |
107 | 115 | gtk_window_set_title(GTK_WINDOW(dialog),popup->title); |
108 | - } else { | |
109 | - gtk_window_set_title(GTK_WINDOW(dialog),g_dgettext(GETTEXT_PACKAGE,settings[popup->type].title)); | |
110 | 116 | } |
111 | 117 | |
112 | - | |
113 | 118 | if(wait) { |
114 | 119 | |
120 | + GtkWidget * dont_ask = NULL; | |
121 | + | |
122 | +#ifdef DEBUG | |
123 | + if(popup->name && GTK_IS_V3270(widget)) { | |
124 | + // Set check button | |
125 | + dont_ask = gtk_check_button_new_with_label(_("Don't ask again")); | |
126 | + | |
127 | + gtk_widget_set_can_focus(dont_ask,FALSE); | |
128 | + gtk_widget_set_can_default(dont_ask,FALSE); | |
129 | + | |
130 | +#if GTK_CHECK_VERSION(3,20,0) | |
131 | + gtk_widget_set_focus_on_click(dont_ask,FALSE); | |
132 | +#endif // GTK 3,20,0 | |
133 | + | |
134 | + //gtk_widget_set_valign(dont_ask, GTK_ALIGN_BASELINE); | |
135 | + //gtk_widget_set_halign(dont_ask, GTK_ALIGN_START); | |
136 | + | |
137 | + gtk_box_pack_start( | |
138 | + GTK_BOX(gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog))), | |
139 | + dont_ask, | |
140 | + TRUE, | |
141 | + TRUE, | |
142 | + 0 | |
143 | + ); | |
144 | + } | |
145 | +#endif // DEBUG | |
146 | + | |
115 | 147 | // Wait for response. |
116 | 148 | if(popup->label) { |
117 | 149 | |
... | ... | @@ -129,7 +161,24 @@ |
129 | 161 | } |
130 | 162 | |
131 | 163 | gtk_widget_show_all(dialog); |
132 | - gint rc = gtk_dialog_run(GTK_DIALOG(dialog)); | |
164 | + GtkResponseType rc = gtk_dialog_run(GTK_DIALOG(dialog)); | |
165 | + | |
166 | + if(dont_ask && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dont_ask))) { | |
167 | + | |
168 | + gboolean saved = FALSE; | |
169 | + | |
170 | + v3270_signal_emit( | |
171 | + widget, | |
172 | + V3270_SIGNAL_SAVE_POPUP_RESPONSE, | |
173 | + popup->name, | |
174 | + rc, | |
175 | + &saved | |
176 | + ); | |
177 | + | |
178 | + debug("response was %s",saved ? "saved" : "not saved"); | |
179 | + | |
180 | + } | |
181 | + | |
133 | 182 | gtk_widget_destroy(dialog); |
134 | 183 | return rc; |
135 | 184 | |
... | ... | @@ -147,26 +196,6 @@ |
147 | 196 | |
148 | 197 | } |
149 | 198 | |
150 | - /* | |
151 | - void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *title, const gchar *message, const gchar *text) { | |
152 | - | |
153 | - LIB3270_POPUP popup = { | |
154 | - .type = type, | |
155 | - .body = text | |
156 | - }; | |
157 | - | |
158 | - if(message) { | |
159 | - popup.summary = message; | |
160 | - popup.title = title; | |
161 | - } else { | |
162 | - popup.summary = title; | |
163 | - } | |
164 | - | |
165 | - v3270_show_popup(widget, &popup, FALSE); | |
166 | - | |
167 | - } | |
168 | - */ | |
169 | - | |
170 | 199 | void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) { |
171 | 200 | |
172 | 201 | LIB3270_POPUP popup = { | ... | ... |
src/include/internals.h
... | ... | @@ -114,7 +114,9 @@ |
114 | 114 | // |
115 | 115 | // Settings signals (Mostly fired by V3270Settings dialogs). |
116 | 116 | // |
117 | - V3270_SIGNAL_SAVE_SETTINGS, ///< @brief Notify main application to save all widget settings. | |
117 | + V3270_SIGNAL_SAVE_SETTINGS, ///< @brief Notify main application to save all widget settings. | |
118 | + V3270_SIGNAL_LOAD_POPUP_RESPONSE, ///< @brief Load popup response (GTK_RESPONSE_NONE to show popup). | |
119 | + V3270_SIGNAL_SAVE_POPUP_RESPONSE, ///< @brief Save popup response. | |
118 | 120 | |
119 | 121 | V3270_SIGNAL_LAST |
120 | 122 | }; | ... | ... |
src/include/terminal.h
... | ... | @@ -105,6 +105,8 @@ G_BEGIN_DECLS |
105 | 105 | void (*activate)(GtkWidget *widget); |
106 | 106 | void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE_ID toggle_id,gboolean toggle_state,const gchar *toggle_name); |
107 | 107 | void (*message_changed)(v3270 *widget, LIB3270_MESSAGE id); |
108 | + guint (*load_popup_response)(v3270 *widget, const gchar *popup_name, guint response); | |
109 | + gboolean (*save_popup_response)(v3270 *widget, const gchar *popup_name, guint response); | |
108 | 110 | |
109 | 111 | }; |
110 | 112 | ... | ... |
src/terminal/marshal
src/terminal/widget.c
... | ... | @@ -201,6 +201,14 @@ static void finalize(GObject *object) { |
201 | 201 | G_OBJECT_CLASS(v3270_parent_class)->finalize(object); |
202 | 202 | } |
203 | 203 | |
204 | + static GtkResponseType load_popup_response(v3270 G_GNUC_UNUSED(*widget), const gchar G_GNUC_UNUSED(*popup_name), GtkResponseType response) { | |
205 | + return response; | |
206 | + } | |
207 | + | |
208 | + static gboolean save_popup_response(v3270 G_GNUC_UNUSED(*widget), const gchar G_GNUC_UNUSED(*popup_name), GtkResponseType G_GNUC_UNUSED(response)) { | |
209 | + return FALSE; | |
210 | + } | |
211 | + | |
204 | 212 | static void v3270_class_init(v3270Class *klass) |
205 | 213 | { |
206 | 214 | GObjectClass * gobject_class = G_OBJECT_CLASS(klass); |
... | ... | @@ -242,10 +250,13 @@ static void v3270_class_init(v3270Class *klass) |
242 | 250 | klass->activate = v3270_activate; |
243 | 251 | klass->toggle_changed = v3270_toggle_changed; |
244 | 252 | klass->message_changed = v3270_update_message; |
253 | + klass->load_popup_response = load_popup_response; | |
254 | + klass->save_popup_response = save_popup_response; | |
245 | 255 | |
246 | 256 | // Register I/O Handlers |
247 | 257 | v3270_register_io_handlers(klass); |
248 | 258 | |
259 | + | |
249 | 260 | // Cursors |
250 | 261 | { |
251 | 262 | #ifdef WIN32 |
... | ... | @@ -464,6 +475,24 @@ static void v3270_class_init(v3270Class *klass) |
464 | 475 | v3270_VOID__VOID, |
465 | 476 | G_TYPE_NONE, 0); |
466 | 477 | |
478 | + v3270_widget_signal[V3270_SIGNAL_LOAD_POPUP_RESPONSE] = | |
479 | + g_signal_new( I_("load-popup-response"), | |
480 | + G_OBJECT_CLASS_TYPE (gobject_class), | |
481 | + G_SIGNAL_RUN_LAST, | |
482 | + G_STRUCT_OFFSET (v3270Class, load_popup_response), | |
483 | + NULL, NULL, | |
484 | + v3270_UINT__POINTER_UINT, | |
485 | + G_TYPE_UINT, 2, G_TYPE_POINTER, G_TYPE_UINT); | |
486 | + | |
487 | + v3270_widget_signal[V3270_SIGNAL_SAVE_POPUP_RESPONSE] = | |
488 | + g_signal_new( I_("save-popup-response"), | |
489 | + G_OBJECT_CLASS_TYPE (gobject_class), | |
490 | + G_SIGNAL_RUN_LAST, | |
491 | + G_STRUCT_OFFSET (v3270Class, save_popup_response), | |
492 | + NULL, NULL, | |
493 | + v3270_BOOLEAN__POINTER_UINT, | |
494 | + G_TYPE_BOOLEAN, 2, G_TYPE_POINTER, G_TYPE_UINT); | |
495 | + | |
467 | 496 | v3270_init_properties(gobject_class); |
468 | 497 | |
469 | 498 | } | ... | ... |
src/testprogram/toolbar.c
... | ... | @@ -37,6 +37,7 @@ |
37 | 37 | #include <v3270/selection.h> |
38 | 38 | #include <v3270/trace.h> |
39 | 39 | #include <lib3270/log.h> |
40 | + #include <lib3270/popup.h> | |
40 | 41 | #include <stdlib.h> |
41 | 42 | |
42 | 43 | #pragma GCC diagnostic ignored "-Wunused-parameter" |
... | ... | @@ -163,6 +164,7 @@ |
163 | 164 | */ |
164 | 165 | |
165 | 166 | |
167 | + /* | |
166 | 168 | { |
167 | 169 | // |
168 | 170 | // Test V3270 FT Dialog |
... | ... | @@ -180,7 +182,22 @@ |
180 | 182 | gtk_widget_show_all(dialog); |
181 | 183 | |
182 | 184 | } |
185 | + */ | |
186 | + | |
187 | + | |
188 | + } | |
189 | + | |
190 | + static void popup_clicked(GtkButton *button, GtkWidget *terminal) | |
191 | + { | |
192 | + | |
193 | + static const LIB3270_POPUP popup = { | |
194 | + .name = "sample_popup", | |
195 | + .type = LIB3270_NOTIFY_INFO, | |
196 | + .summary = "This is the summary of message", | |
197 | + .body = "This it the body of the message, can be used for a bigger explanation" | |
198 | + }; | |
183 | 199 | |
200 | + lib3270_popup_show(v3270_get_session(terminal), &popup, 1); | |
184 | 201 | |
185 | 202 | } |
186 | 203 | |
... | ... | @@ -232,6 +249,7 @@ |
232 | 249 | { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, |
233 | 250 | { "document-save", G_CALLBACK(save_clicked), "Save screen or selection" }, |
234 | 251 | { "document-open", G_CALLBACK(load_clicked), "Paste file" }, |
252 | + { "dialog-information", G_CALLBACK(popup_clicked), "Show test popup" }, | |
235 | 253 | |
236 | 254 | { "applications-system", G_CALLBACK(preferences_clicked), "Session properties" }, |
237 | 255 | ... | ... |