From d784dee6aaa939d82d66c9a4c2239ce9fc2999d2 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 25 Oct 2019 16:32:12 -0300 Subject: [PATCH] Implemeting action group listeners. --- src/objects/actions/abstract.c | 6 ++++-- src/objects/actions/lib3270/action.c | 37 ++++++++++++++++++++++++++++++++++++- src/objects/actions/lib3270/pakey.c | 2 +- src/objects/actions/lib3270/pfkey.c | 2 +- src/objects/actions/private.h | 2 +- src/objects/toolbar/actions.c | 1 + 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index c6858bd..2227b89 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -355,11 +355,10 @@ } - void pw3270_action_set_enabled(GAction *object, gboolean G_GNUC_UNUSED(state)) { + void pw3270_action_notify_enabled(GAction *object) { g_object_notify_by_pspec(G_OBJECT(object), PW3270_ACTION_GET_CLASS(object)->properties.enabled); } - static void change_widget(GAction *action, GtkWidget G_GNUC_UNUSED(*from), GtkWidget *to) { PW3270_ACTION(action)->terminal = to; } @@ -440,3 +439,6 @@ return NULL; } + H3270 * pw3270_action_get_session(GAction *action) { + return v3270_get_session(PW3270_ACTION(action)->terminal); + } diff --git a/src/objects/actions/lib3270/action.c b/src/objects/actions/lib3270/action.c index b8b3c96..b05e26c 100644 --- a/src/objects/actions/lib3270/action.c +++ b/src/objects/actions/lib3270/action.c @@ -48,6 +48,7 @@ pw3270Action parent; const LIB3270_ACTION * definition; + const void * listener; } Lib3270Action; @@ -82,6 +83,18 @@ return PW3270_LIB3270_ACTION(action)->definition->summary; } + static void dispose(GObject *object) { + + Lib3270Action *action = PW3270_LIB3270_ACTION(object); + + if(action->listener) { + lib3270_unregister_action_group_listener(pw3270_action_get_session(G_ACTION(object)),action->definition->group,action->listener); + action->listener = NULL; + } + + G_OBJECT_CLASS(Lib3270Action_parent_class)->dispose(object); + } + void Lib3270Action_class_init(Lib3270ActionClass *klass) { pw3270ActionClass * action = PW3270_ACTION_CLASS(klass); @@ -93,6 +106,8 @@ action->get_label = get_label; action->get_tooltip = get_tooltip; + G_OBJECT_CLASS(klass)->dispose = dispose; + } void Lib3270Action_init(Lib3270Action G_GNUC_UNUSED(*action)) { @@ -101,7 +116,10 @@ GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition) { Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL); + + // Setup hooks. action->definition = definition; + action->listener = NULL; // Setup the default name. pw3270Action * abstract = PW3270_ACTION(action); @@ -114,14 +132,31 @@ return G_ACTION(action); } + static void event_listener(H3270 G_GNUC_UNUSED(*hSession), void *object) { + pw3270_action_notify_enabled(G_ACTION(object)); + } + void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { + // Remove old listener + Lib3270Action * action = PW3270_LIB3270_ACTION(object); + if(action->listener) { + lib3270_unregister_action_group_listener(pw3270_action_get_session(object),action->definition->group,action->listener); + action->listener = NULL; + } + + // Change widget PW3270_ACTION_CLASS(Lib3270Action_parent_class)->change_widget(object,from,to); + // Setup new listener + if(action->definition->group && to) { + action->listener = lib3270_register_action_group_listener(pw3270_action_get_session(object),action->definition->group,event_listener,object); + } + // Does the "enabled" state has changed? If yes notify customers. gboolean enabled = get_enabled(object,to); if(get_enabled(object,from) != enabled) - pw3270_action_set_enabled(object,enabled); + pw3270_action_notify_enabled(object); } diff --git a/src/objects/actions/lib3270/pakey.c b/src/objects/actions/lib3270/pakey.c index 44b3eda..1823306 100644 --- a/src/objects/actions/lib3270/pakey.c +++ b/src/objects/actions/lib3270/pakey.c @@ -135,7 +135,7 @@ // Does the "enabled" state has changed? If yes notify customers. gboolean enabled = get_enabled(object,to); if(get_enabled(object,from) != enabled) - pw3270_action_set_enabled(object,enabled); + pw3270_action_notify_enabled(object); } diff --git a/src/objects/actions/lib3270/pfkey.c b/src/objects/actions/lib3270/pfkey.c index c5d7a25..71b3400 100644 --- a/src/objects/actions/lib3270/pfkey.c +++ b/src/objects/actions/lib3270/pfkey.c @@ -135,7 +135,7 @@ // Does the "enabled" state has changed? If yes notify customers. gboolean enabled = get_enabled(object,to); if(get_enabled(object,from) != enabled) - pw3270_action_set_enabled(object,enabled); + pw3270_action_notify_enabled(object); } diff --git a/src/objects/actions/private.h b/src/objects/actions/private.h index 0a524b2..968a977 100644 --- a/src/objects/actions/private.h +++ b/src/objects/actions/private.h @@ -85,7 +85,7 @@ G_GNUC_INTERNAL GAction * pw3270_action_new_pakey(void); G_GNUC_INTERNAL void pw3270_action_change_state_boolean(GAction *action, gboolean state); - G_GNUC_INTERNAL void pw3270_action_set_enabled(GAction *action, gboolean state); + G_GNUC_INTERNAL void pw3270_action_notify_enabled(GAction *action); #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/toolbar/actions.c b/src/objects/toolbar/actions.c index 18c45d2..d85517d 100644 --- a/src/objects/toolbar/actions.c +++ b/src/objects/toolbar/actions.c @@ -141,6 +141,7 @@ gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(item),TRUE); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(item), pos); gtk_widget_show_all(GTK_WIDGET(item)); + gtk_widget_set_sensitive(GTK_WIDGET(item),g_action_get_enabled(action)); g_signal_connect(G_OBJECT(item),"clicked",G_CALLBACK(clicked),action); g_signal_connect(G_OBJECT(action),"notify",G_CALLBACK(notify),item); -- libgit2 0.21.2