Commit e42f96cccce7b35a9db9a577fcbdc8fca67095e3

Authored by Perry Werneck
1 parent 104cd184
Exists in master and in 1 other branch develop

Adding fallbacks for scroll actions.

src/include/terminal.h
@@ -221,7 +221,11 @@ G_BEGIN_DECLS @@ -221,7 +221,11 @@ G_BEGIN_DECLS
221 GSList * accelerators; ///< @brief Keyboard accelerators. 221 GSList * accelerators; ///< @brief Keyboard accelerators.
222 222
223 // Scroll actions. 223 // Scroll actions.
224 - GtkAction * scroll[4]; ///< @brief Scroll actions. 224 + struct
  225 + {
  226 + void (*activate)(GtkWidget *, gpointer); ///< @brief Callback for scroll activation.
  227 + gpointer arg; ///< @brief Argument for callback.
  228 + } scroll[4]; ///< @brief Scroll actions.
225 229
226 }; 230 };
227 231
src/include/v3270/actions.h
@@ -70,6 +70,8 @@ @@ -70,6 +70,8 @@
70 // 70 //
71 // Misc 71 // Misc
72 // 72 //
  73 + LIB3270_EXPORT void v3270_set_scroll_handler(GtkWidget *widget, GdkScrollDirection direction, GCallback callback, gpointer data);
  74 +
73 LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) G_GNUC_DEPRECATED; 75 LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) G_GNUC_DEPRECATED;
74 76
75 // 77 //
src/terminal/actions/scroll.c 0 → 100644
@@ -0,0 +1,152 @@ @@ -0,0 +1,152 @@
  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 mouse.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 + *
  28 + */
  29 +
  30 + #include <v3270.h>
  31 + #include <v3270/actions.h>
  32 + #include <terminal.h>
  33 + #include <internals.h>
  34 + #include <lib3270/log.h>
  35 + #include <lib3270/trace.h>
  36 + #include <gdk/gdkkeysyms-compat.h>
  37 +
  38 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  39 +
  40 +// Callback for compatibility with the old application.
  41 +static void activate_action(GtkWidget *terminal, GtkAction *action)
  42 +{
  43 + gtk_action_activate(action);
  44 +}
  45 +
  46 +LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action)
  47 +{
  48 + v3270_set_scroll_handler(widget, direction, G_CALLBACK(activate_action), action);
  49 +}
  50 +
  51 +gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event)
  52 +{
  53 + v3270 * terminal = GTK_V3270(widget);
  54 +
  55 + lib3270_write_event_trace(terminal->host,"scroll event direction=%d",(int) event->direction);
  56 +
  57 + if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(terminal->scroll))
  58 + {
  59 + lib3270_write_event_trace(terminal->host," dropped (not available)\n");
  60 + return FALSE;
  61 + }
  62 +
  63 + lib3270_write_event_trace(terminal->host,"\n");
  64 +
  65 + debug("%d %p", (int) event->direction, terminal->scroll[event->direction]);
  66 +
  67 + // Do I have scroll method??
  68 + if(terminal->scroll[event->direction].activate)
  69 + {
  70 + // Yes, fire it.
  71 + terminal->scroll[event->direction].activate(widget,terminal->scroll[event->direction].arg);
  72 + return TRUE;
  73 + }
  74 +
  75 + // Has selection?
  76 + if(lib3270_has_selection(terminal->host))
  77 + {
  78 + switch(event->direction)
  79 + {
  80 + case GDK_SCROLL_UP:
  81 + lib3270_move_selection(terminal->host,LIB3270_DIR_UP);
  82 + return TRUE;
  83 +
  84 + case GDK_SCROLL_DOWN:
  85 + lib3270_move_selection(terminal->host,LIB3270_DIR_DOWN);
  86 + return TRUE;
  87 +
  88 + case GDK_SCROLL_LEFT:
  89 + lib3270_move_selection(terminal->host,LIB3270_DIR_LEFT);
  90 + return TRUE;
  91 +
  92 + case GDK_SCROLL_RIGHT:
  93 + lib3270_move_selection(terminal->host,LIB3270_DIR_RIGHT);
  94 + return TRUE;
  95 + }
  96 +
  97 + }
  98 +
  99 + // Check for fallbacks
  100 + size_t ix;
  101 +
  102 + static const struct
  103 + {
  104 + GdkScrollDirection direction;
  105 + guint keyval;
  106 + GdkModifierType state;
  107 + } fallbacks[] = {
  108 +
  109 + { GDK_SCROLL_UP, GDK_Page_Up, 0 },
  110 + { GDK_SCROLL_DOWN, GDK_Page_Down, 0 },
  111 +
  112 + { GDK_SCROLL_UP, GDK_ISO_Left_Tab, GDK_SHIFT_MASK },
  113 + { GDK_SCROLL_DOWN, GDK_Tab, 0 },
  114 +
  115 + { GDK_SCROLL_UP, GDK_Up, 0 },
  116 + { GDK_SCROLL_DOWN, GDK_Down, 0 },
  117 +
  118 + };
  119 +
  120 + for(ix = 0; ix < G_N_ELEMENTS(fallbacks); ix++) {
  121 +
  122 + if(fallbacks[ix].direction == event->direction) {
  123 +
  124 + const V3270Accelerator * accel = v3270_get_accelerator(widget, fallbacks[ix].keyval, fallbacks[ix].state);
  125 + if(accel)
  126 + {
  127 + debug("Activating fallback mouse action \"%s\"\n",v3270_accelerator_get_name(accel));
  128 +// lib3270_write_event_trace(terminal->hSession,"Activating fallback mouse action \"%s\"\n",v3270_accelerator_get_name(accel));
  129 + v3270_accelerator_activate(accel,widget);
  130 + return TRUE;
  131 + }
  132 +
  133 + }
  134 +
  135 + }
  136 +
  137 + return FALSE;
  138 + }
  139 +
  140 + void v3270_set_scroll_handler(GtkWidget *widget, GdkScrollDirection direction, GCallback callback, gpointer data)
  141 + {
  142 + size_t ix = (size_t) direction;
  143 +
  144 + g_return_if_fail(GTK_IS_V3270(widget) && ix < 4);
  145 +
  146 + v3270 * terminal = GTK_V3270(widget);
  147 +
  148 + terminal->scroll[ix].activate = (void (*)(GtkWidget *, gpointer)) callback;
  149 + terminal->scroll[ix].arg = data;
  150 +
  151 + }
  152 +
