Commit 66ac380e739753ddd350069698260136ba5c1498
1 parent
8fd815ad
Exists in
master
and in
1 other branch
Host select widget is now sensible to connection state.
Showing
3 changed files
with
78 additions
and
10 deletions
Show diff stats
src/dialogs/hostselect.c
| ... | ... | @@ -235,11 +235,19 @@ static void load(GtkWidget *w, GtkWidget *terminal) |
| 235 | 235 | |
| 236 | 236 | } |
| 237 | 237 | |
| 238 | +static void update_message(GtkWidget *widget, GtkWidget *terminal) | |
| 239 | +{ | |
| 240 | + gtk_widget_set_sensitive(widget, lib3270_is_disconnected(v3270_get_session(terminal))); | |
| 241 | +} | |
| 238 | 242 | |
| 239 | 243 | static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidgetClass *klass) |
| 240 | 244 | { |
| 241 | - GTK_V3270_SETTINGS_CLASS(klass)->apply = apply; | |
| 242 | - GTK_V3270_SETTINGS_CLASS(klass)->load = load; | |
| 245 | + V3270SettingsClass * widget = GTK_V3270_SETTINGS_CLASS(klass); | |
| 246 | + | |
| 247 | + widget->apply = apply; | |
| 248 | + widget->load = load; | |
| 249 | + widget->update_message = update_message; | |
| 250 | + | |
| 243 | 251 | } |
| 244 | 252 | |
| 245 | 253 | static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
| ... | ... | @@ -348,11 +356,13 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) |
| 348 | 356 | { |
| 349 | 357 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 350 | 358 | |
| 359 | + /* | |
| 351 | 360 | if(v3270_is_connected(widget)) |
| 352 | 361 | { |
| 353 | 362 | gtk_widget_error_bell(widget); |
| 354 | 363 | return; |
| 355 | 364 | } |
| 365 | + */ | |
| 356 | 366 | |
| 357 | 367 | debug("V3270HostSelectWidget::%s",__FUNCTION__); |
| 358 | 368 | ... | ... |
src/dialogs/settings.c
| ... | ... | @@ -50,11 +50,25 @@ static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*term |
| 50 | 50 | debug("V3270Settings::%s",__FUNCTION__); |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | +static void update_message(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) | |
| 54 | +{ | |
| 55 | + debug("V3270Settings::%s",__FUNCTION__); | |
| 56 | +} | |
| 57 | + | |
| 58 | +static void finalize(GObject *object) | |
| 59 | +{ | |
| 60 | + v3270_settings_set_terminal_widget(GTK_WIDGET(object),NULL); | |
| 61 | + G_OBJECT_CLASS(V3270Settings_parent_class)->finalize(object); | |
| 62 | +} | |
| 63 | + | |
| 53 | 64 | static void V3270Settings_class_init(V3270SettingsClass *klass) |
| 54 | 65 | { |
| 55 | 66 | klass->apply = apply; |
| 56 | 67 | klass->cancel = cancel; |
| 57 | 68 | klass->load = load; |
| 69 | + klass->update_message = update_message; | |
| 70 | + | |
| 71 | + G_OBJECT_CLASS(klass)->finalize = finalize; | |
| 58 | 72 | } |
| 59 | 73 | |
| 60 | 74 | static void V3270Settings_init(V3270Settings *widget) |
| ... | ... | @@ -67,13 +81,56 @@ static void V3270Settings_init(V3270Settings *widget) |
| 67 | 81 | |
| 68 | 82 | } |
| 69 | 83 | |
| 70 | - LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) | |
| 71 | - { | |
| 72 | - g_return_if_fail(GTK_IS_V3270(terminal)); | |
| 84 | +static void signal_update_message(GtkWidget *terminal, LIB3270_MESSAGE G_GNUC_UNUSED(id), GtkWidget *settings) | |
| 85 | +{ | |
| 86 | + GTK_V3270_SETTINGS_GET_CLASS(settings)->update_message(settings,terminal); | |
| 87 | +} | |
| 88 | + | |
| 89 | +LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) | |
| 90 | +{ | |
| 73 | 91 | g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); |
| 74 | 92 | |
| 75 | - GTK_V3270_SETTINGS(widget)->terminal = terminal; | |
| 76 | - GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); | |
| 93 | + V3270Settings * settings = GTK_V3270_SETTINGS(widget); | |
| 94 | + | |
| 95 | + // Return if there's nothing to do. | |
| 96 | + if(settings->terminal == terminal) | |
| 97 | + return; | |
| 98 | + | |
| 99 | + if(settings->terminal) | |
| 100 | + { | |
| 101 | + // Disconnect old terminal widget | |
| 102 | + gulong handler = g_signal_handler_find( | |
| 103 | + settings->terminal, | |
| 104 | + G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, | |
| 105 | + 0, | |
| 106 | + 0, | |
| 107 | + NULL, | |
| 108 | + G_CALLBACK(signal_update_message), | |
| 109 | + widget | |
| 110 | + ); | |
| 111 | + | |
| 112 | + debug("handler=%u",(unsigned long) handler); | |
| 113 | + | |
| 114 | + if(handler) | |
| 115 | + g_signal_handler_disconnect(settings->terminal, handler); | |
| 116 | + | |
| 117 | + } | |
| 118 | + | |
| 119 | + // Update terminal | |
| 120 | + settings->terminal = terminal; | |
| 121 | + | |
| 122 | + if(settings->terminal) | |
| 123 | + { | |
| 124 | + // Connect the new widget. | |
| 125 | + g_signal_connect(G_OBJECT(terminal),I_("message_changed"), G_CALLBACK(signal_update_message), widget); | |
| 126 | + | |
| 127 | + // Update dialog state. | |
| 128 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->update_message(widget,terminal); | |
| 129 | + | |
| 130 | + // Load the dialog contents. | |
| 131 | + GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); | |
| 132 | + } | |
| 133 | + | |
| 77 | 134 | } |
| 78 | 135 | |
| 79 | 136 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) | ... | ... |
src/include/v3270/settings.h
| ... | ... | @@ -52,9 +52,10 @@ |
| 52 | 52 | typedef struct _V3270SettingsClass { |
| 53 | 53 | GtkGridClass parent_class; |
| 54 | 54 | |
| 55 | - void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget | |
| 56 | - void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY | |
| 57 | - void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL | |
| 55 | + void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget | |
| 56 | + void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY | |
| 57 | + void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL | |
| 58 | + void (*update_message)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Lib3270 message has changed. | |
| 58 | 59 | |
| 59 | 60 | } V3270SettingsClass; |
| 60 | 61 | ... | ... |