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,6 +40,24 @@ | ||
| 40 | 40 | ||
| 41 | g_return_val_if_fail(GTK_IS_WIDGET(widget),GTK_RESPONSE_NONE); | 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 | // Popup settings. | 61 | // Popup settings. |
| 44 | static const struct _settings { | 62 | static const struct _settings { |
| 45 | GtkMessageType type; | 63 | GtkMessageType type; |
| @@ -51,40 +69,30 @@ | @@ -51,40 +69,30 @@ | ||
| 51 | { | 69 | { |
| 52 | .type = GTK_MESSAGE_INFO, | 70 | .type = GTK_MESSAGE_INFO, |
| 53 | .button = N_("_Ok"), | 71 | .button = N_("_Ok"), |
| 54 | - .title = N_("Information") | ||
| 55 | - | ||
| 56 | }, | 72 | }, |
| 57 | 73 | ||
| 58 | // LIB3270_NOTIFY_WARNING - Warning message. | 74 | // LIB3270_NOTIFY_WARNING - Warning message. |
| 59 | { | 75 | { |
| 60 | .type = GTK_MESSAGE_WARNING, | 76 | .type = GTK_MESSAGE_WARNING, |
| 61 | .button = N_("_Ok"), | 77 | .button = N_("_Ok"), |
| 62 | - .title = N_("Warning") | ||
| 63 | - | ||
| 64 | }, | 78 | }, |
| 65 | 79 | ||
| 66 | // LIB3270_NOTIFY_ERROR - Error message. | 80 | // LIB3270_NOTIFY_ERROR - Error message. |
| 67 | { | 81 | { |
| 68 | .type = GTK_MESSAGE_ERROR, | 82 | .type = GTK_MESSAGE_ERROR, |
| 69 | .button = N_("_Ok"), | 83 | .button = N_("_Ok"), |
| 70 | - .title = N_("Error") | ||
| 71 | - | ||
| 72 | }, | 84 | }, |
| 73 | 85 | ||
| 74 | // LIB3270_NOTIFY_CRITICAL - Critical error, user can abort application. | 86 | // LIB3270_NOTIFY_CRITICAL - Critical error, user can abort application. |
| 75 | { | 87 | { |
| 76 | .type = GTK_MESSAGE_ERROR, | 88 | .type = GTK_MESSAGE_ERROR, |
| 77 | .button = N_("_Close"), | 89 | .button = N_("_Close"), |
| 78 | - .title = N_("Critical Error") | ||
| 79 | - | ||
| 80 | }, | 90 | }, |
| 81 | 91 | ||
| 82 | // LIB3270_NOTIFY_SECURE - Secure host dialog. | 92 | // LIB3270_NOTIFY_SECURE - Secure host dialog. |
| 83 | { | 93 | { |
| 84 | .type = GTK_MESSAGE_OTHER, | 94 | .type = GTK_MESSAGE_OTHER, |
| 85 | .button = N_("_Ok"), | 95 | .button = N_("_Ok"), |
| 86 | - .title = N_("Security alert") | ||
| 87 | - | ||
| 88 | } | 96 | } |
| 89 | 97 | ||
| 90 | }; | 98 | }; |
| @@ -96,22 +104,46 @@ | @@ -96,22 +104,46 @@ | ||
| 96 | GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | 104 | GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, |
| 97 | settings[popup->type].type, | 105 | settings[popup->type].type, |
| 98 | GTK_BUTTONS_NONE, | 106 | GTK_BUTTONS_NONE, |
| 99 | - "%s",popup->summary | 107 | + "<b><big>%s</big></b>",popup->summary |
| 100 | ); | 108 | ); |
| 101 | 109 | ||
| 102 | if(popup->body) { | 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 | if(popup->title) { | 114 | if(popup->title) { |
| 107 | gtk_window_set_title(GTK_WINDOW(dialog),popup->title); | 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 | if(wait) { | 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 | // Wait for response. | 147 | // Wait for response. |
| 116 | if(popup->label) { | 148 | if(popup->label) { |
| 117 | 149 | ||
| @@ -129,7 +161,24 @@ | @@ -129,7 +161,24 @@ | ||
| 129 | } | 161 | } |
| 130 | 162 | ||
| 131 | gtk_widget_show_all(dialog); | 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 | gtk_widget_destroy(dialog); | 182 | gtk_widget_destroy(dialog); |
| 134 | return rc; | 183 | return rc; |
| 135 | 184 | ||
| @@ -147,26 +196,6 @@ | @@ -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 | void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) { | 199 | void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) { |
| 171 | 200 | ||
| 172 | LIB3270_POPUP popup = { | 201 | LIB3270_POPUP popup = { |
src/include/internals.h
| @@ -114,7 +114,9 @@ | @@ -114,7 +114,9 @@ | ||
| 114 | // | 114 | // |
| 115 | // Settings signals (Mostly fired by V3270Settings dialogs). | 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 | V3270_SIGNAL_LAST | 121 | V3270_SIGNAL_LAST |
| 120 | }; | 122 | }; |
src/include/terminal.h
| @@ -105,6 +105,8 @@ G_BEGIN_DECLS | @@ -105,6 +105,8 @@ G_BEGIN_DECLS | ||
| 105 | void (*activate)(GtkWidget *widget); | 105 | void (*activate)(GtkWidget *widget); |
| 106 | void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE_ID toggle_id,gboolean toggle_state,const gchar *toggle_name); | 106 | void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE_ID toggle_id,gboolean toggle_state,const gchar *toggle_name); |
| 107 | void (*message_changed)(v3270 *widget, LIB3270_MESSAGE id); | 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
| @@ -6,6 +6,8 @@ VOID:POINTER | @@ -6,6 +6,8 @@ VOID:POINTER | ||
| 6 | VOID:VOID,POINTER,POINTER | 6 | VOID:VOID,POINTER,POINTER |
| 7 | VOID:VOID,UINT,POINTER | 7 | VOID:VOID,UINT,POINTER |
| 8 | BOOLEAN:UINT,ENUM | 8 | BOOLEAN:UINT,ENUM |
| 9 | +UINT:POINTER,UINT | ||
| 10 | +BOOLEAN:POINTER,UINT | ||
| 9 | VOID:VOID,BOOLEAN | 11 | VOID:VOID,BOOLEAN |
| 10 | BOOLEAN:VOID,BOOLEAN,BOOLEAN,POINTER | 12 | BOOLEAN:VOID,BOOLEAN,BOOLEAN,POINTER |
| 11 | VOID:VOID,UINT,UINT | 13 | VOID:VOID,UINT,UINT |
src/terminal/widget.c
| @@ -201,6 +201,14 @@ static void finalize(GObject *object) { | @@ -201,6 +201,14 @@ static void finalize(GObject *object) { | ||
| 201 | G_OBJECT_CLASS(v3270_parent_class)->finalize(object); | 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 | static void v3270_class_init(v3270Class *klass) | 212 | static void v3270_class_init(v3270Class *klass) |
| 205 | { | 213 | { |
| 206 | GObjectClass * gobject_class = G_OBJECT_CLASS(klass); | 214 | GObjectClass * gobject_class = G_OBJECT_CLASS(klass); |
| @@ -242,10 +250,13 @@ static void v3270_class_init(v3270Class *klass) | @@ -242,10 +250,13 @@ static void v3270_class_init(v3270Class *klass) | ||
| 242 | klass->activate = v3270_activate; | 250 | klass->activate = v3270_activate; |
| 243 | klass->toggle_changed = v3270_toggle_changed; | 251 | klass->toggle_changed = v3270_toggle_changed; |
| 244 | klass->message_changed = v3270_update_message; | 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 | // Register I/O Handlers | 256 | // Register I/O Handlers |
| 247 | v3270_register_io_handlers(klass); | 257 | v3270_register_io_handlers(klass); |
| 248 | 258 | ||
| 259 | + | ||
| 249 | // Cursors | 260 | // Cursors |
| 250 | { | 261 | { |
| 251 | #ifdef WIN32 | 262 | #ifdef WIN32 |
| @@ -464,6 +475,24 @@ static void v3270_class_init(v3270Class *klass) | @@ -464,6 +475,24 @@ static void v3270_class_init(v3270Class *klass) | ||
| 464 | v3270_VOID__VOID, | 475 | v3270_VOID__VOID, |
| 465 | G_TYPE_NONE, 0); | 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 | v3270_init_properties(gobject_class); | 496 | v3270_init_properties(gobject_class); |
| 468 | 497 | ||
| 469 | } | 498 | } |
src/testprogram/toolbar.c
| @@ -37,6 +37,7 @@ | @@ -37,6 +37,7 @@ | ||
| 37 | #include <v3270/selection.h> | 37 | #include <v3270/selection.h> |
| 38 | #include <v3270/trace.h> | 38 | #include <v3270/trace.h> |
| 39 | #include <lib3270/log.h> | 39 | #include <lib3270/log.h> |
| 40 | + #include <lib3270/popup.h> | ||
| 40 | #include <stdlib.h> | 41 | #include <stdlib.h> |
| 41 | 42 | ||
| 42 | #pragma GCC diagnostic ignored "-Wunused-parameter" | 43 | #pragma GCC diagnostic ignored "-Wunused-parameter" |
| @@ -163,6 +164,7 @@ | @@ -163,6 +164,7 @@ | ||
| 163 | */ | 164 | */ |
| 164 | 165 | ||
| 165 | 166 | ||
| 167 | + /* | ||
| 166 | { | 168 | { |
| 167 | // | 169 | // |
| 168 | // Test V3270 FT Dialog | 170 | // Test V3270 FT Dialog |
| @@ -180,7 +182,22 @@ | @@ -180,7 +182,22 @@ | ||
| 180 | gtk_widget_show_all(dialog); | 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,6 +249,7 @@ | ||
| 232 | { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, | 249 | { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, |
| 233 | { "document-save", G_CALLBACK(save_clicked), "Save screen or selection" }, | 250 | { "document-save", G_CALLBACK(save_clicked), "Save screen or selection" }, |
| 234 | { "document-open", G_CALLBACK(load_clicked), "Paste file" }, | 251 | { "document-open", G_CALLBACK(load_clicked), "Paste file" }, |
| 252 | + { "dialog-information", G_CALLBACK(popup_clicked), "Show test popup" }, | ||
| 235 | 253 | ||
| 236 | { "applications-system", G_CALLBACK(preferences_clicked), "Session properties" }, | 254 | { "applications-system", G_CALLBACK(preferences_clicked), "Session properties" }, |
| 237 | 255 |