src/terminal/scroll.c
@@ -1,68 +0,0 @@ @@ -1,68 +0,0 @@
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 mouse.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 - *  
28 - */  
29 -  
30 - #include <v3270.h>  
31 - #include <terminal.h>  
32 - #include <internals.h>  
33 - #include <lib3270/log.h>  
34 - #include <lib3270/trace.h>  
35 -  
36 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
37 -  
38 -LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action)  
39 -{  
40 - g_return_if_fail(GTK_IS_V3270(widget));  
41 - GTK_V3270(widget)->scroll[((int) direction) & 0x03] = action;  
42 -}  
43 -  
44 -gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event)  
45 -{  
46 - v3270 * terminal = GTK_V3270(widget);  
47 -  
48 - lib3270_write_event_trace(terminal->host,"scroll event direction=%d",(int) event->direction);  
49 -  
50 - if(lib3270_get_program_message(terminal->host) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(terminal->scroll))  
51 - {  
52 - lib3270_write_event_trace(terminal->host," dropped (not available)\n");  
53 - return FALSE;  
54 - }  
55 -  
56 - lib3270_write_event_trace(terminal->host,"\n");  
57 -  
58 - debug("%d %p", (int) event->direction, terminal->scroll[event->direction]);  
59 -  
60 - if(terminal->scroll[event->direction])  
61 - {  
62 - debug("%d %s", (int) event->direction, gtk_action_get_name(terminal->scroll[event->direction]));  
63 - gtk_action_activate(terminal->scroll[event->direction]);  
64 - return TRUE;  
65 - }  
66 -  
67 - return FALSE;  
68 - }  
@@ -226,6 +226,9 @@ @@ -226,6 +226,9 @@
226 <Option compilerVar="CC" /> 226 <Option compilerVar="CC" />
227 </Unit> 227 </Unit>
228 <Unit filename="src/terminal/actions/private.h" /> 228 <Unit filename="src/terminal/actions/private.h" />
  229 + <Unit filename="src/terminal/actions/scroll.c">
  230 + <Option compilerVar="CC" />
  231 + </Unit>
229 <Unit filename="src/terminal/actions/table.c"> 232 <Unit filename="src/terminal/actions/table.c">
230 <Option compilerVar="CC" /> 233 <Option compilerVar="CC" />
231 </Unit> 234 </Unit>
@@ -308,9 +311,6 @@ @@ -308,9 +311,6 @@
308 <Unit filename="src/terminal/properties/set.c"> 311 <Unit filename="src/terminal/properties/set.c">
309 <Option compilerVar="CC" /> 312 <Option compilerVar="CC" />
310 </Unit> 313 </Unit>
311 - <Unit filename="src/terminal/scroll.c">  
312 - <Option compilerVar="CC" />  
313 - </Unit>  
314 <Unit filename="src/terminal/security.c"> 314 <Unit filename="src/terminal/security.c">
315 <Option compilerVar="CC" /> 315 <Option compilerVar="CC" />
316 </Unit> 316 </Unit>