From 1b59e4072fda1bdba58ec6ad48b4174fe9b36e8e Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 26 Dec 2019 14:27:22 -0300 Subject: [PATCH] Using the V3270 terminal actions. --- pw3270.cbp | 4 ++++ src/include/pw3270/actions.h | 13 +++++++++++-- src/include/pw3270/toolbar.h | 2 +- src/objects/actions/abstract.c | 45 +++++++++++++++++++++++++++++++++++++++------ src/objects/actions/button.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/actions/print.c | 2 ++ src/objects/actions/private.h | 2 ++ src/objects/actions/save.c | 3 ++- src/objects/actions/view.c | 2 +- src/objects/actions/window.c | 26 +++++++++++++++++++------- src/objects/application/application.c | 2 ++ src/objects/toolbar/actions.c | 16 ++++++++++++++-- src/objects/toolbar/toolbar.c | 2 ++ src/objects/toolbar/toolbutton.c | 2 ++ src/objects/window/actions/hostproperties.c | 2 +- src/objects/window/header.c | 22 ++++++++++++++++++---- src/objects/window/private.h | 3 --- src/objects/window/terminal.c | 10 ++++++++-- src/objects/window/tools.c | 2 ++ src/objects/window/window.c | 2 ++ 20 files changed, 212 insertions(+), 30 deletions(-) diff --git a/pw3270.cbp b/pw3270.cbp index bda7bc2..5526df6 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -49,6 +49,7 @@ + @@ -96,6 +97,9 @@ + + diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index cb15516..7dc42a1 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -40,6 +40,7 @@ #include #include #include + #include G_BEGIN_DECLS @@ -121,7 +122,7 @@ const gchar * pw3270_action_get_tooltip(GAction *action); /// @brief Create a button associated with the action. - GtkWidget * pw3270_action_button_new(GAction *action, const gchar *action_name); + //GtkWidget * pw3270_action_button_new(GAction *action, const gchar *action_name); /// @brief Associate action with the terminal widget. void pw3270_action_set_terminal_widget(GAction *action, GtkWidget *terminal); @@ -252,6 +253,7 @@ GType v3270ConditionalAction_get_type(void) G_GNUC_CONST; GAction * v3270_conditional_action_new(GtkWidget *widget, const gchar *property_name); + GAction * v3270_action_new(const V3270_ACTION *action_data); // // Action view @@ -271,7 +273,14 @@ // // Tools // - GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size); + gchar * g_action_get_icon_name(GAction *action); + gchar * g_action_get_tooltip(GAction *action); + gchar * g_action_get_label(GAction *action); + + GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags); + + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size); + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size); G_END_DECLS diff --git a/src/include/pw3270/toolbar.h b/src/include/pw3270/toolbar.h index 594d265..cb44db9 100644 --- a/src/include/pw3270/toolbar.h +++ b/src/include/pw3270/toolbar.h @@ -56,7 +56,7 @@ GtkWidget * pw3270_toolbar_new(void); - GtkWidget * pw3270_toolbar_insert_lib3270_action(GtkWidget *toolbar, const LIB3270_ACTION *action, gint pos); +// GtkWidget * pw3270_toolbar_insert_lib3270_action(GtkWidget *toolbar, const LIB3270_ACTION *action, gint pos); GtkWidget * pw3270_toolbar_insert_action(GtkWidget *toolbar, const gchar *name, gint pos); void pw3270_toolbar_set_actions(GtkWidget *toolbar, const gchar *action_names); diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index b46f299..483dc1d 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -362,6 +362,7 @@ } static gboolean bg_notify_enabled(GObject *action) { + // debug("%s(%s,%s)",__FUNCTION__,g_action_get_name(G_ACTION(action)),(g_action_get_enabled(G_ACTION(action)) ? "enabled" : "disabled")); g_object_notify(action, "enabled"); return FALSE; } @@ -493,7 +494,7 @@ return G_ACTION(g_object_new(PW3270_TYPE_ACTION, NULL)); } - static GdkPixbuf * pixbuf_from_icon_name(GValue *value, GtkIconSize icon_size) { + static GdkPixbuf * pixbuf_from_icon_name(GValue *value, gint width, gint G_GNUC_UNUSED(height), GtkIconLookupFlags flags) { const gchar * icon_name = g_value_get_string(value); @@ -503,19 +504,48 @@ return gtk_icon_theme_load_icon( gtk_icon_theme_get_default(), icon_name, - icon_size, - GTK_ICON_LOOKUP_GENERIC_FALLBACK, + width, + flags, // GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL ); } - GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size) { + gchar * g_action_get_text(GAction *action, const gchar * property_name) { + gchar *rc = NULL; + + GValue value = G_VALUE_INIT; + g_value_init(&value, G_TYPE_STRING); + g_object_get_property(G_OBJECT(action),property_name,&value); + + const gchar * text = g_value_get_string(&value); + if(text) + rc = g_strdup(text); + + g_value_unset(&value); + + return rc; + + } + + gchar * g_action_get_tooltip(GAction *action) { + return g_action_get_text(action, "tooltip"); + } + + gchar * g_action_get_label(GAction *action) { + return g_action_get_text(action, "label"); + } + + gchar * g_action_get_icon_name(GAction *action) { + return g_action_get_text(action, "icon-name"); + } + + GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags) { struct Properties { const gchar * name; GType value_type; - GdkPixbuf * (*translate)(GValue *value, GtkIconSize icon_size); + GdkPixbuf * (*translate)(GValue *value, gint width, gint height, GtkIconLookupFlags flags); } properties[] = { { .name = "icon-name", @@ -526,6 +556,9 @@ size_t ix; GdkPixbuf * pixbuf = NULL; + gint width, height; + + gtk_icon_size_lookup(icon_size,&width,&height); for(ix = 0; ix < G_N_ELEMENTS(properties) && !pixbuf; ix++) { @@ -537,7 +570,7 @@ g_object_get_property(G_OBJECT(action),properties[ix].name,&value); - pixbuf = properties[ix].translate(&value,icon_size); + pixbuf = properties[ix].translate(&value,width,height,flags); g_value_unset(&value); diff --git a/src/objects/actions/button.c b/src/objects/actions/button.c index e4139cc..0231688 100644 --- a/src/objects/actions/button.c +++ b/src/objects/actions/button.c @@ -35,6 +35,85 @@ #include "private.h" #include + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size) { + + if(!action) + return NULL; + + g_autofree gchar * icon_name = g_action_get_icon_name(action); + if(icon_name) + return gtk_button_new_from_icon_name(icon_name,icon_size); + + GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK); + + if(pixbuf) { + + GtkWidget * button = gtk_button_new(); + + GtkWidget * image = gtk_image_new_from_pixbuf(pixbuf); + gtk_widget_show_all(image); + + gtk_button_set_image(GTK_BUTTON(button),image); + + return button; + } + + + return NULL; + } + + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size) { + + if(!action) + return NULL; + + g_autofree gchar * tooltip = g_action_get_tooltip(action); + g_autofree gchar * label = g_action_get_label(action); + debug("%s(%s).label=%s",__FUNCTION__,g_action_get_name(action),label); + if(!label) + return NULL; + + g_autofree gchar * icon_name = g_action_get_icon_name(action); + debug("%s(%s).icon_name=%s",__FUNCTION__,g_action_get_name(action),icon_name); + if(icon_name) { + + // Has icon name + GtkToolItem * item = gtk_tool_button_new(NULL,label); + + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name); + + if(tooltip) + gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); + + return item; + } + + + /// FIXME: Get size from icon_size + GdkPixbuf * pixbuf = g_action_get_pixbuf(action, icon_size, GTK_ICON_LOOKUP_GENERIC_FALLBACK); + + if(pixbuf) { + + GtkToolItem * item = gtk_tool_button_new(NULL,label); + + GtkWidget * image = gtk_image_new_from_pixbuf(pixbuf); + gtk_widget_show_all(image); + + gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item),image); + + if(tooltip) + gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); + + return item; + } + + + return NULL; + + } + + + /* /// @brief Create a button associated with the action. GtkWidget * pw3270_action_button_new(GAction *action, const gchar *action_name) { @@ -72,4 +151,5 @@ return button; } + */ diff --git a/src/objects/actions/print.c b/src/objects/actions/print.c index fe9c077..651af88 100644 --- a/src/objects/actions/print.c +++ b/src/objects/actions/print.c @@ -36,6 +36,7 @@ #include #include + /* static void activate_print_all(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget *terminal) { debug("%s",__FUNCTION__); v3270_print_all(terminal,NULL); @@ -105,4 +106,5 @@ return G_ACTION(action); } + */ diff --git a/src/objects/actions/private.h b/src/objects/actions/private.h index c8a71b1..bd76f67 100644 --- a/src/objects/actions/private.h +++ b/src/objects/actions/private.h @@ -66,6 +66,7 @@ G_GNUC_INTERNAL GAction * pw3270_action_cut_new(void); G_GNUC_INTERNAL GAction * pw3270_action_paste_new(void); + /* G_GNUC_INTERNAL GAction * pw3270_action_save_new(void); G_GNUC_INTERNAL GAction * pw3270_action_save_screen_new(void); G_GNUC_INTERNAL GAction * pw3270_action_save_selected_new(void); @@ -73,5 +74,6 @@ G_GNUC_INTERNAL GAction * pw3270_action_print_new(void); G_GNUC_INTERNAL GAction * pw3270_action_print_all_new(void); G_GNUC_INTERNAL GAction * pw3270_action_print_selected_new(void); + */ #endif // PRIVATE_H_INCLUDED diff --git a/src/objects/actions/save.c b/src/objects/actions/save.c index 89eb78a..f7c7892 100644 --- a/src/objects/actions/save.c +++ b/src/objects/actions/save.c @@ -36,6 +36,7 @@ #include #include + /* static void activate_save_screen(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkWidget *terminal) { debug("%s",__FUNCTION__); v3270_save_all(terminal,NULL,NULL); @@ -103,4 +104,4 @@ return G_ACTION(action); } - +*/ diff --git a/src/objects/actions/view.c b/src/objects/actions/view.c index 6ea6285..857c3f2 100644 --- a/src/objects/actions/view.c +++ b/src/objects/actions/view.c @@ -229,7 +229,7 @@ return list; } - GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU); + GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK); if(!pixbuf) { debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action)); return list; diff --git a/src/objects/actions/window.c b/src/objects/actions/window.c index f15fc36..140c95c 100644 --- a/src/objects/actions/window.c +++ b/src/objects/actions/window.c @@ -34,6 +34,7 @@ #include "private.h" #include + #include #include void pw3270_window_add_actions(GtkWidget * appwindow) { @@ -63,23 +64,34 @@ } } + // Map V3270 actions + { + const V3270_ACTION * actions = v3270_get_actions(); + + for(ix = 0; actions[ix].name; ix++) { + GAction * action = v3270_action_new(&actions[ix]); + g_action_map_add_action(map,action); + } + + } + // Map special actions { GAction * actions[] = { pw3270_action_new_pfkey(), pw3270_action_new_pakey(), - pw3270_action_connect_new(), - pw3270_action_copy_new(), - pw3270_action_cut_new(), - pw3270_action_paste_new(), +// pw3270_action_connect_new(), +// pw3270_action_copy_new(), +// pw3270_action_cut_new(), +// pw3270_action_paste_new(), // pw3270_action_save_new(), // pw3270_action_save_screen_new(), // pw3270_action_save_selected_new(), - pw3270_action_print_new(), - pw3270_action_print_all_new(), - pw3270_action_print_selected_new(), +// pw3270_action_print_new(), +// pw3270_action_print_all_new(), +// pw3270_action_print_selected_new(), }; diff --git a/src/objects/application/application.c b/src/objects/application/application.c index 2e1ced3..dd00c45 100644 --- a/src/objects/application/application.c +++ b/src/objects/application/application.c @@ -310,6 +310,7 @@ } + /* // Create conditional actions. static const struct { const gchar * label; @@ -350,6 +351,7 @@ ); } + */ // Present the new window pw3270_window_set_current_page(window,0); diff --git a/src/objects/toolbar/actions.c b/src/objects/toolbar/actions.c index ca7ee41..43b8354 100644 --- a/src/objects/toolbar/actions.c +++ b/src/objects/toolbar/actions.c @@ -70,16 +70,23 @@ action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1); } + debug("%s(%s)=%p",__FUNCTION__,name,action); + 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 { + item = gtk_tool_button_new_from_action(action,GTK_ICON_SIZE_LARGE_TOOLBAR); + } + /* + else { debug("Creating button \"%s\" from action name",name); item = GTK_TOOL_ITEM(pw3270_tool_button_new_from_action_name(name)); } + */ if(item) { + gtk_widget_show_all(GTK_WIDGET(item)); + if(action && g_action_get_parameter_type(action) == G_VARIANT_TYPE_STRING) { g_autofree gchar * detailed = g_strconcat(name,"::",NULL); gtk_actionable_set_detailed_action_name(GTK_ACTIONABLE(item),detailed); @@ -89,6 +96,11 @@ gtk_toolbar_insert(GTK_TOOLBAR(toolbar),item,pos); return GTK_WIDGET(item); + + } else { + + g_warning("Can't create toolbar item for action \"%s\"",name); + } } diff --git a/src/objects/toolbar/toolbar.c b/src/objects/toolbar/toolbar.c index 1ea85f3..c35001b 100644 --- a/src/objects/toolbar/toolbar.c +++ b/src/objects/toolbar/toolbar.c @@ -270,6 +270,7 @@ return g_object_new(PW3270_TYPE_TOOLBAR, NULL); } + /* GtkWidget * pw3270_toolbar_insert_lib3270_action(GtkWidget *toolbar, const LIB3270_ACTION *action, gint pos) { g_return_val_if_fail(GTK_IS_TOOLBAR(toolbar),NULL); @@ -303,6 +304,7 @@ return GTK_WIDGET(item); } + */ gboolean popup_context_menu(GtkToolbar *widget, gint G_GNUC_UNUSED(x), gint G_GNUC_UNUSED(y), gint button_number) { diff --git a/src/objects/toolbar/toolbutton.c b/src/objects/toolbar/toolbutton.c index 4b6be40..7bcbf41 100644 --- a/src/objects/toolbar/toolbutton.c +++ b/src/objects/toolbar/toolbutton.c @@ -30,6 +30,7 @@ #include "private.h" #include + /* static const struct Button { const gchar * name; const gchar * icon_name; @@ -162,4 +163,5 @@ return pw3270_tool_button_new_from_action_name(action_name); } + */ diff --git a/src/objects/window/actions/hostproperties.c b/src/objects/window/actions/hostproperties.c index f1ead66..027a2ee 100644 --- a/src/objects/window/actions/hostproperties.c +++ b/src/objects/window/actions/hostproperties.c @@ -50,7 +50,7 @@ GtkWidget * factory(GtkWidget *terminal) { GtkWidget * dialog = v3270_settings_dialog_new(); - V3270Settings * settings = GTK_V3270_SETTINGS(v3270_host_select_new()); + V3270Settings * settings = GTK_V3270_SETTINGS(v3270_host_settings_new()); if(settings->title) gtk_window_set_title(GTK_WINDOW(dialog), settings->title); diff --git a/src/objects/window/header.c b/src/objects/window/header.c index 7719e9e..c1acaba 100644 --- a/src/objects/window/header.c +++ b/src/objects/window/header.c @@ -84,7 +84,7 @@ } - static void on_sensitive(GtkWidget *button, GParamSpec *spec, GtkWidget *widget) { + static void on_sensitive(GtkWidget G_GNUC_UNUSED(*button), GParamSpec G_GNUC_UNUSED(*spec), GtkWidget *widget) { gboolean sensitive; g_object_get(button, "sensitive", &sensitive, NULL); @@ -100,7 +100,10 @@ // It's a menu g_autofree gchar * icon_name = g_strconcat(action_name+5,"-symbolic",NULL); - button = pw3270_setup_image_button(gtk_menu_button_new(),icon_name); + + button = gtk_menu_button_new(); + gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_MENU)); + gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); gtk_widget_set_visible(button,TRUE); @@ -113,8 +116,19 @@ // It's a window action. GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4); - if(action) - button = pw3270_action_button_new(action,action_name); + if(action) { + + button = gtk_button_new_from_action(action,GTK_ICON_SIZE_BUTTON); + + gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name); + gtk_widget_set_visible(button,g_action_get_enabled(action)); + + + } else { + + g_warning("Can't find action \"%s\"",action_name+4); + + } } diff --git a/src/objects/window/private.h b/src/objects/window/private.h index b165487..9c258fe 100644 --- a/src/objects/window/private.h +++ b/src/objects/window/private.h @@ -73,9 +73,6 @@ }; - // Internal methods - G_GNUC_INTERNAL GtkWidget * pw3270_setup_image_button(GtkWidget *button, const gchar *image_name); - // Actions G_GNUC_INTERNAL GAction * pw3270_action_host_properties_new(void); G_GNUC_INTERNAL GAction * pw3270_set_color_action_new(void); diff --git a/src/objects/window/terminal.c b/src/objects/window/terminal.c index 078a27d..5e42ecd 100644 --- a/src/objects/window/terminal.c +++ b/src/objects/window/terminal.c @@ -86,8 +86,14 @@ GAction * action = g_action_map_lookup_action(G_ACTION_MAP(window), actions[ix]); - if(action && PW3270_IS_ACTION(action)) { - pw3270_action_set_terminal_widget(action,terminal); + if(action) { + + if(V3270_IS_ACTION(action)) { + v3270_action_set_terminal_widget(action,terminal); + } else if(PW3270_IS_ACTION(action)) { + pw3270_action_set_terminal_widget(action,terminal); + } + } } diff --git a/src/objects/window/tools.c b/src/objects/window/tools.c index b695724..1c4e074 100644 --- a/src/objects/window/tools.c +++ b/src/objects/window/tools.c @@ -30,6 +30,7 @@ #include "private.h" #include + /* GtkWidget * pw3270_setup_image_button(GtkWidget *button, const gchar *image_name) { gtk_button_set_image(GTK_BUTTON(button),gtk_image_new_from_icon_name(image_name,GTK_ICON_SIZE_MENU)); @@ -41,6 +42,7 @@ return button; } +*/ gboolean pw3270_settings_set_int(const gchar *key, gint value) { diff --git a/src/objects/window/window.c b/src/objects/window/window.c index 692ba10..8f6c406 100644 --- a/src/objects/window/window.c +++ b/src/objects/window/window.c @@ -142,6 +142,8 @@ // pw3270_window_add_actions(GTK_WIDGET(widget)); + g_action_map_add_v3270_actions(G_ACTION_MAP(widget)); + // Map special actions { size_t ix; -- libgit2 0.21.2