/* * "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., 59 Temple * Place, Suite 330, Boston, MA, 02111-1307, USA * * Este programa está nomeado como actions.c e possui - linhas de código. * * Contatos: * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) * licinio@bb.com.br (Licínio Luis Branco) * kraucer@bb.com.br (Kraucer Fernandes Mazuco) * */ #include "globals.h" #include "uiparser/parser.h" #include "v3270/v3270.h" #include #include #include #define ERROR_DOMAIN g_quark_from_static_string(PACKAGE_NAME) #define TOGGLE_GDKDEBUG LIB3270_TOGGLE_COUNT+1 /*--[ Implement ]------------------------------------------------------------------------------------*/ static void lib3270_action(GtkAction *action, GtkWidget *widget) { int (*call)(H3270 *h) = (int (*)(H3270 *h)) g_object_get_data(G_OBJECT(action),"lib3270_call"); trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); call(GTK_V3270(widget)->host); } static void connect_action(GtkAction *action, GtkWidget *widget) { gchar *host = (gchar *) g_object_get_data(G_OBJECT(action),"host"); trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); if(host) { v3270_connect(widget,host); return; } host = get_string_from_config("host","uri",""); if(*host) { v3270_connect(widget,host); g_free(host); return; } g_free(host); hostname_action(action,widget); } static void nop_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); } static void disconnect_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); v3270_disconnect(widget); } static void activate_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); gtk_widget_activate(widget); } static void reload_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); v3270_reload(widget); } static void copy_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); v3270_copy(widget); } static void append_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); v3270_copy_append(widget); } static void paste_clipboard_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); v3270_paste(widget); } static void paste_next_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); lib3270_pastenext(GTK_V3270(widget)->host); } static void connect_standard_action(GtkAction *action, GtkWidget *widget, const gchar *name) { #undef DECLARE_LIB3270_ACTION #undef DECLARE_LIB3270_CLEAR_SELECTION_ACTION #undef DECLARE_LIB3270_KEY_ACTION #undef DECLARE_LIB3270_CURSOR_ACTION #undef DECLARE_LIB3270_FKEY_ACTION #define DECLARE_LIB3270_ACTION( name ) { #name, lib3270_ ## name }, #define DECLARE_LIB3270_CLEAR_SELECTION_ACTION( name ) { #name, lib3270_ ## name }, #define DECLARE_LIB3270_KEY_ACTION( name ) { #name, lib3270_ ## name }, #define DECLARE_LIB3270_CURSOR_ACTION( name ) { #name, lib3270_cursor_ ## name }, #define DECLARE_LIB3270_FKEY_ACTION( name ) // name static const struct _lib3270_action { const gchar * name; int (*call)(H3270 *h); } lib3270_entry[] = { #include }; static const struct _gtk_action { const gchar * name; void (*call)(GtkAction *action, GtkWidget *widget); } gtk_action[] = { { "activate", activate_action }, { "reload", reload_action }, { "connect", connect_action }, { "disconnect", disconnect_action }, { "hostname", hostname_action }, { "editcolors", editcolors_action }, }; int f; // Search for lib3270 predefined actions for(f=0;fhost,toggle,gtk_toggle_action_get_active(action)); } static void selection_move_action(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); lib3270_move_selection(GTK_V3270(widget)->host,(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction")); } static void cursor_move_action(GtkAction *action, GtkWidget *widget) { int flags = (int) g_object_get_data(G_OBJECT(action),"move_flags"); trace("Action %s activated on widget %p flags=%04x",gtk_action_get_name(action),widget,(unsigned short) g_object_get_data(G_OBJECT(action),"move_flags")); lib3270_move_cursor(GTK_V3270(widget)->host,(LIB3270_DIRECTION) (flags & 0x03), (flags & 0x80) ); } static void connect_move_action(GtkAction *action, GtkWidget *widget, const gchar *target, unsigned short flags, GError **error) { if(!target) { gtk_action_set_sensitive(action,FALSE); return; } if(!g_strcasecmp(target,"selection")) { g_object_set_data(G_OBJECT(action),"direction",(gpointer) (flags & 3)); g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget); } else if(!g_strcasecmp(target,"cursor")) { g_object_set_data(G_OBJECT(action),"move_flags",(gpointer) ((int) flags)); g_signal_connect(action,"activate",G_CALLBACK(cursor_move_action),widget); } else { *error = g_error_new( ERROR_DOMAIN, ENOENT, _( "Unexpected target \"%s\""), target); } } static void action_pfkey(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pfkey")); lib3270_pfkey(GTK_V3270(widget)->host,(int) g_object_get_data(G_OBJECT(action),"pfkey")); } static void action_pakey(GtkAction *action, GtkWidget *widget) { trace("Action %s activated on widget %p key=%p",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"pakey")); lib3270_pakey(GTK_V3270(widget)->host,(int) g_object_get_data(G_OBJECT(action),"pakey")); } static void action_set_toggle(GtkAction *action, GtkWidget *widget) { LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id"); trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id); lib3270_set_toggle(GTK_V3270(widget)->host,id,1); } static void action_reset_toggle(GtkAction *action, GtkWidget *widget) { LIB3270_TOGGLE id = (LIB3270_TOGGLE) g_object_get_data(G_OBJECT(action),"toggle_id"); trace("Action %s activated on widget %p toggle=%d",gtk_action_get_name(action),widget,id); lib3270_set_toggle(GTK_V3270(widget)->host,id,0); } static void action_select_all(GtkAction *action, GtkWidget *widget) { lib3270_selectall(GTK_V3270(widget)->host); } static void action_select_field(GtkAction *action, GtkWidget *widget) { lib3270_selectfield(GTK_V3270(widget)->host); } static void action_select_none(GtkAction *action, GtkWidget *widget) { lib3270_unselect(GTK_V3270(widget)->host); } static void action_select_last(GtkAction *action, GtkWidget *widget) { lib3270_reselect(GTK_V3270(widget)->host); } static int id_from_array(const gchar *key, const gchar **array, GError **error) { int f; if(!key) return -1; for(f = 0;array[f];f++) { if(!g_strcasecmp(key,array[f])) return f; } *error = g_error_new(ERROR_DOMAIN,EINVAL, _("Unexpected or invalid attribute value \"%s\""), key ); return -1; } static int get_attribute_id(const gchar *name, const gchar *key, gchar **nm, const gchar **src, const gchar **names, const gchar **values, GError **error) { const gchar *attr = ui_get_attribute(key,names,values); int id; if(!attr) { *error = g_error_new(ERROR_DOMAIN,EINVAL,_("Attribute \"%s\" is invalid or undefined" ), key); return -1; } id = id_from_array(attr,src,error); if(id >= 0) { if(*nm) g_free(*nm); *nm = g_strconcat(name,attr,NULL); return id; } if(!*error) *error = g_error_new(ERROR_DOMAIN,EINVAL,_("Unexpected or invalid %s attribute: \"%s\"" ), key, attr); return -1; } static int setup_block_action(const gchar *name, const gchar *attr, GError **error) { int id = -1; if(!attr) { *error = g_error_new(ERROR_DOMAIN,EINVAL,_("%s action needs src attribute" ), name); } else { static const gchar * src[] = { "all", "selected", "copy", NULL }; id = id_from_array(attr,src,error); if(id < 0) { *error = g_error_new(ERROR_DOMAIN,EINVAL,_("Unexpected or invalid src attribute: \"%s\"" ), attr); } } return id; } GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash, const gchar **names, const gchar **values, GError **error) { static const gchar *actionname[ACTION_COUNT] = { "pastenext", "reselect", "setfullscreen", "resetfullscreen" }; GtkAction * action = NULL; GtkAction **toggle_action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions"); const gchar * direction = ui_get_attribute("direction",names,values); unsigned short flags = 0; const GCallback * callback = NULL; const gchar * attr; int id = 0; gchar * nm = NULL; int f; enum _action_type { ACTION_TYPE_DEFAULT, ACTION_TYPE_TOGGLE, ACTION_TYPE_MOVE, ACTION_TYPE_PFKEY, ACTION_TYPE_PAKEY, ACTION_TYPE_SET, ACTION_TYPE_RESET, ACTION_TYPE_TABLE, } action_type = ACTION_TYPE_DEFAULT; if(direction) { static const gchar *dirname[] = { "up", "down", "left", "right" }; int f; for(f=0;fhost,id) != 0)); g_signal_connect(action,"toggled",G_CALLBACK(lib3270_toggle_action),widget); break; case ACTION_TYPE_MOVE: action = gtk_action_new(nm,NULL,NULL,NULL); connect_move_action(action,widget,attr,flags,error); break; case ACTION_TYPE_PFKEY: action = gtk_action_new(nm,NULL,NULL,NULL); g_object_set_data(G_OBJECT(action),"pfkey",(gpointer) id); g_signal_connect(action,"activate",G_CALLBACK(action_pfkey),widget); break; case ACTION_TYPE_PAKEY: action = gtk_action_new(nm,NULL,NULL,NULL); g_object_set_data(G_OBJECT(action),"pakey",(gpointer) id); g_signal_connect(action,"activate",G_CALLBACK(action_pakey),widget); break; case ACTION_TYPE_SET: action = gtk_action_new(nm,NULL,NULL,NULL); g_object_set_data(G_OBJECT(action),"toggle_id",(gpointer) id); g_signal_connect(action,"activate",G_CALLBACK(action_set_toggle),widget); break; case ACTION_TYPE_RESET: action = gtk_action_new(nm,NULL,NULL,NULL); g_object_set_data(G_OBJECT(action),"toggle_id",(gpointer) id); g_signal_connect(action,"activate",G_CALLBACK(action_reset_toggle),widget); break; case ACTION_TYPE_TABLE: action = gtk_action_new(nm,NULL,NULL,NULL); g_signal_connect(action,"activate",callback[id],widget); break; } for(f=0;f