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 | ... | ... |