diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index 0017546..99a8254 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -171,7 +171,6 @@ void pw3270Action_init(pw3270Action *action) { - action->name = NULL; action->terminal = NULL; action->state = NULL; action->activate = activate; @@ -182,7 +181,7 @@ pw3270Action * action = PW3270_ACTION(object); - debug("Finalizing action %p (%s)",object,action->name); +// debug("Finalizing action %p (%s)",object,action->name); if(action->state) { g_variant_unref(action->state); @@ -194,10 +193,12 @@ action->terminal = NULL; } + /* if(action->name) { g_free(action->name); action->name = NULL; } + */ if(action->parameter_type) { g_variant_type_free(action->parameter_type); @@ -250,7 +251,7 @@ switch (prop_id) { case PROP_NAME: - pw3270_action_set_name(action, g_value_get_string(value)); +// pw3270_action_set_name(action, g_value_get_string(value)); break; case PROP_PARAMETER_TYPE: @@ -272,11 +273,12 @@ } const gchar * pw3270_action_get_name(GAction *action) { - return PW3270_ACTION(action)->name; + return PW3270_ACTION(action)->get_name(action); } void pw3270_action_set_name(GAction *object, const gchar *name) { +/* pw3270Action * action = PW3270_ACTION(object); // debug("%s %s -> %s", __FUNCTION__, action->name, name); @@ -288,6 +290,7 @@ action->name = g_strdup(name); else action->name = NULL; +*/ } @@ -357,12 +360,6 @@ void pw3270_action_notify_enabled(GAction *object) { - 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"); diff --git a/src/objects/actions/lib3270/action.c b/src/objects/actions/lib3270/action.c index 9bfdd3e..e2baa9c 100644 --- a/src/objects/actions/lib3270/action.c +++ b/src/objects/actions/lib3270/action.c @@ -114,9 +114,16 @@ } - void Lib3270Action_init(Lib3270Action *action) { -// debug("%s",__FUNCTION__); - PW3270_ACTION(action)->activate = activate; + static const gchar * get_name(GAction *action) { + return PW3270_LIB3270_ACTION(action)->definition->name; + } + + void Lib3270Action_init(Lib3270Action *object) { + pw3270Action * action = PW3270_ACTION(object); + + action->activate = activate; + action->get_name = get_name; + } GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition) { @@ -127,14 +134,6 @@ action->definition = definition; action->listener = NULL; - // Setup the default name. - pw3270Action * abstract = PW3270_ACTION(action); - - if(abstract->name) - g_free(abstract->name); - - 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 af78042..22fc08c 100644 --- a/src/objects/actions/lib3270/pakey.c +++ b/src/objects/actions/lib3270/pakey.c @@ -109,23 +109,20 @@ } - void Lib3270PaAction_init(Lib3270PaAction *action) { - PW3270_ACTION(action)->activate = activate; + static const gchar * get_name(GAction G_GNUC_UNUSED(*action)) { + return "pakey"; } - GAction * pw3270_action_new_pakey(void) { - - Lib3270PaAction * action = (Lib3270PaAction *) g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL); - - // Setup the default name. - pw3270Action * abstract = PW3270_ACTION(action); + void Lib3270PaAction_init(Lib3270PaAction *object) { + pw3270Action * action = PW3270_ACTION(object); - if(abstract->name) - g_free(abstract->name); + action->activate = activate; + action->get_name = get_name; + } - abstract->name = g_strdup("pakey"); - return G_ACTION(action); + GAction * pw3270_action_new_pakey(void) { + return G_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); } void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { diff --git a/src/objects/actions/lib3270/pfkey.c b/src/objects/actions/lib3270/pfkey.c index a845058..e4239e6 100644 --- a/src/objects/actions/lib3270/pfkey.c +++ b/src/objects/actions/lib3270/pfkey.c @@ -108,24 +108,19 @@ } - void Lib3270PfAction_init(Lib3270PfAction *action) { - PW3270_ACTION(action)->activate = activate; + static const gchar * get_name(GAction *action) { + return "pakey"; } - GAction * pw3270_action_new_pfkey(void) { - - Lib3270PfAction * action = (Lib3270PfAction *) g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL); - - // Setup the default name. - pw3270Action * abstract = PW3270_ACTION(action); - - if(abstract->name) - g_free(abstract->name); + void Lib3270PfAction_init(Lib3270PfAction *object) { + pw3270Action * action = PW3270_ACTION(object); - abstract->name = g_strdup("pfkey"); - - return G_ACTION(action); + action->activate = activate; + action->get_name = get_name; + } + GAction * pw3270_action_new_pfkey(void) { + return G_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); } void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { diff --git a/src/objects/actions/lib3270/toggle.c b/src/objects/actions/lib3270/toggle.c index 5fa3a68..f792fc9 100644 --- a/src/objects/actions/lib3270/toggle.c +++ b/src/objects/actions/lib3270/toggle.c @@ -105,12 +105,18 @@ } - void Lib3270ToggleAction_init(Lib3270ToggleAction *action) { + static const gchar * get_name(GAction *action) { + return PW3270_LIB3270_TOGGLE_ACTION(action)->definition->name; + } + + void Lib3270ToggleAction_init(Lib3270ToggleAction *toggle) { - action->definition = NULL; - action->listener = NULL; + toggle->definition = NULL; + toggle->listener = NULL; - PW3270_ACTION(action)->activate = activate; + pw3270Action * action = PW3270_ACTION(toggle); + action->activate = activate; + action->get_name = get_name; } @@ -122,10 +128,12 @@ // Setup the default name. pw3270Action * abstract = PW3270_ACTION(action); + /* if(abstract->name) g_free(abstract->name); abstract->name = g_strconcat("win.",definition->name,NULL); + */ return G_ACTION(action); diff --git a/src/objects/actions/private.h b/src/objects/actions/private.h index 66ad1ef..18d6059 100644 --- a/src/objects/actions/private.h +++ b/src/objects/actions/private.h @@ -57,9 +57,9 @@ GVariantType * parameter_type; GVariant * state; GtkWidget * terminal; - gchar * name; void (*activate)(GAction *action, GVariant *parameter, GtkWidget *terminal); + const gchar * (*get_name)(GAction *action); }; diff --git a/src/objects/toolbar/toolbutton.c b/src/objects/toolbar/toolbutton.c new file mode 100644 index 0000000..32aa951 --- /dev/null +++ b/src/objects/toolbar/toolbutton.c @@ -0,0 +1,158 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "private.h" + #include + + static const struct Button { + const gchar * name; + const gchar * icon_name; + const gchar * label; + const gchar * tooltip; + } buttons[] = { + { + .name = "connect", + .icon_name = "gtk-connect", + .label = N_("Connect"), + .tooltip = N_("Connect to host") + }, + + { + .name = "close", + .icon_name = "window-close", + .label = N_("Close"), + .tooltip = N_("Close window") + }, + + { + .name = "preferences", + .icon_name = "preferences-other", + .label = N_("Preferences"), + } + + }; + + static const struct Button * get_button_info(const gchar *name) { + + size_t ix; + const gchar * ptr = strchr(name,'.'); + + if(ptr) + ptr++; + else + ptr = name; + + for(ix = 0; ix < G_N_ELEMENTS(buttons); ix++) { + + if(!g_ascii_strcasecmp(ptr,buttons[ix].name)) { + return &buttons[ix]; + } + + } + + return NULL; + } + + static GtkWidget * setup_button(GtkWidget *button, const gchar *action_name) { + + if(button) { + gtk_tool_button_set_use_underline(GTK_TOOL_BUTTON(button),TRUE); + gtk_widget_show_all(GTK_WIDGET(button)); + } + + debug("%s(%s)=%p",__FUNCTION__,action_name,button); + + return button; + + } + + GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name) { + + // Do I have button info? + GtkToolItem * button = NULL; + + const struct Button * info = get_button_info(action_name); + + if(info) { + + button = gtk_tool_button_new( + NULL, + info->label + ); + + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(button),info->icon_name); + + if(info->tooltip) + gtk_widget_set_tooltip_markup(GTK_WIDGET(button),info->tooltip); + + + } else { + + g_warning("No toolbar info for action \"%s\"",action_name); + + } + + return setup_button(GTK_WIDGET(button),action_name); + + } + + GtkWidget * pw3270_tool_button_new(GAction *action) { + + const gchar * action_name = g_action_get_name(action); + GtkToolItem * button = NULL; + + 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; + } + + button = gtk_tool_button_new( + NULL, + pw3270_action_get_label(action) + ); + + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(button),icon_name); + + const gchar * tooltip = pw3270_action_get_tooltip(action); + if(tooltip) + gtk_widget_set_tooltip_markup(GTK_WIDGET(button),tooltip); + + return setup_button(GTK_WIDGET(button),action_name); + + } + + return pw3270_tool_button_new_from_action_name(action_name); + + } + -- libgit2 0.21.2