Commit 9f878ea91db102b222353b2995843cdd7861315f

Authored by Perry Werneck
1 parent 54c30a12

Implementins signal and enable/disable notification.

src/actions/abstract.c
... ... @@ -60,6 +60,13 @@
60 60 PROP_STATE
61 61 };
62 62  
  63 + enum {
  64 + SIGNAL_CHANGE_STATE,
  65 + NR_SIGNALS
  66 + };
  67 +
  68 + static guint action_signals[NR_SIGNALS];
  69 +
63 70 G_DEFINE_TYPE_WITH_CODE(pw3270Action, pw3270Action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_ACTION, pw3270_action_iface_init))
64 71  
65 72 void pw3270_action_iface_init(GActionInterface *iface) {
... ... @@ -128,6 +135,18 @@
128 135 NULL,
129 136 G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
130 137 G_PARAM_STATIC_STRINGS));
  138 +
  139 + // Install signals
  140 + action_signals[SIGNAL_CHANGE_STATE] =
  141 + g_signal_new(
  142 + I_("change-state"),
  143 + G_TYPE_SIMPLE_ACTION,
  144 + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
  145 + 0, NULL, NULL,
  146 + NULL,
  147 + G_TYPE_NONE, 1,
  148 + G_TYPE_VARIANT
  149 + );
131 150 }
132 151  
133 152 void pw3270Action_init(pw3270Action *action) {
... ... @@ -304,6 +323,10 @@
304 323  
305 324 action->state = g_variant_ref(value);
306 325  
  326 + if (g_signal_has_handler_pending(object, action_signals[SIGNAL_CHANGE_STATE], 0, TRUE)) {
  327 + g_signal_emit(object, action_signals[SIGNAL_CHANGE_STATE], 0, value);
  328 + }
  329 +
307 330 g_object_notify(G_OBJECT(object), "state");
308 331  
309 332 }
... ... @@ -314,6 +337,14 @@
314 337  
315 338 }
316 339  
  340 + void pw3270_action_set_enabled(GAction *object, gboolean state) {
  341 +
  342 +// pw3270Action * action = PW3270_ACTION(object);
  343 +
  344 + g_object_notify(G_OBJECT(object), "enabled");
  345 + }
  346 +
  347 +
317 348 static void change_widget(GAction *action, GtkWidget G_GNUC_UNUSED(*from), GtkWidget *to) {
318 349 PW3270_ACTION(action)->terminal = to;
319 350 }
... ... @@ -354,7 +385,7 @@
354 385 debug("%s: terminal=%p",__FUNCTION__,action->terminal);
355 386  
356 387 if(action && action->terminal) {
357   - return PW3270_ACTION_GET_CLASS(object)->activate(object,parameter,action->terminal);
  388 + PW3270_ACTION_GET_CLASS(object)->activate(object,parameter,action->terminal);
358 389 }
359 390  
360 391 }
... ...
src/actions/lib3270/action.c
... ... @@ -53,11 +53,17 @@
53 53  
54 54 static void Lib3270Action_class_init(Lib3270ActionClass *klass);
55 55 static void Lib3270Action_init(Lib3270Action *action);
  56 + static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to);
56 57  
57 58 G_DEFINE_TYPE(Lib3270Action, Lib3270Action, PW3270_TYPE_ACTION);
58 59  
59 60 static gboolean get_enabled(GAction *action, GtkWidget *terminal) {
60   - return PW3270_LIB3270_ACTION(action)->definition->activatable(v3270_get_session(terminal)) > 0 ? TRUE : FALSE;
  61 +
  62 + if(terminal)
  63 + return PW3270_LIB3270_ACTION(action)->definition->activatable(v3270_get_session(terminal)) > 0 ? TRUE : FALSE;
  64 +
  65 + return FALSE;
  66 +
61 67 }
62 68  
63 69 static void activate(GAction *action, GVariant *parameter, GtkWidget *terminal) {
... ... @@ -70,6 +76,7 @@
70 76  
71 77 action->activate = activate;
72 78 action->get_enabled = get_enabled;
  79 + action->change_widget = change_widget;
73 80  
74 81 }
75 82  
... ... @@ -92,4 +99,14 @@
92 99 return G_ACTION(action);
93 100 }
94 101  
  102 + void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) {
  103 +
  104 + PW3270_ACTION_CLASS(Lib3270Action_parent_class)->change_widget(object,from,to);
  105 +
  106 + // Does the "enabled" state has changed? If yes notify customers.
  107 + gboolean enabled = get_enabled(object,to);
  108 + if(get_enabled(object,from) != enabled)
  109 + pw3270_action_set_enabled(object,enabled);
  110 +
  111 + }
95 112  
... ...
src/actions/private.h
... ... @@ -48,6 +48,9 @@
48 48  
49 49 #include <lib3270/log.h>
50 50  
  51 + /* not really I18N-related, but also a string marker macro */
  52 + #define I_(string) g_intern_static_string (string)
  53 +
51 54 struct _pw3270Action {
52 55 GObject parent;
53 56  
... ... @@ -71,6 +74,7 @@
71 74 G_GNUC_INTERNAL GAction * pw3270_toggle_action_new_from_lib3270(const LIB3270_TOGGLE * definition);
72 75  
73 76 G_GNUC_INTERNAL void pw3270_action_change_state_boolean(GAction *action, gboolean state);
  77 + G_GNUC_INTERNAL void pw3270_action_set_enabled(GAction *action, gboolean state);
74 78  
75 79  
76 80 #endif // PRIVATE_H_INCLUDED
... ...