Commit 513e15ae758355fa2aadee32b03ed9f77978aa1a

Authored by perry.werneck@gmail.com
1 parent 835ec4d3

Rômulo Silva Neiva

29 de agosto de 2012 07:54

 * não é tão necessário, mas a versão 4.1 tem, a rolagem de tela através da roda do mouse.
pw3270.cbp
... ... @@ -274,6 +274,9 @@
274 274 <Unit filename="src/pw3270/uiparser/script.c">
275 275 <Option compilerVar="CC" />
276 276 </Unit>
  277 + <Unit filename="src/pw3270/uiparser/scroll.c">
  278 + <Option compilerVar="CC" />
  279 + </Unit>
277 280 <Unit filename="src/pw3270/uiparser/separator.c">
278 281 <Option compilerVar="CC" />
279 282 </Unit>
... ...
src/include/v3270.h
... ... @@ -180,7 +180,6 @@
180 180 LIB3270_EXPORT void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color);
181 181 LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color);
182 182 LIB3270_EXPORT GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id);
183   - LIB3270_EXPORT gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action);
184 183  
185 184 // Misc
186 185 LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget);
... ... @@ -191,6 +190,9 @@
191 190  
192 191 LIB3270_EXPORT void v3270_set_host(GtkWidget *widget, const gchar *uri);
193 192  
  193 + // Keyboard & Mouse special actions
  194 + LIB3270_EXPORT gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action);
  195 + LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action);
194 196  
195 197 G_END_DECLS
196 198  
... ...
src/pw3270/actions.c
... ... @@ -468,15 +468,15 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash
468 468 "setfullscreen",
469 469 "resetfullscreen"
470 470 };
471   - GtkAction * action = NULL;
472   - GtkAction **toggle_action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions");
473   - const gchar * direction = ui_get_attribute("direction",names,values);
474   - unsigned short flags = 0;
475   - const GCallback * callback = NULL;
476   - const gchar * attr = NULL;
477   - int id = 0;
478   - gchar * nm = NULL;
479   - int f;
  471 + GtkAction * action = NULL;
  472 + GtkAction **toggle_action = (GtkAction **) g_object_get_data(G_OBJECT(widget),"toggle_actions");
  473 + UI_ATTR_DIRECTION dir = ui_get_dir_attribute(names,values);
  474 + unsigned short flags = 0;
  475 + const GCallback * callback = NULL;
  476 + const gchar * attr = NULL;
  477 + int id = 0;
  478 + gchar * nm = NULL;
  479 + int f;
480 480  
481 481 enum _action_type
482 482 {
... ... @@ -492,20 +492,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash
492 492  
493 493 } action_type = ACTION_TYPE_DEFAULT;
494 494  
495   - if(direction)
496   - {
497   - static const gchar *dirname[] = { "up", "down", "left", "right" };
498   - int f;
499   -
500   - for(f=0;f<G_N_ELEMENTS(dirname);f++)
501   - {
502   - if(!g_ascii_strcasecmp(direction,dirname[f]))
503   - {
504   - flags |= f;
505   - break;
506   - }
507   - }
508   - }
  495 + if(dir != UI_ATTR_DIRECTION_NONE)
  496 + flags |= ((unsigned char) dir) & 0x03;
509 497  
510 498 if(ui_get_bool_attribute("selecting",names,values,FALSE))
511 499 flags |= 0x80;
... ... @@ -538,13 +526,13 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash
538 526 action_type = ACTION_TYPE_MOVE;
539 527 attr = ui_get_attribute("target",names,values);
540 528  
541   - if(!(attr && direction))
  529 + if(!attr || dir == UI_ATTR_DIRECTION_NONE)
542 530 {
543 531 *error = g_error_new(ERROR_DOMAIN,EINVAL,"%s",_("Move action needs target & direction attributes" ));
544 532 return NULL;
545 533 }
546 534  
547   - nm = g_strconcat((flags & 0x80) ? "select" : "move",attr,direction, NULL);
  535 + nm = g_strconcat((flags & 0x80) ? "select" : "move",attr,ui_get_dir_name(dir), NULL);
