Commit caded473175d0c456d53252b1881db204aa5ac3b

Authored by Perry Werneck
1 parent 0f914b61
Exists in master and in 1 other branch develop

Still trying to fix the accelerator engine.

src/include/internals.h
... ... @@ -380,8 +380,8 @@ G_GNUC_INTERNAL void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned
380 380 G_GNUC_INTERNAL void v3270_update_toggle(GtkWidget *widget, LIB3270_TOGGLE_ID id, unsigned char value, const char *name);
381 381  
382 382 // Accelerators
383   - G_GNUC_INTERNAL void v3270_accelerator_map_sort(v3270 *widget);
384   - G_GNUC_INTERNAL void v3270_init_accelerators(v3270 *widget);
  383 + G_GNUC_INTERNAL void v3270_accelerator_map_sort(v3270 *widget);
  384 + G_GNUC_INTERNAL void v3270_init_accelerators(v3270 *widget);
385 385  
386 386 G_END_DECLS
387 387  
... ...
src/include/v3270/actions.h
... ... @@ -99,6 +99,7 @@
99 99 LIB3270_EXPORT gchar * v3270_accelerator_get_label(const V3270Accelerator * accel);
100 100  
101 101 LIB3270_EXPORT V3270Accelerator * v3270_accelerator_copy(const V3270Accelerator *accel);
  102 + LIB3270_EXPORT const V3270Accelerator * v3270_accelerator_map_lookup_entry(GtkWidget *widget, guint keyval, GdkModifierType state);
102 103  
103 104 G_END_DECLS
104 105  
... ...
src/terminal/keyboard.c
... ... @@ -42,19 +42,11 @@
42 42 #include <internals.h>
43 43 #include <terminal.h>
44 44  
45   -#if GTK_CHECK_VERSION(3,0,0)
  45 + #if GTK_CHECK_VERSION(3,0,0)
46 46 #include <gdk/gdkkeysyms-compat.h>
47   -#else
  47 + #else
48 48 #include <gdk/gdkkeysyms.h>
49   -#endif
50   -
51   -#ifndef GDK_ALT_MASK
52   - #define GDK_ALT_MASK GDK_MOD1_MASK
53   -#endif
54   -
55   -#ifndef GDK_NUMLOCK_MASK
56   - #define GDK_NUMLOCK_MASK GDK_MOD2_MASK
57   -#endif
  49 + #endif
58 50  
59 51 /*--[ Implement ]------------------------------------------------------------------------------------*/
60 52  
... ... @@ -84,160 +76,86 @@
84 76  
85 77 }
86 78  
87   - static gboolean check_keypress(v3270 *widget, const GdkEventKey *event)
  79 + gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event)
