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