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,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 | static void V3270HostSelectWidget_class_init(G_GNUC_UNUSED V3270HostSelectWidgetClass *klass) | 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 | static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) | 253 | static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) |
| @@ -348,11 +356,13 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | @@ -348,11 +356,13 @@ LIB3270_EXPORT void v3270_select_host(GtkWidget *widget) | ||
| 348 | { | 356 | { |
| 349 | g_return_if_fail(GTK_IS_V3270(widget)); | 357 | g_return_if_fail(GTK_IS_V3270(widget)); |
| 350 | 358 | ||
| 359 | + /* | ||
| 351 | if(v3270_is_connected(widget)) | 360 | if(v3270_is_connected(widget)) |
| 352 | { | 361 | { |
| 353 | gtk_widget_error_bell(widget); | 362 | gtk_widget_error_bell(widget); |
| 354 | return; | 363 | return; |
| 355 | } | 364 | } |
| 365 | + */ | ||
| 356 | 366 | ||
| 357 | debug("V3270HostSelectWidget::%s",__FUNCTION__); | 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,11 +50,25 @@ static void load(GtkWidget G_GNUC_UNUSED(*widget), GtkWidget G_GNUC_UNUSED(*term | ||
| 50 | debug("V3270Settings::%s",__FUNCTION__); | 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 | static void V3270Settings_class_init(V3270SettingsClass *klass) | 64 | static void V3270Settings_class_init(V3270SettingsClass *klass) |
| 54 | { | 65 | { |
| 55 | klass->apply = apply; | 66 | klass->apply = apply; |
| 56 | klass->cancel = cancel; | 67 | klass->cancel = cancel; |
| 57 | klass->load = load; | 68 | klass->load = load; |
| 69 | + klass->update_message = update_message; | ||
| 70 | + | ||
| 71 | + G_OBJECT_CLASS(klass)->finalize = finalize; | ||
| 58 | } | 72 | } |
| 59 | 73 | ||
| 60 | static void V3270Settings_init(V3270Settings *widget) | 74 | static void V3270Settings_init(V3270Settings *widget) |
| @@ -67,13 +81,56 @@ 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 | g_return_if_fail(GTK_IS_V3270_SETTINGS(widget)); | 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 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) | 136 | LIB3270_EXPORT GtkWidget * v3270_settings_get_terminal_widget(GtkWidget *widget) |
src/include/v3270/settings.h
| @@ -52,9 +52,10 @@ | @@ -52,9 +52,10 @@ | ||
| 52 | typedef struct _V3270SettingsClass { | 52 | typedef struct _V3270SettingsClass { |
| 53 | GtkGridClass parent_class; | 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 | } V3270SettingsClass; | 60 | } V3270SettingsClass; |
| 60 | 61 |