diff --git a/src/dialogs/hostselect.c b/src/dialogs/hostselect.c index 6fcfc4b..c6c609f 100644 --- a/src/dialogs/hostselect.c +++ b/src/dialogs/hostselect.c @@ -235,11 +235,19 @@ static void load(GtkWidget *w, GtkWidget *terminal) } +static void update_message(GtkWidget *widget, GtkWidget *terminal) +{ + gtk_widget_set_sensitive(widget, lib3270_is_disconnected(v3270_get_session(terminal))); +} static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidgetClass *klass) { - GTK_V3270_SETTINGS_CLASS(klass)->apply = apply; - GTK_V3270_SETTINGS_CLASS(klass)->load = load; + V3270SettingsClass * widget = GTK_V3270_SETTINGS_CLASS(klass); + + widget->apply = apply; + widget->load = load; + widget->update_message = update_message; + } static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) @@ -348,11 +356,13 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) { g_return_if_fail(GTK_IS_V3270(widget)); + /* if(v3270_is_connected(widget)) { gtk_widget_error_bell(widget); return; } + */ debug("V3270HostSelectWidget::%s",__FUNCTION__); diff --git a/src/dialogs/settings.c b/src/dialogs/settings.c index 3b35810..e62b0a5 100644 --- a/src/dialogs/settings.c +++ b/src/dialogs/settings.c @@ -50,11 +50,25 @@ static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*term debug("V3270Settings::%s",__FUNCTION__); } +static void update_message(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*terminal)) +{ + debug("V3270Settings::%s",__FUNCTION__); +} + +static void finalize(GObject *object) +{ + v3270_settings_set_terminal_widget(GTK_WIDGET(object),NULL); + G_OBJECT_CLASS(V3270Settings_parent_class)->finalize(object); +} + static void V3270Settings_class_init(V3270SettingsClass *klass) { klass->apply = apply; klass->cancel = cancel; klass->load = load; + klass->update_message = update_message; + + G_OBJECT_CLASS(klass)->finalize = finalize; } static void V3270Settings_init(V3270Settings *widget) @@ -67,13 +81,56 @@ static void V3270Settings_init(V3270Settings *widget) } - LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) - { - g_return_if_fail(GTK_IS_V3270(terminal)); +static void signal_update_message(GtkWidget *terminal, LIB3270_MESSAGE G_GNUC_UNUSED(id), GtkWidget *settings) +{ + GTK_V3270_SETTINGS_GET_CLASS(settings)->update_message(settings,terminal); +} + +LIB3270_EXPORT void v3270_settings_set_terminal_widget(GtkWidget *widget, GtkWidget *terminal) +{ g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); - GTK_V3270_SETTINGS(widget)->terminal = terminal; - GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); + V3270Settings * settings = GTK_V3270_SETTINGS(widget); + + // Return if there's nothing to do. + if(settings->terminal == terminal) + return; + + if(settings->terminal) + { + // Disconnect old terminal widget + gulong handler = g_signal_handler_find( + settings->terminal, + G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA, + 0, + 0, + NULL, + G_CALLBACK(signal_update_message), + widget + ); + + debug("handler=%u",(unsigned long) handler); + + if(handler) + g_signal_handler_disconnect(settings->terminal, handler); + + } + + // Update terminal + settings->terminal = terminal; + + if(settings->terminal) + { + // Connect the new widget. + g_signal_connect(G_OBJECT(terminal),I_("message_changed"), G_CALLBACK(signal_update_message), widget); + + // Update dialog state. + GTK_V3270_SETTINGS_GET_CLASS(widget)->update_message(widget,terminal); + + // Load the dialog contents. + GTK_V3270_SETTINGS_GET_CLASS(widget)->load(widget,terminal); + } + } LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) diff --git a/src/include/v3270/settings.h b/src/include/v3270/settings.h index 2d674b1..a654dc0 100644 --- a/src/include/v3270/settings.h +++ b/src/include/v3270/settings.h @@ -52,9 +52,10 @@ typedef struct _V3270SettingsClass { GtkGridClass parent_class; - void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget - void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY - void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL + void (*load)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method to load the properties from terminal widget + void (*apply)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_APPLY + void (*cancel)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Method for GTK_RESPONSE_CANCEL + void (*update_message)(GtkWidget *widget, GtkWidget *terminal); ///< @brief Lib3270 message has changed. } V3270SettingsClass; -- libgit2 0.21.2