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 |