Commit 66ac380e739753ddd350069698260136ba5c1498

Authored by Perry Werneck
1 parent 8fd815ad
Exists in master and in 1 other branch develop

Host select widget is now sensible to connection state.

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