Commit 63b05b21fe1f0371f29218e351215fa4d3783db9

Authored by Perry Werneck
1 parent 8df52aa9
Exists in master and in 1 other branch develop

Refactoring keyboard accelerators manager.

src/include/internals.h
@@ -144,6 +144,22 @@ @@ -144,6 +144,22 @@
144 144
145 /*--[ Internal Widgets & Tools ]---------------------------------------------------------------------*/ 145 /*--[ Internal Widgets & Tools ]---------------------------------------------------------------------*/
146 146
  147 + enum
  148 + {
  149 + V3270_ACCELERATOR_TYPE_INTERNAL, ///< @brief Accelerator is internal.
  150 + V3270_ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action.
  151 + V3270_ACCELERATOR_TYPE_GTK_ACTION, ///< @brief Accelerator is a GTK Action (Deprececated).
  152 + };
  153 +
  154 + struct _V3270Accelerator
  155 + {
  156 + unsigned short type;
  157 + guint key;
  158 + GdkModifierType mods;
  159 + gconstpointer arg;
  160 + GCallback activate;
  161 + };
  162 +
147 typedef enum v3270_toggleable_dialog 163 typedef enum v3270_toggleable_dialog
148 { 164 {
149 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED, 165 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED,
src/include/terminal.h
@@ -220,6 +220,9 @@ G_BEGIN_DECLS @@ -220,6 +220,9 @@ G_BEGIN_DECLS
220 // Keyboard accelerators. 220 // Keyboard accelerators.
221 GSList * accelerators; ///< @brief Keyboard accelerators. 221 GSList * accelerators; ///< @brief Keyboard accelerators.
222 222
  223 + // Scroll actions.
  224 + GtkAction * scroll[4]; ///< @brief Scroll actions.
  225 +
223 }; 226 };
224 227
225 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget); 228 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget);
src/include/v3270/actions.h
@@ -41,6 +41,9 @@ @@ -41,6 +41,9 @@
41 LIB3270_EXPORT void v3270_tab(GtkWidget *widget); 41 LIB3270_EXPORT void v3270_tab(GtkWidget *widget);
42 LIB3270_EXPORT void v3270_backtab(GtkWidget *widget); 42 LIB3270_EXPORT void v3270_backtab(GtkWidget *widget);
43 43
  44 + /// @brief Reset accelerator map to defaults.
  45 + LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget);
  46 +
44 LIB3270_EXPORT void v3270_accelerator_activate(V3270Accelerator * accell, GtkWidget *terminal); 47 LIB3270_EXPORT void v3270_accelerator_activate(V3270Accelerator * accell, GtkWidget *terminal);
45 LIB3270_EXPORT gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods); 48 LIB3270_EXPORT gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods);
46 49
src/terminal/keyboard/accelerator.c 0 → 100644
@@ -0,0 +1,80 @@ @@ -0,0 +1,80 @@
  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 properties.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 "private.h"
  31 + #include <errno.h>
  32 + #include <internals.h>
  33 + #include <terminal.h>
  34 + #include <lib3270/actions.h>
  35 +
  36 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  37 +
  38 + static gint compare_func(const V3270Accelerator *a, const V3270Accelerator *b)
  39 + {
  40 + if(a->activate != b->activate)
  41 + return a->activate - b->activate;
  42 + return a->arg - b->arg;
  43 + }
  44 +
  45 + void v3270_accelerator_map_reset(GtkWidget *widget)
  46 + {
  47 + v3270 * terminal = GTK_V3270(widget);
  48 +
  49 + if(terminal)
  50 + {
  51 + if(terminal->accelerators)
  52 + {
  53 + g_slist_free_full(terminal->accelerators,g_free);
  54 + terminal->accelerators = NULL;
  55 + }
  56 + v3270_init_accelerators(terminal);
  57 + }
  58 +
  59 + }
  60 +
  61 + void v3270_accelerator_map_sort(v3270 *widget)
  62 + {
  63 + widget->accelerators = g_slist_sort(widget->accelerators, (GCompareFunc) compare_func);
  64 + }
  65 +
  66 + gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods)
  67 + {
  68 + return accell->key == keyval && accell->mods == mods;
  69 + }
  70 +
  71 + void v3270_accelerator_activate(V3270Accelerator * accell, GtkWidget *terminal)
  72 + {
  73 + int rc = ((int (*)(GtkWidget *, const void *)) accell->activate)(terminal,accell->arg);
  74 +
  75 + if(rc)
  76 + gdk_display_beep(gdk_display_get_default());
  77 +
  78 + }
  79 +
  80 +