548 536  
549 537 }
550 538 else if(!g_ascii_strcasecmp(name,"paste"))
... ... @@ -808,3 +796,14 @@ void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *s
808 796 g_signal_connect(action,"activate",G_CALLBACK(action_text_script),widget);
809 797 }
810 798  
  799 +void ui_set_scroll_actions(GtkWidget *widget, GtkAction *action[UI_ATTR_DIRECTION_COUNT])
  800 +{
  801 + int f;
  802 +
  803 + for(f=0;f<4;f++)
  804 + {
  805 + if(action[f])
  806 + v3270_set_scroll_action(widget, (GdkScrollDirection) f, action[f]);
  807 + }
  808 +
  809 +}
... ...
src/pw3270/uiparser/parsefile.c
... ... @@ -51,6 +51,7 @@
51 51 { "accelerator", UI_ELEMENT_ACCELERATOR, ui_create_accelerator, ui_end_accelerator },
52 52 { "popup", UI_ELEMENT_POPUP, ui_create_popup, ui_end_popup },
53 53 { "script", UI_ELEMENT_SCRIPT, ui_create_script, ui_end_script },
  54 + { "scroll", UI_ELEMENT_SCROLL, ui_create_scroll, ui_end_scroll },
54 55 };
55 56  
56 57 /*--[ Implement ]------------------------------------------------------------------------------------*/
... ... @@ -168,15 +169,6 @@
168 169 GtkWidget * widget = NULL;
169 170 int f;
170 171  
171   -/*
172   - if(info->disabled)
173   - {
174   - info->disabled++;
175   - trace("%s: <%s> disabled=%d",__FUNCTION__,element_name,info->disabled);
176   - return;
177   - }
178   -*/
179   -
180 172 for(f=0;f<G_N_ELEMENTS(element_builder);f++)
181 173 {
182 174 if(!g_ascii_strcasecmp(element_name,element_builder[f].name))
... ... @@ -240,7 +232,6 @@
240 232 }
241 233 else
242 234 {
243   -// info->disabled++;
244 235 info->action = NULL;
245 236 }
246 237 }
... ...
src/pw3270/uiparser/parser.c
... ... @@ -36,6 +36,9 @@
36 36 #include <gtkmacintegration/gtk-mac-menu.h>
37 37 #endif // HAVE_GTKMAC
38 38  
  39 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  40 +
  41 +static const gchar * dirname[] = { "up", "down", "left", "right" };
39 42  
40 43 /*--[ Implement ]------------------------------------------------------------------------------------*/
41 44  
... ... @@ -208,13 +211,15 @@ void parser_build(struct parser *p, GtkWidget *widget)
208 211 // Pack top toolbars
209 212 g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p);
210 213  
211   - // Pack center widget
  214 + // Pack & configure center widget
212 215 if(widget)
213 216 {
  217 + ui_set_scroll_actions(widget,p->scroll_action);
214 218 gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0);
215 219 gtk_widget_show(widget);
216 220 }
217 221  
  222 +
218 223 // gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
219 224  
220 225 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
335 340  
336 341 return 0;
337 342 }
  343 +
  344 +UI_ATTR_DIRECTION ui_get_dir_attribute(const gchar **names, const gchar **values)
  345 +{
  346 + const gchar * dir = ui_get_attribute("direction",names,values);
  347 + int f;
  348 +
  349 + if(dir)
  350 + {
  351 + for(f=0;f<G_N_ELEMENTS(dirname);f++)
  352 + {
  353 + if(!g_ascii_strcasecmp(dir,dirname[f]))
  354 + return f;
  355 + }
  356 + }
  357 +
  358 + return UI_ATTR_DIRECTION_NONE;
  359 +}
  360 +
  361 +const gchar * ui_get_dir_name(UI_ATTR_DIRECTION dir)
  362 +{
  363 + if(dir == UI_ATTR_DIRECTION_NONE)
  364 + return "";
  365 + return dirname[dir];
  366 +}
  367 +
