From ec7b641497a9479bf2eaa2cf04943cf9a5aab1d0 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Wed, 15 Jan 2014 11:29:21 +0000 Subject: [PATCH] Separando fontes para tratamento das propriedades do widget, convertendo luname numa propriedade --- oia.c | 29 ++++++++++++++++++----------- private.h | 30 ++++++++++++++++++++++++++---- properties.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sources.mak | 2 +- widget.c | 121 +++---------------------------------------------------------------------------------------------------------------------- 5 files changed, 181 insertions(+), 134 deletions(-) create mode 100644 properties.c diff --git a/oia.c b/oia.c index fc2c7e1..2326738 100644 --- a/oia.c +++ b/oia.c @@ -647,22 +647,29 @@ void v3270_update_luname(GtkWidget *widget,const gchar *name) GdkRectangle * rect; v3270 * terminal = GTK_V3270(widget); - if(!terminal->surface) - return; + if(terminal->surface) + { + cr = set_update_region(terminal,&rect,V3270_OIA_LUNAME); - cr = set_update_region(terminal,&rect,V3270_OIA_LUNAME); + if(name) + { + cairo_move_to(cr,rect->x,rect->y+terminal->metrics.height); + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_LUNAME); + cairo_show_text(cr,name); + cairo_stroke(cr); + } - if(name) - { - cairo_move_to(cr,rect->x,rect->y+terminal->metrics.height); - gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_OIA_LUNAME); - cairo_show_text(cr,name); - cairo_stroke(cr); + cairo_destroy(cr); + + gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); } - cairo_destroy(cr); +#if GTK_CHECK_VERSION(2,26,0) + g_object_notify_by_pspec(G_OBJECT(widget), v3270_properties[PROP_LUNAME]); +#else + g_object_notify(G_OBJECT(widget),"luname"); +#endif // GTK_CHECK_VERSION - gtk_widget_queue_draw_area(GTK_WIDGET(terminal),rect->x,rect->y,rect->width,rect->height); } void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id) diff --git a/private.h b/private.h index 966d13f..51549b7 100644 --- a/private.h +++ b/private.h @@ -51,7 +51,6 @@ G_BEGIN_DECLS void (*activate)(GtkWidget *widget); void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE toggle_id,gboolean toggle_state,const gchar *toggle_name); void (*message_changed)(v3270 *widget, LIB3270_MESSAGE id); - void (*luname_changed)(GtkWidget *widget,const gchar *luname); void (*popup_message)(GtkWidget *widget, LIB3270_NOTIFY id , const gchar *title, const gchar *message, const gchar *text); gboolean (*keypress)(GtkWidget *widget,guint keyval,GdkModifierType state); @@ -71,7 +70,6 @@ G_BEGIN_DECLS { SIGNAL_TOGGLE_CHANGED, SIGNAL_MESSAGE_CHANGED, - SIGNAL_LUNAME_CHANGED, SIGNAL_KEYPRESS, SIGNAL_CONNECTED, SIGNAL_DISCONNECTED, @@ -211,11 +209,34 @@ G_BEGIN_DECLS }; +/*--[ Properties ]-----------------------------------------------------------------------------------*/ + + enum + { + PROP_0, + + /* Construct */ + PROP_TYPE, + + + /* Widget properties */ + PROP_ONLINE, + PROP_SELECTION, + PROP_MODEL, + PROP_LUNAME, + + /* Toggles - always the last one, the real values are PROP_TOGGLE+LIB3270_TOGGLE */ + PROP_TOGGLE + }; + + #define PROP_LAST (PROP_TOGGLE+LIB3270_TOGGLE_COUNT) + + /*--[ Globals ]--------------------------------------------------------------------------------------*/ G_GNUC_INTERNAL guint v3270_widget_signal[LAST_SIGNAL]; G_GNUC_INTERNAL GdkCursor * v3270_cursor[V3270_CURSOR_COUNT]; - + G_GNUC_INTERNAL GParamSpec * v3270_properties[PROP_LAST]; /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ @@ -271,12 +292,13 @@ void v3270_update_font_metrics(v3270 *terminal, cairo_t *cr, int width, int h void v3270_update_cursor_rect(v3270 *widget, GdkRectangle *rect, unsigned char chr, unsigned short attr); -void v3270_update_luname(GtkWidget *widget,const gchar *name); void v3270_update_message(v3270 *widget, LIB3270_MESSAGE id); void v3270_update_cursor(H3270 *session, unsigned short row, unsigned short col, unsigned char c, unsigned short attr); void v3270_update_oia(H3270 *session, LIB3270_FLAG id, unsigned char on); void v3270_update_ssl(H3270 *session, LIB3270_SSL_STATE state); +G_GNUC_INTERNAL void v3270_update_luname(GtkWidget *widget,const gchar *name); + // Keyboard & Mouse gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event); gboolean v3270_key_release_event(GtkWidget *widget, GdkEventKey *event); diff --git a/properties.c b/properties.c new file mode 100644 index 0000000..d1ca3d7 --- /dev/null +++ b/properties.c @@ -0,0 +1,133 @@ +/* + * "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) + * + */ + + #include + #include + #include + #include + #include + #include + #include + #include + #include "private.h" + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + GParamSpec * v3270_properties[PROP_LAST] = { 0 }; + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static void v3270_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) + { + v3270 *window = GTK_V3270(object); + + switch (prop_id) + { + case PROP_MODEL: + lib3270_set_model(window->host,g_value_get_string(value)); + break; + + default: + if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) + { + lib3270_set_toggle(window->host,prop_id - PROP_TOGGLE, (int) g_value_get_boolean (value)); + return; + } + 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); + + switch (prop_id) + { + case PROP_MODEL: + g_value_set_string(value,lib3270_get_model(window->host)); + break; + + case PROP_LUNAME: + g_value_set_string(value,lib3270_get_luname(window->host)); + break; + + case PROP_ONLINE: + g_value_set_boolean(value,lib3270_is_connected(window->host) ? TRUE : FALSE ); + break; + + case PROP_SELECTION: + g_value_set_boolean(value,lib3270_has_selection(window->host) ? TRUE : FALSE ); + break; + + default: + if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) + { + g_value_set_boolean(value,lib3270_get_toggle(window->host,prop_id - PROP_TOGGLE) ? TRUE : FALSE ); + return; + } + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } + } + + void v3270_init_properties(GObjectClass * gobject_class) + { + gobject_class->set_property = v3270_set_property; + gobject_class->get_property = v3270_get_property; + + v3270_properties[PROP_ONLINE] = g_param_spec_boolean( + "online", + "online", + "True if is online", + FALSE,G_PARAM_READABLE); + g_object_class_install_property(gobject_class,PROP_ONLINE,v3270_properties[PROP_ONLINE]); + + v3270_properties[PROP_SELECTION] = g_param_spec_boolean( + "selection", + "selection", + "True on selected area", + FALSE,G_PARAM_READABLE); + g_object_class_install_property(gobject_class,PROP_SELECTION,v3270_properties[PROP_SELECTION]); + + v3270_properties[PROP_MODEL] = g_param_spec_string( + "model", + "model", + "The model of 3270 display to be emulated", + FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE); + g_object_class_install_property(gobject_class,PROP_MODEL,v3270_properties[PROP_MODEL]); + + // Toggle properties + int f; + + for(f=0;fhost,g_value_get_string(value)); - break; - - default: - if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) - { - lib3270_set_toggle(window->host,prop_id - PROP_TOGGLE, (int) g_value_get_boolean (value)); - return; - } - 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); - - switch (prop_id) - { - case PROP_MODEL: - g_value_set_string(value,lib3270_get_model(window->host)); - break; - - case PROP_ONLINE: - g_value_set_boolean(value,lib3270_is_connected(window->host) ? TRUE : FALSE ); - break; - - case PROP_SELECTION: - g_value_set_boolean(value,lib3270_has_selection(window->host) ? TRUE : FALSE ); - break; - - default: - if(prop_id < (PROP_TOGGLE + LIB3270_TOGGLE_COUNT)) - { - g_value_set_boolean(value,lib3270_get_toggle(window->host,prop_id - PROP_TOGGLE) ? TRUE : FALSE ); - return; - } - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - } -} - static void v3270_class_init(v3270Class *klass) { GObjectClass * gobject_class = G_OBJECT_CLASS(klass); @@ -416,7 +344,6 @@ static void v3270_class_init(v3270Class *klass) klass->activate = v3270_activate; klass->toggle_changed = v3270_toggle_changed; klass->message_changed = v3270_update_message; - klass->luname_changed = v3270_update_luname; klass->popup_message = v3270_popup_message; #if GTK_CHECK_VERSION(3,0,0) @@ -524,15 +451,6 @@ static void v3270_class_init(v3270Class *klass) v3270_VOID__VOID_ENUM, G_TYPE_NONE, 1, G_TYPE_UINT); - v3270_widget_signal[SIGNAL_LUNAME_CHANGED] = - g_signal_new( "luname_changed", - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (v3270Class, luname_changed), - NULL, NULL, - v3270_VOID__VOID_POINTER, - G_TYPE_NONE, 1, G_TYPE_STRING); - v3270_widget_signal[SIGNAL_KEYPRESS] = g_signal_new( "keypress", G_OBJECT_CLASS_TYPE (gobject_class), @@ -651,40 +569,7 @@ static void v3270_class_init(v3270Class *klass) v3270_VOID__VOID, G_TYPE_NONE, 0); - - // Properties - gobject_class->set_property = v3270_set_property; - gobject_class->get_property = v3270_get_property; - - v3270_properties[PROP_ONLINE] = g_param_spec_boolean( - "online", - "online", - "True if is online", - FALSE,G_PARAM_READABLE); - g_object_class_install_property(gobject_class,PROP_ONLINE,v3270_properties[PROP_ONLINE]); - - v3270_properties[PROP_SELECTION] = g_param_spec_boolean( - "selection", - "selection", - "True on selected area", - FALSE,G_PARAM_READABLE); - g_object_class_install_property(gobject_class,PROP_SELECTION,v3270_properties[PROP_SELECTION]); - - v3270_properties[PROP_MODEL] = g_param_spec_string( - "model", - "model", - "The model of 3270 display to be emulated", - FALSE,G_PARAM_READABLE|G_PARAM_WRITABLE); - g_object_class_install_property(gobject_class,PROP_MODEL,v3270_properties[PROP_MODEL]); - - // Toggle properties - int f; - - for(f=0;fwidget), v3270_widget_signal[SIGNAL_LUNAME_CHANGED], 0, (gchar *) name); + v3270_update_luname(GTK_WIDGET(session->widget),name); } static void select_cursor(H3270 *session, LIB3270_CURSOR id) -- libgit2 0.21.2