/* * "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 properties.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) * */ #ifdef WIN32 #include #include #include #endif // WIN32 #include #include #include #include #include #include #include #include #include #include #include enum _v3270_internal_property { V3270_PROPERTY_FONT_FAMILY = 2, ///< @brief Name of the font-family used by widget. V3270_PROPERTY_CLIPBOARD = 3, ///< @brief Name of the selected clipboard. V3270_PROPERTY_SESSION_NAME = 4, ///< @brief Widget's session name. V3270_PROPERTY_DYNAMIC = 5 ///< @brief Id of the first LIB3270 internal property. }; /*--[ Implement ]------------------------------------------------------------------------------------*/ static void v3270_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { v3270 * window = GTK_V3270(object); v3270Class * klass = GTK_V3270_GET_CLASS(object); debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec)); if(prop_id >= klass->properties.type.str) { const LIB3270_STRING_PROPERTY * prop = (lib3270_get_string_properties_list()+(prop_id - klass->properties.type.str)); debug("%s.%s.%s=%s",__FUNCTION__,"string",prop->name,g_value_get_string(value)); if(prop->set) prop->set(window->host,g_value_get_string(value)); } else if(prop_id >= klass->properties.type.uint) { const LIB3270_UINT_PROPERTY * prop = (lib3270_get_unsigned_properties_list()+(prop_id - klass->properties.type.uint)); debug("%s.%s.%s",__FUNCTION__,"unsigned",prop->name); if(prop->set) prop->set(window->host,g_value_get_uint(value)); } else if(prop_id >= klass->properties.type.integer) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_int_properties_list()+(prop_id - klass->properties.type.integer)); debug("%s.%s.%s",__FUNCTION__,"integer",prop->name); if(prop->set) prop->set(window->host,g_value_get_int(value)); } else if(prop_id >= klass->properties.type.boolean) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_boolean_properties_list()+(prop_id - klass->properties.type.boolean)); debug("%s.%s.%s",__FUNCTION__,"boolean",prop->name); if(prop->set) prop->set(window->host,g_value_get_boolean(value) ? 1 : 0); } else if(prop_id >= klass->properties.type.toggle) { debug("%s.%s",__FUNCTION__,"toggle"); lib3270_set_toggle(window->host,prop_id - klass->properties.type.toggle, (int) g_value_get_boolean (value)); } else { // Check for internal properties. switch(prop_id) { case V3270_PROPERTY_FONT_FAMILY: // Font-family v3270_set_font_family(GTK_WIDGET(object), g_value_get_string(value)); break; case V3270_PROPERTY_CLIPBOARD: // Clipboard { const gchar * name = g_value_get_string(value); if(!*name) { g_message("Setting default clipboard"); window->selection.target = GDK_SELECTION_CLIPBOARD; } else { GdkAtom clipboard = gdk_atom_intern(name,TRUE); if(clipboard == GDK_NONE) { g_warning("\"%s\" is not a valid clipboard name",name); } else { window->selection.target = clipboard; } } } break; case V3270_PROPERTY_SESSION_NAME: // Session Name v3270_set_session_name(GTK_WIDGET(object), g_value_get_string(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } } } static void v3270_get_property(GObject *object,guint prop_id, GValue *value, GParamSpec *pspec) { v3270 * window = GTK_V3270(object); v3270Class * klass = GTK_V3270_GET_CLASS(object); debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec)); if(prop_id >= klass->properties.type.str) { const LIB3270_STRING_PROPERTY * prop = (lib3270_get_string_properties_list()+(prop_id - klass->properties.type.str)); debug("%s.%s.%s",__FUNCTION__,"string",prop->name); if(prop->get) g_value_set_string(value,prop->get(window->host)); } else if(prop_id >= klass->properties.type.uint) { const LIB3270_UINT_PROPERTY * prop = (lib3270_get_unsigned_properties_list()+(prop_id - klass->properties.type.uint)); debug("%s.%s.%s",__FUNCTION__,"unsigned",prop->name); if(prop->get) g_value_set_uint(value,prop->get(window->host)); } else if(prop_id >= klass->properties.type.integer) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_int_properties_list()+(prop_id - klass->properties.type.integer)); debug("%s.%s.%s",__FUNCTION__,"integer",prop->name); if(prop->get) g_value_set_int(value,prop->get(window->host)); } else if(prop_id >= klass->properties.type.boolean) { const LIB3270_INT_PROPERTY * prop = (lib3270_get_boolean_properties_list()+(prop_id - klass->properties.type.boolean)); debug("%s.%s.%s",__FUNCTION__,"boolean",prop->name); if(prop->get) g_value_set_boolean(value,prop->get(window->host) != 0 ? TRUE : FALSE); } else if(prop_id >= klass->properties.type.toggle) { debug("%s.%s.%s",__FUNCTION__,"toggle",lib3270_get_toggle_name(prop_id - klass->properties.type.toggle)); g_value_set_boolean(value,lib3270_get_toggle(window->host,prop_id - klass->properties.type.toggle) ? TRUE : FALSE ); } else { // Check for internal properties. switch(prop_id) { case V3270_PROPERTY_FONT_FAMILY: // Font-family g_value_set_string(value,v3270_get_font_family(GTK_WIDGET(object))); break; case V3270_PROPERTY_CLIPBOARD: // Clipboard g_value_take_string(value,gdk_atom_name(window->selection.target)); break; case V3270_PROPERTY_SESSION_NAME: g_value_set_string(value,v3270_get_session_name(GTK_WIDGET(object))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } } } void v3270_install_property(GObjectClass *oclass, guint property_id, GParamSpec *pspec) { v3270Class * klass = GTK_V3270_CLASS(oclass); const struct { const char *name; GParamSpec **prop; } properties[] = { { "connected", &klass->properties.online }, { "luname", &klass->properties.luname }, { "model", &klass->properties.model }, { "has-selection", &klass->properties.selection }, }; size_t ix; // debug("Property %s=%u",g_param_spec_get_name(pspec),(unsigned int) property_id); g_object_class_install_property(oclass, property_id, pspec); for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { if(!g_ascii_strcasecmp(properties[ix].name,g_param_spec_get_name(pspec))) { // debug("Property \"%s\" is special",g_param_spec_get_name(pspec)); *properties[ix].prop = pspec; break; } } } void v3270_init_properties(GObjectClass * gobject_class) { size_t ix; GParamSpec * spec; v3270Class * klass = GTK_V3270_CLASS(gobject_class); debug("%s",__FUNCTION__); gobject_class->set_property = v3270_set_property; gobject_class->get_property = v3270_get_property; // Setup internal properties. // Font family klass->properties.font_family = g_param_spec_string( "font_family", "font_family", _("Font family for terminal contents"), FALSE, G_PARAM_READABLE|G_PARAM_WRITABLE ); g_object_class_install_property( gobject_class, V3270_PROPERTY_FONT_FAMILY, klass->properties.font_family ); // Session name. spec = g_param_spec_string( "session_name", "session_name", _("TN3270 Session name"), FALSE, G_PARAM_READABLE|G_PARAM_WRITABLE ); g_object_class_install_property( gobject_class, V3270_PROPERTY_SESSION_NAME, spec ); // Clipboard spec = g_param_spec_string( "clipboard", "clipboard", _("Clipboard name"), FALSE, G_PARAM_READABLE|G_PARAM_WRITABLE ); g_object_class_install_property( gobject_class, V3270_PROPERTY_CLIPBOARD, spec ); // // Create dynamic properties klass->properties.count = V3270_PROPERTY_DYNAMIC; // // Extract properties from LIB3270 control tables // // Extract toggle class. klass->properties.type.toggle = klass->properties.count; for(ix = 0; ix < LIB3270_TOGGLE_COUNT; ix++) { debug("Property %u=%s (Toggle)",(unsigned int) klass->properties.type.toggle + ix, lib3270_get_toggle_name(ix)); klass->properties.toggle[ix] = g_param_spec_boolean( lib3270_get_toggle_name(ix), lib3270_get_toggle_name(ix), lib3270_get_toggle_description(ix), FALSE, G_PARAM_WRITABLE|G_PARAM_READABLE ); v3270_install_property(gobject_class, klass->properties.count++, klass->properties.toggle[ix]); } // Creating boolean properties. klass->properties.type.boolean = klass->properties.count; const LIB3270_INT_PROPERTY * bool_props = lib3270_get_boolean_properties_list(); for(ix = 0; bool_props[ix].name; ix++) { debug("Property %u=%s (Boolean)",(unsigned int) klass->properties.type.boolean + ix, bool_props[ix].name); spec = g_param_spec_boolean( bool_props[ix].name, bool_props[ix].name, bool_props[ix].description, FALSE, (bool_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) ); v3270_install_property(gobject_class, klass->properties.count++, spec); } // Creating signed integer properties. const LIB3270_INT_PROPERTY * int_props = lib3270_get_int_properties_list(); klass->properties.type.integer = klass->properties.count; for(ix = 0; int_props[ix].name; ix++) { debug("Property %u=%s (Integer)",(unsigned int) klass->properties.type.integer + ix, int_props[ix].name); spec = g_param_spec_int( int_props[ix].name, int_props[ix].name, int_props[ix].description, 0, // Minimo INT_MAX, // Máximo 0, // Default (int_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) ); v3270_install_property(gobject_class, klass->properties.count++, spec); } // Creating unsigned integer properties. const LIB3270_UINT_PROPERTY * uint_props = lib3270_get_unsigned_properties_list(); klass->properties.type.uint = klass->properties.count; for(ix = 0; uint_props[ix].name; ix++) { debug("Property %u=%s (unsigned)",(unsigned int) klass->properties.type.integer + ix, uint_props[ix].name); spec = g_param_spec_uint( uint_props[ix].name, uint_props[ix].name, uint_props[ix].description, 0, // Minimo UINT_MAX, // Máximo 0, // Default (uint_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) ); v3270_install_property(gobject_class, klass->properties.count++, spec); } // Creating string properties. const LIB3270_STRING_PROPERTY * str_props = lib3270_get_string_properties_list(); klass->properties.type.str = klass->properties.count; for(ix = 0; str_props[ix].name; ix++) { debug("Property %u=%s (String)",(unsigned int) klass->properties.type.str + ix, str_props[ix].name); spec = g_param_spec_string( str_props[ix].name, str_props[ix].name, str_props[ix].description, FALSE, (str_props[ix].set == NULL ? G_PARAM_READABLE : (G_PARAM_READABLE|G_PARAM_WRITABLE)) ); v3270_install_property(gobject_class, klass->properties.count++, spec); } } LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) { g_return_if_fail(GTK_IS_V3270(widget)); GTK_V3270(widget)->activity.disconnect = minutes; } LIB3270_EXPORT guint v3270_get_auto_disconnect(GtkWidget *widget) { g_return_val_if_fail(GTK_IS_V3270(widget),0); return GTK_V3270(widget)->activity.disconnect; } LIB3270_EXPORT gboolean v3270_get_toggle(GtkWidget *widget, LIB3270_TOGGLE ix) { g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); if(ix < LIB3270_TOGGLE_COUNT) return lib3270_get_toggle(GTK_V3270(widget)->host,ix) ? TRUE : FALSE; return FALSE; } LIB3270_EXPORT gboolean v3270_set_toggle(GtkWidget *widget, LIB3270_TOGGLE ix, gboolean state) { g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); if(ix < LIB3270_TOGGLE_COUNT) return lib3270_set_toggle(GTK_V3270(widget)->host,ix,state ? 1 : 0) ? TRUE : FALSE; return FALSE; }