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,8 +380,8 @@ G_GNUC_INTERNAL void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned
380 G_GNUC_INTERNAL void v3270_update_toggle(GtkWidget *widget, LIB3270_TOGGLE_ID id, unsigned char value, const char *name); 380 G_GNUC_INTERNAL void v3270_update_toggle(GtkWidget *widget, LIB3270_TOGGLE_ID id, unsigned char value, const char *name);
381 381
382 // Accelerators 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 G_END_DECLS 386 G_END_DECLS
387 387
src/include/v3270/actions.h
@@ -99,6 +99,7 @@ @@ -99,6 +99,7 @@
99 LIB3270_EXPORT gchar * v3270_accelerator_get_label(const V3270Accelerator * accel); 99 LIB3270_EXPORT gchar * v3270_accelerator_get_label(const V3270Accelerator * accel);
100 100
101 LIB3270_EXPORT V3270Accelerator * v3270_accelerator_copy(const V3270Accelerator *accel); 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 G_END_DECLS 104 G_END_DECLS
104 105
src/terminal/keyboard.c
@@ -42,19 +42,11 @@ @@ -42,19 +42,11 @@
42 #include <internals.h> 42 #include <internals.h>
43 #include <terminal.h> 43 #include <terminal.h>
44 44
45 -#if GTK_CHECK_VERSION(3,0,0) 45 + #if GTK_CHECK_VERSION(3,0,0)
46 #include <gdk/gdkkeysyms-compat.h> 46 #include <gdk/gdkkeysyms-compat.h>
47 -#else 47 + #else
48 #include <gdk/gdkkeysyms.h> 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 /*--[ Implement ]------------------------------------------------------------------------------------*/ 51 /*--[ Implement ]------------------------------------------------------------------------------------*/
60 52
@@ -84,160 +76,86 @@ @@ -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 return TRUE; 115 return TRUE;
125 116
126 - if(!gtk_accelerator_valid(keyval,state)) 117 + /*
  118 + if(!gtk_accelerator_valid(event->keyval,event->state))
127 return FALSE; 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 g_signal_emit( 124 g_signal_emit(
164 GTK_WIDGET(widget), 125 GTK_WIDGET(widget),
165 v3270_widget_signal[V3270_SIGNAL_KEYPRESS], 126 v3270_widget_signal[V3270_SIGNAL_KEYPRESS],
166 0, 127 0,
167 event->keyval, 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 &handled 130 &handled
170 ); 131 );
171 debug("Keyboard action was %s",handled ? "Handled" : "Not handled"); 132 debug("Keyboard action was %s",handled ? "Handled" : "Not handled");
172 if(handled) 133 if(handled)
173 return TRUE; 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 return TRUE; 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 int pfcode = (event->keyval - GDK_F1) + ((event->state & GDK_SHIFT_MASK) ? 13 : 1); 149 int pfcode = (event->keyval - GDK_F1) + ((event->state & GDK_SHIFT_MASK) ? 13 : 1);
199 150
200 if(pfcode > 0 && pfcode < 25) 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 return TRUE; 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 return FALSE; 161 return FALSE;
@@ -248,11 +166,43 @@ @@ -248,11 +166,43 @@
248 { 166 {
249 v3270 * terminal = GTK_V3270(widget); 167 v3270 * terminal = GTK_V3270(widget);
250 168
  169 + terminal->activity.timestamp = time(0);
251 update_keyboard_state(terminal,event,FALSE); 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 if(gtk_im_context_filter_keypress(terminal->input_method,event)) 202 if(gtk_im_context_filter_keypress(terminal->input_method,event))
254 return TRUE; 203 return TRUE;
255 204
  205 +
256 return FALSE; 206 return FALSE;
257 207
258 } 208 }
src/terminal/keyboard/keyfile.c
@@ -172,6 +172,7 @@ @@ -172,6 +172,7 @@
172 // Standard accelerator. 172 // Standard accelerator.
173 V3270Accelerator * acc = v3270_accelerator_copy(accel); 173 V3270Accelerator * acc = v3270_accelerator_copy(accel);
174 gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); 174 gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods);
  175 + acc->key = gdk_keyval_to_lower(acc->key);
175 terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); 176 terminal->accelerators = g_slist_prepend(terminal->accelerators,acc);
176 } 177 }
177 178
src/terminal/keyboard/map.c
@@ -158,3 +158,31 @@ @@ -158,3 +158,31 @@
158 return accel; 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,6 +32,20 @@
32 #include <v3270/actions.h> 32 #include <v3270/actions.h>
33 #include <internals.h> 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 G_GNUC_INTERNAL int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel); 49 G_GNUC_INTERNAL int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel);
36 50
37 51