src/terminal/keyboard/init.c
@@ -32,6 +32,19 @@ @@ -32,6 +32,19 @@
32 #include <internals.h> 32 #include <internals.h>
33 #include <terminal.h> 33 #include <terminal.h>
34 #include <lib3270/actions.h> 34 #include <lib3270/actions.h>
  35 + #include <gdk/gdkkeysyms-compat.h>
  36 +
  37 + #ifndef GDK_NUMLOCK_MASK
  38 + #define GDK_NUMLOCK_MASK GDK_MOD2_MASK
  39 + #endif
  40 +
  41 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  42 +
  43 +/*
  44 + static const struct InternalAction InternalActions[] =
  45 + {
  46 + };
  47 +*/
35 48
36 /*--[ Implement ]------------------------------------------------------------------------------------*/ 49 /*--[ Implement ]------------------------------------------------------------------------------------*/
37 50
@@ -56,54 +69,66 @@ @@ -56,54 +69,66 @@
56 size_t ix; 69 size_t ix;
57 70
58 // Create accelerators for lib3270 actions. 71 // Create accelerators for lib3270 actions.
59 - const LIB3270_ACTION * actions = lib3270_get_actions();  
60 -  
61 - for(ix = 0; actions[ix].name; ix++)  
62 { 72 {
63 - if(actions[ix].keys) 73 + const LIB3270_ACTION * actions = lib3270_get_actions();
  74 +
  75 + for(ix = 0; actions[ix].name; ix++)
64 { 76 {
65 - size_t key; 77 + if(actions[ix].keys)
  78 + {
  79 + size_t key;
66 80
67 - gchar ** keys = g_strsplit(actions[ix].keys,",",-1); 81 + gchar ** keys = g_strsplit(actions[ix].keys,",",-1);
68 82
69 - for(key = 0; keys[key]; key++)  
70 - { 83 + for(key = 0; keys[key]; key++)
  84 + {
71 85
72 - V3270Accelerator * accelerator = g_new0(V3270Accelerator,1); 86 + V3270Accelerator * accelerator = g_new0(V3270Accelerator,1);
73 87
74 - accelerator->type = ACCELERATOR_TYPE_LIB3270_ACTION;  
75 - accelerator->arg = (gconstpointer) &actions[ix];  
76 - accelerator->activate = G_CALLBACK(fire_lib3270_action); 88 + accelerator->type = V3270_ACCELERATOR_TYPE_LIB3270_ACTION;
  89 + accelerator->arg = (gconstpointer) &actions[ix];
  90 + accelerator->activate = G_CALLBACK(fire_lib3270_action);
77 91
78 - debug("%s=%s",actions[ix].name,keys[key]); 92 + debug("%s=%s",actions[ix].name,keys[key]);
79 93
80 - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); 94 + gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods);
81 95
82 - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); 96 + widget->accelerators = g_slist_prepend(widget->accelerators,accelerator);
83 97
84 - } 98 + }
  99 +
  100 + g_strfreev(keys);
85 101
86 - g_strfreev(keys); 102 + }
87 103
88 } 104 }
89 105
90 } 106 }
91 107
  108 + /*
  109 + // Create accelerators for internal actions.
  110 + {
  111 + size_t ix;
92 112
93 - } 113 + for(ix = 0 ; ix < G_N_ELEMENTS(InternalActions); ix++)
  114 + {
  115 + V3270Accelerator * accelerator = g_new0(V3270Accelerator,1);
94 116
95 - gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods)  
96 - {  
97 - return accell->key == keyval && accell->mods == mods;  
98 - } 117 + accelerator->type = V3270_ACCELERATOR_TYPE_INTERNAL;
  118 + accelerator->arg = (gconstpointer) &InternalActions[ix];
  119 + accelerator->activate = InternalActions[ix].activate;
  120 + accelerator->key = InternalActions[ix].key;
  121 + accelerator->mods = InternalActions[ix].mods;
99 122
100 - void v3270_accelerator_activate(V3270Accelerator * accell, GtkWidget *terminal)  
101 - {  
102 - int rc = ((int (*)(GtkWidget *, const void *)) accell->activate)(terminal,accell->arg); 123 + widget->accelerators = g_slist_prepend(widget->accelerators,accelerator);
103 124
104 - if(rc)  
105 - gdk_display_beep(gdk_display_get_default()); 125 + }
  126 + }
  127 + */
  128 +
  129 + v3270_accelerator_map_sort(widget);
