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