... ...
src/pw3270/uiparser/parser.h
... ... @@ -33,6 +33,19 @@
33 33  
34 34 #define UI_PARSER_H_INCLUDED 1
35 35  
  36 + typedef enum ui_attr_direction
  37 + {
  38 + UI_ATTR_UP,
  39 + UI_ATTR_DOWN,
  40 + UI_ATTR_LEFT,
  41 + UI_ATTR_RIGHT,
  42 +
  43 + UI_ATTR_DIRECTION_COUNT
  44 +
  45 + } UI_ATTR_DIRECTION;
  46 +
  47 + #define UI_ATTR_DIRECTION_NONE ((UI_ATTR_DIRECTION) -1)
  48 +
36 49 /**
37 50 * Callback list for specil widget.
38 51 *
... ... @@ -51,11 +64,14 @@
51 64 void (*setup)(GtkWidget *widget, GtkWidget *obj);
52 65 } UI_WIDGET_SETUP;
53 66  
54   - int ui_parse_xml_folder(GtkWindow *toplevel, const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *itn);
55   - const gchar * ui_get_attribute(const gchar *key, const gchar **name, const gchar **value);
56   - gboolean ui_get_bool_attribute(const gchar *key, const gchar **name, const gchar **value, gboolean def);
57   - GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash, const gchar **names, const gchar **values, GError **error);
  67 + int ui_parse_xml_folder(GtkWindow *toplevel, const gchar *path, const gchar ** groupname, const gchar **popupname, GtkWidget *widget, const UI_WIDGET_SETUP *itn);
  68 + const gchar * ui_get_attribute(const gchar *key, const gchar **name, const gchar **value);
  69 + gboolean ui_get_bool_attribute(const gchar *key, const gchar **name, const gchar **value, gboolean def);
  70 + UI_ATTR_DIRECTION ui_get_dir_attribute(const gchar **name, const gchar **value);
  71 + GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash, const gchar **names, const gchar **values, GError **error);
  72 + const gchar * ui_get_dir_name(UI_ATTR_DIRECTION dir);
58 73  
59   - void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *script_text, GError **error);
  74 + void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *script_text, GError **error);
  75 + void ui_set_scroll_actions(GtkWidget *widget, GtkAction *action[UI_ATTR_DIRECTION_COUNT]);
60 76  
61 77 #endif // UI_PARSER_H_INCLUDED
... ...
src/pw3270/uiparser/private.h
... ... @@ -51,12 +51,14 @@
51 51 #define UI_ELEMENT_ACCELERATOR UI_ELEMENT_COUNT+2
52 52 #define UI_ELEMENT_SCRIPT UI_ELEMENT_COUNT+3
53 53 #define UI_ELEMENT_MENUITEM UI_ELEMENT_COUNT+4
  54 + #define UI_ELEMENT_SCROLL UI_ELEMENT_COUNT+5
54 55  
55 56 struct parser
56 57 {
57 58 GtkWidget * toplevel;
58 59 GObject * element;
59 60 GtkAction * action;
  61 + GtkAction * scroll_action[UI_ATTR_DIRECTION_COUNT];
60 62 GtkWidget * topmenu;
61 63 GtkAction * script_action;
62 64 GtkWidget * center_widget;
... ... @@ -84,6 +86,7 @@
84 86 GObject * ui_create_accelerator(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error);
85 87 GObject * ui_create_popup(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error);
86 88 GObject * ui_create_script(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error);
  89 + GObject * ui_create_scroll(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error);
87 90  
88 91 void ui_end_menubar(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
89 92 void ui_end_menu(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
... ... @@ -94,5 +97,6 @@
94 97 void ui_end_accelerator(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
95 98 void ui_end_popup(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
96 99 void ui_end_script(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
  100 + void ui_end_scroll(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error);
97 101  
98 102 #include "parser.h"
... ...
src/pw3270/uiparser/scroll.c 0 → 100644
... ... @@ -0,0 +1,66 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como scroll.c e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + * licinio@bb.com.br (Licínio Luis Branco)
  28 + * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
  29 + *
  30 + */
  31 +
  32 + #include <gtk/gtk.h>
  33 + #include "private.h"
  34 +
  35 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  36 +
  37 + GObject * ui_create_scroll(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error)
  38 + {
  39 + UI_ATTR_DIRECTION dir = ui_get_dir_attribute(names,values);
  40 +
  41 + if(info->element)
  42 + {
  43 + *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "<%s> should be on toplevel"), "scroll");
  44 + return NULL;
  45 + }
  46 +
  47 + if(!action)
  48 + {
  49 + *error = g_error_new(ERROR_DOMAIN,ENOENT, _( "<%s> requires %s"),"scroll",_( "an action attribute" ) );
  50 + return NULL;
  51 + }
  52 +
  53 + if(dir == UI_ATTR_DIRECTION_NONE)
  54 + {
  55 + *error = g_error_new(ERROR_DOMAIN,ENOENT, _( "<%s> requires %s"),"scroll",_( "a direction attribute" ) );
  56 + return NULL;
  57 + }
  58 +
  59 + info->scroll_action[dir] = action;
  60 +
  61 + return NULL;
  62 + }
  63 +
  64 + void ui_end_scroll(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error)
  65 + {
  66 + }
