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 | ... | ... |