Commit 513e15ae758355fa2aadee32b03ed9f77978aa1a
1 parent
835ec4d3
Exists in
master
and in
5 other branches
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.
Showing
12 changed files
with
183 additions
and
43 deletions
Show diff stats
pw3270.cbp
| @@ -274,6 +274,9 @@ | @@ -274,6 +274,9 @@ | ||
| 274 | <Unit filename="src/pw3270/uiparser/script.c"> | 274 | <Unit filename="src/pw3270/uiparser/script.c"> |
| 275 | <Option compilerVar="CC" /> | 275 | <Option compilerVar="CC" /> |
| 276 | </Unit> | 276 | </Unit> |
| 277 | + <Unit filename="src/pw3270/uiparser/scroll.c"> | ||
| 278 | + <Option compilerVar="CC" /> | ||
| 279 | + </Unit> | ||
| 277 | <Unit filename="src/pw3270/uiparser/separator.c"> | 280 | <Unit filename="src/pw3270/uiparser/separator.c"> |
| 278 | <Option compilerVar="CC" /> | 281 | <Option compilerVar="CC" /> |
| 279 | </Unit> | 282 | </Unit> |
src/include/v3270.h
| @@ -180,7 +180,6 @@ | @@ -180,7 +180,6 @@ | ||
| 180 | LIB3270_EXPORT void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color); | 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 | LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color); | 181 | LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color); |
| 182 | LIB3270_EXPORT GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id); | 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 | // Misc | 184 | // Misc |
| 186 | LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget); | 185 | LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget); |
| @@ -191,6 +190,9 @@ | @@ -191,6 +190,9 @@ | ||
| 191 | 190 | ||
| 192 | LIB3270_EXPORT void v3270_set_host(GtkWidget *widget, const gchar *uri); | 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 | G_END_DECLS | 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,15 +468,15 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | ||
| 468 | "setfullscreen", | 468 | "setfullscreen", |
| 469 | "resetfullscreen" | 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 | enum _action_type | 481 | enum _action_type |
| 482 | { | 482 | { |
| @@ -492,20 +492,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | @@ -492,20 +492,8 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | ||
| 492 | 492 | ||
| 493 | } action_type = ACTION_TYPE_DEFAULT; | 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 | if(ui_get_bool_attribute("selecting",names,values,FALSE)) | 498 | if(ui_get_bool_attribute("selecting",names,values,FALSE)) |
| 511 | flags |= 0x80; | 499 | flags |= 0x80; |
| @@ -538,13 +526,13 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | @@ -538,13 +526,13 @@ GtkAction * ui_get_action(GtkWidget *widget, const gchar *name, GHashTable *hash | ||
| 538 | action_type = ACTION_TYPE_MOVE; | 526 | action_type = ACTION_TYPE_MOVE; |
| 539 | attr = ui_get_attribute("target",names,values); | 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 | *error = g_error_new(ERROR_DOMAIN,EINVAL,"%s",_("Move action needs target & direction attributes" )); | 531 | *error = g_error_new(ERROR_DOMAIN,EINVAL,"%s",_("Move action needs target & direction attributes" )); |
| 544 | return NULL; | 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 | else if(!g_ascii_strcasecmp(name,"paste")) | 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,3 +796,14 @@ void ui_connect_text_script(GtkWidget *widget, GtkAction *action, const gchar *s | ||
| 808 | g_signal_connect(action,"activate",G_CALLBACK(action_text_script),widget); | 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,6 +51,7 @@ | ||
| 51 | { "accelerator", UI_ELEMENT_ACCELERATOR, ui_create_accelerator, ui_end_accelerator }, | 51 | { "accelerator", UI_ELEMENT_ACCELERATOR, ui_create_accelerator, ui_end_accelerator }, |
| 52 | { "popup", UI_ELEMENT_POPUP, ui_create_popup, ui_end_popup }, | 52 | { "popup", UI_ELEMENT_POPUP, ui_create_popup, ui_end_popup }, |
| 53 | { "script", UI_ELEMENT_SCRIPT, ui_create_script, ui_end_script }, | 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 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 57 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| @@ -168,15 +169,6 @@ | @@ -168,15 +169,6 @@ | ||
| 168 | GtkWidget * widget = NULL; | 169 | GtkWidget * widget = NULL; |
| 169 | int f; | 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 | for(f=0;f<G_N_ELEMENTS(element_builder);f++) | 172 | for(f=0;f<G_N_ELEMENTS(element_builder);f++) |
| 181 | { | 173 | { |
| 182 | if(!g_ascii_strcasecmp(element_name,element_builder[f].name)) | 174 | if(!g_ascii_strcasecmp(element_name,element_builder[f].name)) |
| @@ -240,7 +232,6 @@ | @@ -240,7 +232,6 @@ | ||
| 240 | } | 232 | } |
| 241 | else | 233 | else |
| 242 | { | 234 | { |
| 243 | -// info->disabled++; | ||
| 244 | info->action = NULL; | 235 | info->action = NULL; |
| 245 | } | 236 | } |
| 246 | } | 237 | } |
src/pw3270/uiparser/parser.c
| @@ -36,6 +36,9 @@ | @@ -36,6 +36,9 @@ | ||
| 36 | #include <gtkmacintegration/gtk-mac-menu.h> | 36 | #include <gtkmacintegration/gtk-mac-menu.h> |
| 37 | #endif // HAVE_GTKMAC | 37 | #endif // HAVE_GTKMAC |
| 38 | 38 | ||
| 39 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
| 40 | + | ||
| 41 | +static const gchar * dirname[] = { "up", "down", "left", "right" }; | ||
| 39 | 42 | ||
| 40 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 43 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 41 | 44 | ||
| @@ -208,13 +211,15 @@ void parser_build(struct parser *p, GtkWidget *widget) | @@ -208,13 +211,15 @@ void parser_build(struct parser *p, GtkWidget *widget) | ||
| 208 | // Pack top toolbars | 211 | // Pack top toolbars |
| 209 | g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); | 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 | if(widget) | 215 | if(widget) |
| 213 | { | 216 | { |
| 217 | + ui_set_scroll_actions(widget,p->scroll_action); | ||
| 214 | gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); | 218 | gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); |
| 215 | gtk_widget_show(widget); | 219 | gtk_widget_show(widget); |
| 216 | } | 220 | } |
| 217 | 221 | ||
| 222 | + | ||
| 218 | // gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); | 223 | // gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); |
| 219 | 224 | ||
| 220 | gtk_container_add(GTK_CONTAINER(p->toplevel),vbox); | 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,3 +340,28 @@ int ui_parse_xml_folder(GtkWindow *toplevel, const gchar *path, const gchar ** g | ||
| 335 | 340 | ||
| 336 | return 0; | 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,6 +33,19 @@ | ||
| 33 | 33 | ||
| 34 | #define UI_PARSER_H_INCLUDED 1 | 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 | * Callback list for specil widget. | 50 | * Callback list for specil widget. |
| 38 | * | 51 | * |
| @@ -51,11 +64,14 @@ | @@ -51,11 +64,14 @@ | ||
| 51 | void (*setup)(GtkWidget *widget, GtkWidget *obj); | 64 | void (*setup)(GtkWidget *widget, GtkWidget *obj); |
| 52 | } UI_WIDGET_SETUP; | 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 | #endif // UI_PARSER_H_INCLUDED | 77 | #endif // UI_PARSER_H_INCLUDED |
src/pw3270/uiparser/private.h
| @@ -51,12 +51,14 @@ | @@ -51,12 +51,14 @@ | ||
| 51 | #define UI_ELEMENT_ACCELERATOR UI_ELEMENT_COUNT+2 | 51 | #define UI_ELEMENT_ACCELERATOR UI_ELEMENT_COUNT+2 |
| 52 | #define UI_ELEMENT_SCRIPT UI_ELEMENT_COUNT+3 | 52 | #define UI_ELEMENT_SCRIPT UI_ELEMENT_COUNT+3 |
| 53 | #define UI_ELEMENT_MENUITEM UI_ELEMENT_COUNT+4 | 53 | #define UI_ELEMENT_MENUITEM UI_ELEMENT_COUNT+4 |
| 54 | + #define UI_ELEMENT_SCROLL UI_ELEMENT_COUNT+5 | ||
| 54 | 55 | ||
| 55 | struct parser | 56 | struct parser |
| 56 | { | 57 | { |
| 57 | GtkWidget * toplevel; | 58 | GtkWidget * toplevel; |
| 58 | GObject * element; | 59 | GObject * element; |
| 59 | GtkAction * action; | 60 | GtkAction * action; |
| 61 | + GtkAction * scroll_action[UI_ATTR_DIRECTION_COUNT]; | ||
| 60 | GtkWidget * topmenu; | 62 | GtkWidget * topmenu; |
| 61 | GtkAction * script_action; | 63 | GtkAction * script_action; |
| 62 | GtkWidget * center_widget; | 64 | GtkWidget * center_widget; |
| @@ -84,6 +86,7 @@ | @@ -84,6 +86,7 @@ | ||
| 84 | GObject * ui_create_accelerator(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error); | 86 | GObject * ui_create_accelerator(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error); |
| 85 | GObject * ui_create_popup(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error); | 87 | GObject * ui_create_popup(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error); |
| 86 | GObject * ui_create_script(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error); | 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 | void ui_end_menubar(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); | 91 | void ui_end_menubar(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); |
| 89 | void ui_end_menu(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); | 92 | void ui_end_menu(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); |
| @@ -94,5 +97,6 @@ | @@ -94,5 +97,6 @@ | ||
| 94 | void ui_end_accelerator(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); | 97 | void ui_end_accelerator(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); |
| 95 | void ui_end_popup(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); | 98 | void ui_end_popup(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); |
| 96 | void ui_end_script(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error); | 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 | #include "parser.h" | 102 | #include "parser.h" |
| @@ -0,0 +1,66 @@ | @@ -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 | UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \ | 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,6 +36,10 @@ | ||
| 36 | #include <lib3270/actions.h> | 36 | #include <lib3270/actions.h> |
| 37 | #include <lib3270/log.h> | 37 | #include <lib3270/log.h> |
| 38 | 38 | ||
| 39 | +/*--[ Globals ]--------------------------------------------------------------------------------------*/ | ||
| 40 | + | ||
| 41 | + static GtkAction *action_scroll[] = { NULL, NULL, NULL, NULL }; | ||
| 42 | + | ||
| 39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 43 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 40 | 44 | ||
| 41 | gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y) | 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,3 +266,24 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) | ||
| 262 | 266 | ||
| 263 | return FALSE; | 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,5 +254,6 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event); | ||
| 254 | gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); | 254 | gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event); |
| 255 | void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event); | 255 | void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event); |
| 256 | gint v3270_get_offset_at_point(v3270 *widget, gint x, gint y); | 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 | G_END_DECLS | 259 | G_END_DECLS |
src/pw3270/v3270/widget.c
| @@ -294,6 +294,7 @@ static void v3270_class_init(v3270Class *klass) | @@ -294,6 +294,7 @@ static void v3270_class_init(v3270Class *klass) | ||
| 294 | widget_class->button_release_event = v3270_button_release_event; | 294 | widget_class->button_release_event = v3270_button_release_event; |
| 295 | widget_class->motion_notify_event = v3270_motion_notify_event; | 295 | widget_class->motion_notify_event = v3270_motion_notify_event; |
| 296 | widget_class->popup_menu = v3270_popup_menu; | 296 | widget_class->popup_menu = v3270_popup_menu; |
| 297 | + widget_class->scroll_event = v3270_scroll_event; | ||
| 297 | 298 | ||
| 298 | /* Accessibility support */ | 299 | /* Accessibility support */ |
| 299 | widget_class->get_accessible = v3270_get_accessible; | 300 | widget_class->get_accessible = v3270_get_accessible; |