106 130
107 } 131 }
108 132
109 133
  134 +
src/terminal/keyboard/private.h
@@ -30,17 +30,14 @@ @@ -30,17 +30,14 @@
30 #include <config.h> 30 #include <config.h>
31 #include <v3270.h> 31 #include <v3270.h>
32 #include <v3270/actions.h> 32 #include <v3270/actions.h>
  33 + #include <internals.h>
33 34
34 - enum 35 + struct InternalAction
35 { 36 {
36 - ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action  
37 - };  
38 -  
39 - struct _V3270Accelerator  
40 - {  
41 - unsigned short type;  
42 guint key; 37 guint key;
43 GdkModifierType mods; 38 GdkModifierType mods;
44 - gconstpointer arg;  
45 GCallback activate; 39 GCallback activate;
46 }; 40 };
  41 +
  42 + G_GNUC_INTERNAL void v3270_accelerator_map_sort(v3270 *widget);
  43 +
src/terminal/mouse.c
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 42
43 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 43 /*--[ Globals ]--------------------------------------------------------------------------------------*/
44 44
45 - static GtkAction *action_scroll[] = { NULL, NULL, NULL, NULL }; 45 +// static GtkAction *action_scroll[] = { NULL, NULL, NULL, NULL };
46 46
47 /*--[ Implement ]------------------------------------------------------------------------------------*/ 47 /*--[ Implement ]------------------------------------------------------------------------------------*/
48 48
@@ -314,28 +314,3 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) @@ -314,28 +314,3 @@ gboolean v3270_motion_notify_event(GtkWidget *widget, GdkEventMotion *event)
314 return FALSE; 314 return FALSE;
315 } 315 }
316 316
317 -LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action)  
318 -{  
319 - g_return_if_fail(GTK_IS_V3270(widget));  
320 - action_scroll[((int) direction) & 0x03] = action;  
321 -}  
322 -  
323 -gboolean v3270_scroll_event(GtkWidget *widget, GdkEventScroll *event)  
324 -{  
325 - H3270 * hSession = v3270_get_session(widget);  
326 -  
327 - lib3270_trace_event(hSession,"scroll event direction=%d",(int) event->direction);  
328 -  
329 - if(lib3270_get_program_message(hSession) != LIB3270_MESSAGE_NONE || event->direction < 0 || event->direction > G_N_ELEMENTS(action_scroll))  
330 - {  
331 - lib3270_trace_event(hSession," dropped (not available)\n");  
332 - return FALSE;  
333 - }  
334 -  
335 - lib3270_trace_event(hSession,"\n");  
336 -  
337 - if(action_scroll[event->direction])  
338 - gtk_action_activate(action_scroll[event->direction]);  
339 -  
340 - return TRUE;  
341 - }  
src/terminal/scroll.c 0 → 100644
@@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
  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_trace_event(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_trace_event(terminal->host," dropped (not available)\n");
  53 + return FALSE;
  54 + }
  55 +
  56 + lib3270_trace_event(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 + }
@@ -268,6 +268,9 @@ @@ -268,6 +268,9 @@
268 <Unit filename="src/terminal/keyboard.c"> 268 <Unit filename="src/terminal/keyboard.c">
269 <Option compilerVar="CC" /> 269 <Option compilerVar="CC" />
270 </Unit> 270 </Unit>
  271 + <Unit filename="src/terminal/keyboard/accelerator.c">
  272 + <Option compilerVar="CC" />
  273 + </Unit>
271 <Unit filename="src/terminal/keyboard/init.c"> 274 <Unit filename="src/terminal/keyboard/init.c">
272 <Option compilerVar="CC" /> 275 <Option compilerVar="CC" />
273 </Unit> 276 </Unit>
@@ -292,6 +295,9 @@ @@ -292,6 +295,9 @@
292 <Unit filename="src/terminal/properties/set.c"> 295 <Unit filename="src/terminal/properties/set.c">
293 <Option compilerVar="CC" /> 296 <Option compilerVar="CC" />
294 </Unit> 297 </Unit>
  298 + <Unit filename="src/terminal/scroll.c">
  299 + <Option compilerVar="CC" />
  300 + </Unit>
295 <Unit filename="src/terminal/security.c"> 301 <Unit filename="src/terminal/security.c">
296 <Option compilerVar="CC" /> 302 <Option compilerVar="CC" />
297 </Unit> 303 </Unit>