From 6c0b2b0064dfbd20a19252633b04e67cd7b688c6 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 29 Oct 2019 11:10:35 -0300 Subject: [PATCH] Fixing action engine. --- pw3270.cbp | 3 +++ src/include/pw3270/toolbar.h | 3 +-- src/objects/actions/abstract.c | 17 ++++++++++++++--- src/objects/actions/connect.c | 2 +- src/objects/actions/lib3270/action.c | 2 +- src/objects/actions/lib3270/pakey.c | 2 +- src/objects/actions/lib3270/pfkey.c | 2 +- src/objects/actions/window.c | 10 ++++++++++ src/objects/toolbar/actions.c | 147 +++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------ src/objects/toolbar/private.h | 3 +++ src/objects/window/window.c | 17 +++++++---------- 11 files changed, 63 insertions(+), 145 deletions(-) diff --git a/pw3270.cbp b/pw3270.cbp index 5ff299f..d874056 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -86,6 +86,9 @@ + + diff --git a/src/include/pw3270/toolbar.h b/src/include/pw3270/toolbar.h index 6d0118d..a7f5fa6 100644 --- a/src/include/pw3270/toolbar.h +++ b/src/include/pw3270/toolbar.h @@ -57,8 +57,7 @@ GtkWidget * pw3270_toolbar_new(void); GtkWidget * pw3270_toolbar_insert_lib3270_action(GtkWidget *toolbar, const LIB3270_ACTION *action, gint pos); - GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, GAction *action, gint pos); - GtkWidget * pw3270_toolbar_insert_action_by_name(GtkWidget *toolbar, const gchar *name, gint pos); + GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, const gchar *name, gint pos); void pw3270_toolbar_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style); // GtkToolbarStyle pw3270_toolbar_toolbar_get_style(GtkToolbar *toolbar); diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index 3af4ad5..0017546 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -356,7 +356,16 @@ } void pw3270_action_notify_enabled(GAction *object) { - g_object_notify_by_pspec(G_OBJECT(object), PW3270_ACTION_GET_CLASS(object)->properties.enabled); + + debug("%s(%s) = %s", + __FUNCTION__, + g_action_get_name(G_ACTION(object)), + (g_action_get_enabled(G_ACTION(object)) ? "Enabled" : "Disabled") + ); + + // g_object_notify_by_pspec(G_OBJECT(object), PW3270_ACTION_GET_CLASS(object)->properties.enabled); + g_object_notify(G_OBJECT (object), "enabled"); + } static void change_widget(GAction *action, GtkWidget G_GNUC_UNUSED(*from), GtkWidget *to) { @@ -382,13 +391,15 @@ gboolean pw3270_action_get_enabled(GAction *object) { + gboolean enabled = FALSE; + pw3270Action * action = PW3270_ACTION(object); if(action && action->terminal) { - return PW3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal); + enabled = PW3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal); } - return FALSE; + return enabled; } diff --git a/src/objects/actions/connect.c b/src/objects/actions/connect.c index d44e5e2..4b2fa6a 100644 --- a/src/objects/actions/connect.c +++ b/src/objects/actions/connect.c @@ -46,7 +46,7 @@ GAction * action = pw3270_action_new_from_lib3270(lib3270_action_get_by_name("reconnect")); PW3270_ACTION(action)->activate = activate; - pw3270_action_set_name(G_ACTION(action),"win.connect"); + pw3270_action_set_name(G_ACTION(action),"connect"); return action; diff --git a/src/objects/actions/lib3270/action.c b/src/objects/actions/lib3270/action.c index 791d204..9bfdd3e 100644 --- a/src/objects/actions/lib3270/action.c +++ b/src/objects/actions/lib3270/action.c @@ -133,7 +133,7 @@ if(abstract->name) g_free(abstract->name); - abstract->name = g_strconcat("win.",definition->name,NULL); + abstract->name = g_strdup(definition->name); return G_ACTION(action); } diff --git a/src/objects/actions/lib3270/pakey.c b/src/objects/actions/lib3270/pakey.c index ec9a36a..af78042 100644 --- a/src/objects/actions/lib3270/pakey.c +++ b/src/objects/actions/lib3270/pakey.c @@ -123,7 +123,7 @@ if(abstract->name) g_free(abstract->name); - abstract->name = g_strdup("win.pakey"); + abstract->name = g_strdup("pakey"); return G_ACTION(action); } diff --git a/src/objects/actions/lib3270/pfkey.c b/src/objects/actions/lib3270/pfkey.c index 5417c91..a845058 100644 --- a/src/objects/actions/lib3270/pfkey.c +++ b/src/objects/actions/lib3270/pfkey.c @@ -122,7 +122,7 @@ if(abstract->name) g_free(abstract->name); - abstract->name = g_strdup("win.pfkey"); + abstract->name = g_strdup("pfkey"); return G_ACTION(action); diff --git a/src/objects/actions/window.c b/src/objects/actions/window.c index c280b62..8e3f20a 100644 --- a/src/objects/actions/window.c +++ b/src/objects/actions/window.c @@ -43,6 +43,15 @@ // Map lib3270 actions { + GAction * action = pw3270_action_new_from_lib3270(lib3270_action_get_by_name("disconnect")); + + pw3270_action_set_name(G_ACTION(action),"disconnect"); + + g_action_map_add_action(map,action); + + } + + { const LIB3270_ACTION * actions = lib3270_get_actions(); for(ix = 0; actions[ix].name; ix++) { @@ -80,4 +89,5 @@ } debug("%s ends",__FUNCTION__); + } diff --git a/src/objects/toolbar/actions.c b/src/objects/toolbar/actions.c index dcbc74d..8ada6ed 100644 --- a/src/objects/toolbar/actions.c +++ b/src/objects/toolbar/actions.c @@ -30,129 +30,7 @@ #include "private.h" #include - static GtkWidget * pw3270_tool_button_new(GAction *action) { - - const gchar * action_name = g_action_get_name(action); - debug("action=%s enabled=%s type=%s",action_name,g_action_get_enabled(action) ? "Yes" : "No", g_action_get_parameter_type(action)); - - if(PW3270_IS_ACTION(action)) { - - // It's a pw3270 action, get attributes from it. - - const gchar * icon_name = pw3270_action_get_icon_name(action); - if(!icon_name) { - g_message("Action doesn't have an icon"); - return NULL; - } - - debug("%s - %s",icon_name,pw3270_action_get_label(action)); - - GtkToolItem * item = gtk_tool_button_new( - NULL, - pw3270_action_get_label(action) - ); - - gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name); - - const gchar * tooltip = pw3270_action_get_tooltip(action); - if(tooltip) - gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); - - return GTK_WIDGET(item); - - } - - // - // Check for my Actions. - // - - static const struct _actions { - const gchar * name; - const gchar * icon; - const gchar * label; - const gchar * tooltip; - } actions[] = { - - { - .name = "win.connect", - .icon = "gtk-connect", - .label = N_("Connect"), - .tooltip = N_("Connect to host") - }, - - { - .name = "win.close", - .icon = "window-close", - .label = N_("Close"), - .tooltip = N_("Close window") - } - - }; - - size_t ix; - for(ix = 0; ix < G_N_ELEMENTS(actions); ix++) { - - if(!g_ascii_strcasecmp(action_name,actions[ix].name)) { - - GtkToolItem * item = gtk_tool_button_new( - gtk_image_new_from_icon_name(actions[ix].icon,GTK_ICON_SIZE_LARGE_TOOLBAR), - gettext(actions[ix].label) - ); - - if(actions[ix].tooltip) - gtk_widget_set_tooltip_markup(GTK_WIDGET(item),gettext(actions[ix].tooltip)); - - return GTK_WIDGET(item); - } - - } - - g_warning("Action \"%s\" can't be inserted on toolbar",action_name); - - return NULL; - - } - - static void clicked(GtkToolButton G_GNUC_UNUSED(*toolbutton), GAction *action) { - - if(g_action_get_enabled(action)) { - g_action_activate(action,NULL); - } -#ifdef DEBUG - else { - debug("Action \"%s\" is disabled",g_action_get_name(action)); - } -#endif // DEBUG - - } - - static void notify(GAction *action, GParamSpec *pspec, GtkWidget *item) { - if(!strcmp(pspec->name,"enabled")) - gtk_widget_set_sensitive(item,g_action_get_enabled(action)); - } - - GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, GAction *action, gint pos) { - - g_return_val_if_fail(PW3270_IS_TOOLBAR(toolbar),NULL); - - GtkWidget * item = pw3270_tool_button_new(action); - - if(!item) - return NULL; - - 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); - - return item; - - } - - GtkWidget * pw3270_toolbar_insert_action_by_name(GtkWidget *toolbar, const gchar *name, gint pos) { + GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, const gchar *name, gint pos) { g_return_val_if_fail(PW3270_IS_TOOLBAR(toolbar),NULL); @@ -183,11 +61,28 @@ if(window) { GAction *action = g_action_map_lookup_action(G_ACTION_MAP(window), name); + GtkToolItem * item = NULL; - if(action) - return pw3270_toolbar_insert_action(toolbar, action, pos); + if(!action) { + const gchar *ptr = strchr(name,'.'); - g_warning("Can't find action \"%s\"",name); + if(ptr) + action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1); + } + + if(action) { + debug("Creating button \"%s\" from action \"%s\"",name,g_action_get_name(G_ACTION(action))); + item = GTK_TOOL_ITEM(pw3270_tool_button_new(action)); + } else { + debug("Creating button \"%s\" from action name",name); + item = GTK_TOOL_ITEM(pw3270_tool_button_new_from_action_name(name)); + } + + if(item) { + gtk_actionable_set_action_name(GTK_ACTIONABLE(item),name); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar),item,pos); + return GTK_WIDGET(item); + } } diff --git a/src/objects/toolbar/private.h b/src/objects/toolbar/private.h index f73c20c..0df2b33 100644 --- a/src/objects/toolbar/private.h +++ b/src/objects/toolbar/private.h @@ -44,4 +44,7 @@ #include #include + G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action); + G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name); + #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/window/window.c b/src/objects/window/window.c index c1a7307..50ba762 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -101,17 +101,17 @@ static GActionEntry actions[] = { { - .name = "win.open", + .name = "open", .activate = pw3270_application_generic_activated, }, { - .name = "win.close", + .name = "close", .activate = pw3270_application_generic_activated, }, { - .name = "win.preferences", + .name = "preferences", .activate = pw3270_application_generic_activated, }, @@ -129,6 +129,7 @@ // { static const gchar *actions[] = { + "win.copy", "win.paste", "win.select_all", @@ -136,23 +137,19 @@ "win.connect", "win.disconnect", "separator", + "win.preferences", "win.print" + }; size_t ix; for(ix = 0; ix < G_N_ELEMENTS(actions); ix++) { - pw3270_toolbar_insert_action_by_name(GTK_WIDGET(widget->toolbar),actions[ix],-1); + pw3270_toolbar_insert_action(GTK_WIDGET(widget->toolbar),actions[ix],-1); } } - - debug("%s","************************************************"); - debug("Action win.copy is %p",g_action_map_lookup_action(G_ACTION_MAP(widget),"win.copy")); - debug("%s","************************************************"); - - } GtkWidget * pw3270_application_window_new(GtkApplication * application) { -- libgit2 0.21.2