88 80 {
89   - //GdkKeymap * keymap = gdk_keymap_get_for_display(gtk_widget_get_display(GTK_WIDGET(widget)));
90   -
91   - // From gtk_accelerator_name at https://gitlab.gnome.org/GNOME/gtk/blob/master/gtk/gtkaccelgroup.c
92   - // Side steps issue from https://mail.gnome.org/archives/gtk-app-devel-list/2007-August/msg00053.html
93   - guint keyval = gdk_keyval_to_lower(event->keyval);
  81 + v3270 * terminal = GTK_V3270(widget);
94 82  
95   - // Add virtual modifiers to event state.
96   - GdkModifierType state = event->state & GDK_MODIFIER_MASK;
97   - // gdk_keymap_add_virtual_modifiers(keymap,&state);
  83 + terminal->activity.timestamp = time(0);
  84 + update_keyboard_state(terminal,event,TRUE);
98 85  
99   -/*
100   -#ifdef WIN32
101   - // FIXME (perry#1#): Find a better way!
102   - if( event->keyval == 0xffffff && event->hardware_keycode == 0x0013)
103   - keyval = GDK_Pause;
104   -
105   - // Windows sets <ctrl> in left/right control
106   - else if(state & GDK_CONTROL_MASK && (keyval == GDK_Control_R || keyval == GDK_Control_L))
107   - state &= ~GDK_CONTROL_MASK;
108   -#endif
109   -*/
  86 +#ifdef DEBUG
  87 + {
  88 + g_autofree gchar * keyname = gtk_accelerator_name(event->keyval,event->state);
  89 + debug("%s Keyval: %d (%s) State: %04x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  90 + __FUNCTION__,
  91 + event->keyval,
  92 + gdk_keyval_name(event->keyval),
  93 + event->state,
  94 + event->state & GDK_SHIFT_MASK ? " GDK_SHIFT_MASK" : "",
  95 + event->state & GDK_LOCK_MASK ? " GDK_LOCK_MASK" : "",
  96 + event->state & GDK_CONTROL_MASK ? " GDK_CONTROL_MASK" : "",
  97 + event->state & GDK_MOD1_MASK ? " GDK_MOD1_MASK" : "",
  98 + event->state & GDK_MOD2_MASK ? " GDK_MOD2_MASK" : "",
  99 + event->state & GDK_MOD3_MASK ? " GDK_MOD3_MASK" : "",
  100 + event->state & GDK_MOD4_MASK ? " GDK_MOD4_MASK" : "",
  101 + event->state & GDK_MOD5_MASK ? " GDK_MOD5_MASK" : "",
  102 + event->state & GDK_BUTTON1_MASK ? " GDK_BUTTON1_MASK" : "",
  103 + event->state & GDK_BUTTON2_MASK ? " GDK_BUTTON2_MASK" : "",
  104 + event->state & GDK_BUTTON3_MASK ? " GDK_BUTTON3_MASK" : "",
  105 + event->state & GDK_BUTTON4_MASK ? " GDK_BUTTON4_MASK" : "",
  106 + event->state & GDK_BUTTON5_MASK ? " GDK_BUTTON5_MASK" : "",
  107 + event->state & GDK_RELEASE_MASK ? " GDK_RELEASE_MASK" : "",
  108 + event->state & GDK_MODIFIER_MASK ? " GDK_MODIFIER_MASK" : ""
  109 + );
110 110  
111   - // Check if the application can handle the key.
112   - gboolean handled = FALSE;
113   - g_signal_emit(
114   - GTK_WIDGET(widget),
115   - v3270_widget_signal[V3270_SIGNAL_KEYPRESS],
116   - 0,
117   - keyval,
118   - event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK), // FIXME: use the processed state after the main application update.
119   - &handled
120   - );
  111 + }
  112 +#endif // DEBUG
121 113  
122   - //debug("Keyboard action was %s (keyval=%08x state=%08x)",handled ? "Handled" : "Not handled",event->keyval,event->state);
123   - if(handled)
  114 + if(gtk_im_context_filter_keypress(terminal->input_method,event))
124 115 return TRUE;
125 116  
126   - if(!gtk_accelerator_valid(keyval,state))
  117 + /*
  118 + if(!gtk_accelerator_valid(event->keyval,event->state))
127 119 return FALSE;
  120 + */
