Commit 1582d4afa30577c5fabe19658a733f2e19cb6aaf
1 parent
df99d559
Exists in
master
and in
1 other branch
Refactoring accelerator engine.
Showing
4 changed files
with
71 additions
and
17 deletions
Show diff stats
src/include/v3270/actions.h
... | ... | @@ -88,7 +88,7 @@ |
88 | 88 | LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr); |
89 | 89 | LIB3270_EXPORT void v3270_accelerator_map_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); |
90 | 90 | LIB3270_EXPORT gboolean v3270_accelerator_map_load_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); |
91 | - LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data); | |
91 | + LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data); | |
92 | 92 | |
93 | 93 | LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state); |
94 | 94 | LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal); |
... | ... | @@ -96,6 +96,7 @@ |
96 | 96 | LIB3270_EXPORT const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel); |
97 | 97 | LIB3270_EXPORT const gchar * v3270_accelerator_get_description(const V3270Accelerator * accel); |
98 | 98 | LIB3270_EXPORT const gchar * v3270_accelerator_get_summary(const V3270Accelerator * accel); |
99 | + LIB3270_EXPORT void v3270_accelerator_parse(V3270Accelerator * accel, const char *key); | |
99 | 100 | |
100 | 101 | /// @brief Converts the accelerator into a string which can be used to represent the accelerator to the user. |
101 | 102 | /// @return A newly-allocated string representing the accelerator. | ... | ... |
src/terminal/keyboard/accelerator.c
... | ... | @@ -236,6 +236,57 @@ |
236 | 236 | return ""; |
237 | 237 | } |
238 | 238 | |
239 | + void v3270_accelerator_parse(V3270Accelerator * accel, const char *key) | |
240 | + { | |
241 | + if(!key) | |
242 | + return; | |
243 | + | |
244 | + guint accelerator_key; | |
245 | + GdkModifierType accelerator_mods; | |
246 | + | |
247 | + gtk_accelerator_parse(key, &accelerator_key, &accelerator_mods); | |
248 | + | |
249 | + accel->key = gdk_keyval_to_lower(accelerator_key); | |
250 | + accel->mods = accelerator_mods & gtk_accelerator_get_default_mod_mask(); | |
251 | + | |
252 | + /* | |
253 | + if(!gtk_accelerator_valid(accel->key,accel->mods)) | |
254 | + { | |
255 | + g_warning("Accelerator \"%s\" is not valid",key); | |
256 | + } | |
257 | + */ | |
258 | + | |
259 | +#ifdef DEBUG | |
260 | + { | |
261 | + g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods); | |
262 | + debug("%s Name: %s Keyval: %d (%s) State: %04x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", | |
263 | + __FUNCTION__, | |
264 | + v3270_accelerator_get_name(accel), | |
265 | + accel->key, | |
266 | + gdk_keyval_name(accel->key), | |
267 | + accel->mods, | |
268 | + accel->mods & GDK_SHIFT_MASK ? " GDK_SHIFT_MASK" : "", | |
269 | + accel->mods & GDK_LOCK_MASK ? " GDK_LOCK_MASK" : "", | |
270 | + accel->mods & GDK_CONTROL_MASK ? " GDK_CONTROL_MASK" : "", | |
271 | + accel->mods & GDK_MOD1_MASK ? " GDK_MOD1_MASK" : "", | |
272 | + accel->mods & GDK_MOD2_MASK ? " GDK_MOD2_MASK" : "", | |
273 | + accel->mods & GDK_MOD3_MASK ? " GDK_MOD3_MASK" : "", | |
274 | + accel->mods & GDK_MOD4_MASK ? " GDK_MOD4_MASK" : "", | |
275 | + accel->mods & GDK_MOD5_MASK ? " GDK_MOD5_MASK" : "", | |
276 | + accel->mods & GDK_BUTTON1_MASK ? " GDK_BUTTON1_MASK" : "", | |
277 | + accel->mods & GDK_BUTTON2_MASK ? " GDK_BUTTON2_MASK" : "", | |
278 | + accel->mods & GDK_BUTTON3_MASK ? " GDK_BUTTON3_MASK" : "", | |
279 | + accel->mods & GDK_BUTTON4_MASK ? " GDK_BUTTON4_MASK" : "", | |
280 | + accel->mods & GDK_BUTTON5_MASK ? " GDK_BUTTON5_MASK" : "", | |
281 | + accel->mods & GDK_RELEASE_MASK ? " GDK_RELEASE_MASK" : "", | |
282 | + accel->mods & GDK_MODIFIER_MASK ? " GDK_MODIFIER_MASK" : "" | |
283 | + ); | |
284 | + | |
285 | + } | |
286 | +#endif // DEBUG | |
287 | + | |
288 | + } | |
289 | + | |
239 | 290 | const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel) |
240 | 291 | { |
241 | 292 | switch(accel->type) | ... | ... |
src/terminal/keyboard/init.c
... | ... | @@ -103,7 +103,7 @@ |
103 | 103 | |
104 | 104 | // debug("%s=%s",actions[ix].name,keys[key]); |
105 | 105 | |
106 | - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); | |
106 | + v3270_accelerator_parse(accelerator,keys[key]); | |
107 | 107 | |
108 | 108 | widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); |
109 | 109 | |
... | ... | @@ -139,8 +139,7 @@ |
139 | 139 | accelerator->arg = (gconstpointer) &toggles[ix]; |
140 | 140 | accelerator->activate = G_CALLBACK(fire_lib3270_toggle); |
141 | 141 | |
142 | - if(toggles[ix].key) | |
143 | - gtk_accelerator_parse(toggles[ix].key,&accelerator->key,&accelerator->mods); | |
142 | + v3270_accelerator_parse(accelerator,toggles[ix].key); | |
144 | 143 | |
145 | 144 | widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); |
146 | 145 | |
... | ... | @@ -168,7 +167,7 @@ |
168 | 167 | accelerator->arg = (gconstpointer) &actions[ix]; |
169 | 168 | accelerator->activate = G_CALLBACK(actions[ix].activate); |
170 | 169 | |
171 | - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); | |
170 | + v3270_accelerator_parse(accelerator,keys[key]); | |
172 | 171 | |
173 | 172 | widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); |
174 | 173 | ... | ... |
src/terminal/keyboard/map.c
... | ... | @@ -101,7 +101,7 @@ |
101 | 101 | |
102 | 102 | } |
103 | 103 | |
104 | - V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data) | |
104 | + V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data) | |
105 | 105 | { |
106 | 106 | GSList * ix; |
107 | 107 | v3270 * terminal = GTK_V3270(widget); |
... | ... | @@ -135,21 +135,24 @@ |
135 | 135 | |
136 | 136 | accel->arg = data; |
137 | 137 | accel->activate = callback; |
138 | - accel->key = accel_key; | |
139 | - accel->mods = accel_mods; | |
140 | 138 | |
141 | - // Any other accell in the same key? If yes, clear it. | |
142 | - for(ix = terminal->accelerators; ix; ix = g_slist_next(ix)) | |
139 | + v3270_accelerator_parse(accel, accelerator); | |
140 | + | |
141 | + if(accel->key) | |
143 | 142 | { |
144 | - V3270Accelerator * acc = (V3270Accelerator *) ix->data; | |
145 | - if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods)) | |
146 | - continue; | |
143 | + // Any other accell in the same key and modifier? If yes, clear it. | |
144 | + for(ix = terminal->accelerators; ix; ix = g_slist_next(ix)) | |
145 | + { | |
146 | + V3270Accelerator * acc = (V3270Accelerator *) ix->data; | |
147 | + if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods)) | |
148 | + continue; | |
147 | 149 | |
148 | - debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc)); | |
150 | + debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc)); | |
149 | 151 | |
150 | - acc->key = 0; | |
151 | - acc->mods = 0; | |
152 | + acc->key = 0; | |
153 | + acc->mods = 0; | |
152 | 154 | |
155 | + } | |
153 | 156 | } |
154 | 157 | |
155 | 158 | // Sort! |
... | ... | @@ -167,7 +170,7 @@ |
167 | 170 | keyval = gdk_keyval_to_lower(keyval); |
168 | 171 | |
169 | 172 | // Remove unnecessary modifiers |
170 | - state &= (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK); | |
173 | + state &= gtk_accelerator_get_default_mod_mask(); // (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK); | |
171 | 174 | |
172 | 175 | GSList * ix; |
173 | 176 | for(ix = GTK_V3270(widget)->accelerators; ix; ix = g_slist_next(ix)) | ... | ... |