... ...
src/pw3270/uiparser/sources.mak
1 1 UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \
2   - parsefile.c separator.c toolbar.c toolitem.c popup.c script.c
  2 + parsefile.c separator.c toolbar.c toolitem.c popup.c script.c \
  3 + scroll.c
  4 +
3 5  
... ...
src/pw3270/v3270/mouse.c
... ... @@ -36,6 +36,10 @@
36 36 #include <lib3270/actions.h>
37 37 #include <lib3270/log.h>
38 38  
  39 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  40 +
  41 + static GtkAction *action_scroll[] = { NULL, NULL, NULL, NULL };
  42 +
39 43 /*--[ Implement ]------------------------------------------------------------------------------------*/
40 44  
41 45 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)
262 266  
263 267 return FALSE;
264 268 }
  269 +
  270 +void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action)
  271 +{
  272 + g_return_if_fail(GTK_IS_V3270(widget));
  273 + action_scroll[((int) direction) & 0x03] = action;
  274 +}
  275 +
  276 +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
  277 +{
  278 + v3270 * terminal = GTK_V3270(widget);
  279 +
  280 + if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(action_scroll))
  281 + return FALSE;
  282 +
  283 + trace("Scroll: %d Action: %p",event->direction,action_scroll[event->direction]);
  284 +
  285 + if(action_scroll[event->direction])
  286 + gtk_action_activate(action_scroll[event->direction]);
  287 +
  288 + return TRUE;
  289 + }
... ...
src/pw3270/v3270/private.h
... ... @@ -254,5 +254,6 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event);
254 254 gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event);
255 255 void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event);
256 256 gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y);
  257 +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer user_data);
257 258  
258 259 G_END_DECLS
... ...
src/pw3270/v3270/widget.c
... ... @@ -294,6 +294,7 @@ static void v3270_class_init(v3270Class *klass)
294 294 widget_class->button_release_event = v3270_button_release_event;
295 295 widget_class->motion_notify_event = v3270_motion_notify_event;
296 296 widget_class->popup_menu = v3270_popup_menu;
  297 + widget_class->scroll_event = v3270_scroll_event;
297 298  
298 299 /* Accessibility support */
299 300 widget_class->get_accessible = v3270_get_accessible;
... ...