128 121  
129   - //
130   - // Check for accelerator.
131   - //
132   - const V3270Accelerator * accel = v3270_get_accelerator(GTK_WIDGET(widget), keyval, state);
133   - if(accel)
134   - {
135   - debug("%s will fire",__FUNCTION__);
136   - v3270_accelerator_activate(accel,GTK_WIDGET(widget));
137   - return TRUE;
138   - }
139   -
140   - // Check PFKeys
141   - if(keyval >= GDK_F1 && keyval <= GDK_F12 && !(state & (GDK_CONTROL_MASK|GDK_ALT_MASK)))
142   - {
143   - int pfcode = (keyval - GDK_F1) + ((state & GDK_SHIFT_MASK) ? 13 : 1);
144   -
145   - debug("%s: PF%d will fire",__FUNCTION__,pfcode);
146   -
147   - if(pfcode > 0 && pfcode < 25)
148   - {
149   - if(lib3270_pfkey(widget->host,pfcode))
150   - gdk_display_beep(gtk_widget_get_display(GTK_WIDGET(widget)));
151   - return TRUE;
152   - }
153   - else
154   - {
155   - g_warning("Invalid PFCode %d",pfcode);
156   - }
157   - }
158   -
159   - /*
160   - gboolean handled = FALSE;
161   - const V3270Accelerator * accel;
162   -
  122 + // Signal to the application.
  123 + gboolean handled = FALSE;
163 124 g_signal_emit(
164 125 GTK_WIDGET(widget),
165 126 v3270_widget_signal[V3270_SIGNAL_KEYPRESS],
166 127 0,
167 128 event->keyval,
168   - event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK),
  129 + event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK),
169 130 &handled
170 131 );
171 132 debug("Keyboard action was %s",handled ? "Handled" : "Not handled");
172 133 if(handled)
173 134 return TRUE;
174 135  
175   -#ifdef DEBUG
176   - {
177   - g_autofree gchar * keyname = gtk_accelerator_name(event->keyval, event->state);
178   - debug("Keyname: %s",keyname);
179   - }
180   -#endif // DEBUG
181   -
182   - // Check accelerator table.
183   - accel = v3270_get_accelerator(GTK_WIDGET(widget), event->keyval, event->state);
184   -
185   - if(!accel)
186   - accel = v3270_get_accelerator(GTK_WIDGET(widget), event->keyval, event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK));
187 136  
188   - if(accel)
  137 + // Check for accelerator
  138 + const V3270Accelerator * accelerator = v3270_accelerator_map_lookup_entry(widget, event->keyval, event->state);
  139 + if(accelerator)
189 140 {
190   - debug("%s will fire",__FUNCTION__);
191   - v3270_accelerator_activate(accel,GTK_WIDGET(widget));
  141 + debug("Found accelerator %s",v3270_accelerator_get_name(accelerator));
  142 + v3270_accelerator_activate(accelerator,widget);
192 143 return TRUE;
193 144 }
194 145  
195   - // Check PFKeys
196   - if(event->keyval >= GDK_F1 && event->keyval <= GDK_F12 && !(event->state & (GDK_CONTROL_MASK|GDK_ALT_MASK)))
  146 + if(event->keyval >= GDK_F1 && event->keyval <= GDK_F12 && !(event->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK)))
197 147 {
  148 + // It's a PFKey Action.
198 149 int pfcode = (event->keyval - GDK_F1) + ((event->state & GDK_SHIFT_MASK) ? 13 : 1);
199 150  
200 151 if(pfcode > 0 && pfcode < 25)
201 152 {
202   - lib3270_pfkey(widget->host,pfcode);
203   - return TRUE;
204   - }
205   - }
206   - */
207   -
208   - return FALSE;
209   - }
210   -
211   - gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event)
212   - {
213   - v3270 * terminal = GTK_V3270(widget);
214   -
215   - terminal->activity.timestamp = time(0);
216   - update_keyboard_state(terminal,event,TRUE);
  153 + if(lib3270_pfkey(GTK_V3270(widget)->host,pfcode))
  154 + gdk_display_beep(gtk_widget_get_display(widget));
217 155  
218   - if(event->state & GDK_NUMLOCK_MASK)
219   - {
220   - // Hack for special keys
221   - const V3270Accelerator * acel = v3270_get_accelerator(widget, event->keyval, event->state);
222   -
223   - debug("acel=%p",acel);
224   -
225   - if(acel)
226   - {
227   - debug("%s will fire",__FUNCTION__);
228   - v3270_accelerator_activate(acel,GTK_WIDGET(widget));
229   - gtk_im_context_reset(terminal->input_method);
230 156 return TRUE;
231 157 }
232   - }
233 158  
234   - if(gtk_im_context_filter_keypress(terminal->input_method,event))
235   - return TRUE;
236   -
237   - if(check_keypress(terminal,event))
238   - {
239   - gtk_im_context_reset(terminal->input_method);
240   - return TRUE;
241 159 }
242 160  
243 161 return FALSE;
... ... @@ -248,11 +166,43 @@
248 166 {
249 167 v3270 * terminal = GTK_V3270(widget);
250 168  
  169 + terminal->activity.timestamp = time(0);
251 170 update_keyboard_state(terminal,event,FALSE);
252 171  
  172 +/*
  173 +#ifdef DEBUG
  174 + {
  175 + g_autofree gchar * keyname = gtk_accelerator_name(event->keyval,event->state);
  176 + debug("%s Keyval: %d (%s) State: %04x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  177 + __FUNCTION__,
  178 + event->keyval,
  179 + gdk_keyval_name(event->keyval),
  180 + event->state,
  181 + event->state & GDK_SHIFT_MASK ? " GDK_SHIFT_MASK" : "",
  182 + event->state & GDK_LOCK_MASK ? " GDK_LOCK_MASK" : "",
  183 + event->state & GDK_CONTROL_MASK ? " GDK_CONTROL_MASK" : "",
  184 + event->state & GDK_MOD1_MASK ? " GDK_MOD1_MASK" : "",
  185 + event->state & GDK_MOD2_MASK ? " GDK_MOD2_MASK" : "",
  186 + event->state & GDK_MOD3_MASK ? " GDK_MOD3_MASK" : "",
  187 + event->state & GDK_MOD4_MASK ? " GDK_MOD4_MASK" : "",
  188 + event->state & GDK_MOD5_MASK ? " GDK_MOD5_MASK" : "",
  189 + event->state & GDK_BUTTON1_MASK ? " GDK_BUTTON1_MASK" : "",
  190 + event->state & GDK_BUTTON2_MASK ? " GDK_BUTTON2_MASK" : "",
  191 + event->state & GDK_BUTTON3_MASK ? " GDK_BUTTON3_MASK" : "",
  192 + event->state & GDK_BUTTON4_MASK ? " GDK_BUTTON4_MASK" : "",
  193 + event->state & GDK_BUTTON5_MASK ? " GDK_BUTTON5_MASK" : "",
  194 + event->state & GDK_RELEASE_MASK ? " GDK_RELEASE_MASK" : "",
  195 + event->state & GDK_MODIFIER_MASK ? " GDK_MODIFIER_MASK" : ""
  196 + );
  197 +
  198 + }
  199 +#endif // DEBUG
  200 +*/
  201 +
253 202 if(gtk_im_context_filter_keypress(terminal->input_method,event))
254 203 return TRUE;
255 204  
  205 +
256 206 return FALSE;
257 207  
258 208 }
... ...
src/terminal/keyboard/keyfile.c
... ... @@ -172,6 +172,7 @@
172 172 // Standard accelerator.
173 173 V3270Accelerator * acc = v3270_accelerator_copy(accel);
174 174 gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods);
  175 + acc->key = gdk_keyval_to_lower(acc->key);
