From 513e15ae758355fa2aadee32b03ed9f77978aa1a Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 30 Aug 2012 10:33:54 +0000 Subject: [PATCH] Rômulo Silva Neiva 29 de agosto de 2012 07:54 --- pw3270.cbp | 3 +++ src/include/v3270.h | 4 +++- src/pw3270/actions.c | 49 ++++++++++++++++++++++++------------------------- src/pw3270/uiparser/parsefile.c | 11 +---------- src/pw3270/uiparser/parser.c | 32 +++++++++++++++++++++++++++++++- src/pw3270/uiparser/parser.h | 26 +++++++++++++++++++++----- src/pw3270/uiparser/private.h | 4 ++++ src/pw3270/uiparser/scroll.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pw3270/uiparser/sources.mak | 4 +++- src/pw3270/v3270/mouse.c | 25 +++++++++++++++++++++++++ src/pw3270/v3270/private.h | 1 + src/pw3270/v3270/widget.c | 1 + 12 files changed, 183 insertions(+), 43 deletions(-) create mode 100644 src/pw3270/uiparser/scroll.c diff --git a/pw3270.cbp b/pw3270.cbp index b81001e..7e89da6 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -274,6 +274,9 @@ + + diff --git a/src/include/v3270.h b/src/include/v3270.h index 1efe98a..fbee5e7 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -180,7 +180,6 @@ LIB3270_EXPORT void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color); LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color); LIB3270_EXPORT GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id); - LIB3270_EXPORT gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action); // Misc LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget); @@ -191,6 +190,9 @@ LIB3270_EXPORT void v3270_set_host(GtkWidget *widget, const gchar *uri); + // Keyboard & Mouse special actions + LIB3270_EXPORT gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action); + LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action); G_END_DECLS diff --git a/src/pw3270/actions.c b/src/pw3270/actions.c index 70a30a6..9ac0446 100644 --- a/src/pw3270/actions.c +++ b/src/pw3270/actions.c @@ -468,15 +468,15 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash "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 = NULL; - int id = 0; - gchar * nm = NULL; - int f; + GtkAction * action = NULL; + GtkAction **toggle_action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions"); + UI_ATTR_DIRECTION dir = ui_get_dir_attribute(names,values); + unsigned short flags = 0; + const GCallback * callback = NULL; + const gchar * attr = NULL; + int id = 0; + gchar * nm = NULL; + int f; enum _action_type { @@ -492,20 +492,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash } action_type = ACTION_TYPE_DEFAULT; - if(direction) - { - static const gchar *dirname[] = { "up", "down", "left", "right" }; - int f; - - for(f=0;fdisabled) - { - info->disabled++; - trace("%s: <%s> disabled=%d",__FUNCTION__,element_name,info->disabled); - return; - } -*/ - for(f=0;fdisabled++; info->action = NULL; } } diff --git a/src/pw3270/uiparser/parser.c b/src/pw3270/uiparser/parser.c index 0fffdca..61f99e4 100644 --- a/src/pw3270/uiparser/parser.c +++ b/src/pw3270/uiparser/parser.c @@ -36,6 +36,9 @@ #include #endif // HAVE_GTKMAC +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + +static const gchar * dirname[] = { "up", "down", "left", "right" }; /*--[ Implement ]------------------------------------------------------------------------------------*/ @@ -208,13 +211,15 @@ void parser_build(struct parser *p, GtkWidget *widget) // Pack top toolbars g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); - // Pack center widget + // Pack & configure center widget if(widget) { + ui_set_scroll_actions(widget,p->scroll_action); gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); gtk_widget_show(widget); } + // gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); gtk_container_add(GTK_CONTAINER(p->toplevel),vbox); @@ -335,3 +340,28 @@ int ui_parse_xml_folder(GtkWindow *toplevel, const gchar *path, const gchar ** g return 0; } + +UI_ATTR_DIRECTION ui_get_dir_attribute(const gchar **names, const gchar **values) +{ + const gchar * dir = ui_get_attribute("direction",names,values); + int f; + + if(dir) + { + for(f=0;f + * + * 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 scroll.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 + #include "private.h" + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + GObject * ui_create_scroll(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) + { + UI_ATTR_DIRECTION dir = ui_get_dir_attribute(names,values); + + if(info->element) + { + *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "<%s> should be on toplevel"), "scroll"); + return NULL; + } + + if(!action) + { + *error = g_error_new(ERROR_DOMAIN,ENOENT, _( "<%s> requires %s"),"scroll",_( "an action attribute" ) ); + return NULL; + } + + if(dir == UI_ATTR_DIRECTION_NONE) + { + *error = g_error_new(ERROR_DOMAIN,ENOENT, _( "<%s> requires %s"),"scroll",_( "a direction attribute" ) ); + return NULL; + } + + info->scroll_action[dir] = action; + + return NULL; + } + + void ui_end_scroll(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error) + { + } diff --git a/src/pw3270/uiparser/sources.mak b/src/pw3270/uiparser/sources.mak index ec83861..a1ae1d0 100644 --- a/src/pw3270/uiparser/sources.mak +++ b/src/pw3270/uiparser/sources.mak @@ -1,3 +1,5 @@ UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \ - parsefile.c separator.c toolbar.c toolitem.c popup.c script.c + parsefile.c separator.c toolbar.c toolitem.c popup.c script.c \ + scroll.c + diff --git a/src/pw3270/v3270/mouse.c b/src/pw3270/v3270/mouse.c index 102849f..0b192b2 100644 --- a/src/pw3270/v3270/mouse.c +++ b/src/pw3270/v3270/mouse.c @@ -36,6 +36,10 @@ #include #include +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + static GtkAction *action_scroll[] = { NULL, NULL, NULL, NULL }; + /*--[ Implement ]------------------------------------------------------------------------------------*/ gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y) @@ -262,3 +266,24 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) return FALSE; } + +void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) +{ + g_return_if_fail(GTK_IS_V3270(widget)); + action_scroll[((int) direction) & 0x03] = action; +} + +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer user_data) +{ + v3270 * terminal = GTK_V3270(widget); + + if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(action_scroll)) + return FALSE; + + trace("Scroll: %d Action: %p",event->direction,action_scroll[event->direction]); + + if(action_scroll[event->direction]) + gtk_action_activate(action_scroll[event->direction]); + + return TRUE; + } diff --git a/src/pw3270/v3270/private.h b/src/pw3270/v3270/private.h index 1839f7c..0925123 100644 --- a/src/pw3270/v3270/private.h +++ b/src/pw3270/v3270/private.h @@ -254,5 +254,6 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event); gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event); gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y); +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer user_data); G_END_DECLS diff --git a/src/pw3270/v3270/widget.c b/src/pw3270/v3270/widget.c index e1c300f..7997340 100644 --- a/src/pw3270/v3270/widget.c +++ b/src/pw3270/v3270/widget.c @@ -294,6 +294,7 @@ static void v3270_class_init(v3270Class *klass) widget_class->button_release_event = v3270_button_release_event; widget_class->motion_notify_event = v3270_motion_notify_event; widget_class->popup_menu = v3270_popup_menu; + widget_class->scroll_event = v3270_scroll_event; /* Accessibility support */ widget_class->get_accessible = v3270_get_accessible; -- libgit2 0.21.2