175 176 terminal->accelerators = g_slist_prepend(terminal->accelerators,acc);
176 177 }
177 178  
... ...
src/terminal/keyboard/map.c
... ... @@ -158,3 +158,31 @@
158 158 return accel;
159 159  
160 160 }
  161 +
  162 + const V3270Accelerator * v3270_accelerator_map_lookup_entry(GtkWidget *widget, guint keyval, GdkModifierType state)
  163 + {
  164 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  165 +
  166 + // Convert keyval
  167 + keyval = gdk_keyval_to_lower(keyval);
  168 +
  169 + // Remove unnecessary modifiers
  170 + state &= (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK);
  171 +
  172 + GSList * ix;
  173 + for(ix = GTK_V3270(widget)->accelerators; ix; ix = g_slist_next(ix))
  174 + {
  175 + V3270Accelerator *accel = (V3270Accelerator *) ix->data;
  176 +
  177 + // First check the keycode.
  178 + if(accel->key != keyval)
  179 + continue;
  180 +
  181 + if(accel->mods == state)
  182 + return accel;
  183 +
  184 + }
  185 +
  186 + return NULL;
  187 + }
  188 +
... ...
src/terminal/keyboard/private.h
... ... @@ -32,6 +32,20 @@
32 32 #include <v3270/actions.h>
33 33 #include <internals.h>
34 34  
  35 + #if GTK_CHECK_VERSION(3,0,0)
  36 + #include <gdk/gdkkeysyms-compat.h>
  37 + #else
  38 + #include <gdk/gdkkeysyms.h>
  39 + #endif
  40 +
  41 + #ifndef GDK_ALT_MASK
  42 + #define GDK_ALT_MASK GDK_MOD1_MASK
  43 + #endif
  44 +
  45 + #ifndef GDK_NUMLOCK_MASK
  46 + #define GDK_NUMLOCK_MASK GDK_MOD2_MASK
  47 + #endif
  48 +
35 49 G_GNUC_INTERNAL int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel);
36 50  
37 51  
... ...