diff --git a/src/include/v3270/actions.h b/src/include/v3270/actions.h index 0888d51..4027f62 100644 --- a/src/include/v3270/actions.h +++ b/src/include/v3270/actions.h @@ -88,7 +88,7 @@ LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr); LIB3270_EXPORT void v3270_accelerator_map_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); LIB3270_EXPORT gboolean v3270_accelerator_map_load_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); - LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data); + LIB3270_EXPORT V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data); LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state); LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal); @@ -96,6 +96,7 @@ LIB3270_EXPORT const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel); LIB3270_EXPORT const gchar * v3270_accelerator_get_description(const V3270Accelerator * accel); LIB3270_EXPORT const gchar * v3270_accelerator_get_summary(const V3270Accelerator * accel); + LIB3270_EXPORT void v3270_accelerator_parse(V3270Accelerator * accel, const char *key); /// @brief Converts the accelerator into a string which can be used to represent the accelerator to the user. /// @return A newly-allocated string representing the accelerator. diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index a0ac526..9bcaf4b 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -236,6 +236,57 @@ return ""; } + void v3270_accelerator_parse(V3270Accelerator * accel, const char *key) + { + if(!key) + return; + + guint accelerator_key; + GdkModifierType accelerator_mods; + + gtk_accelerator_parse(key, &accelerator_key, &accelerator_mods); + + accel->key = gdk_keyval_to_lower(accelerator_key); + accel->mods = accelerator_mods & gtk_accelerator_get_default_mod_mask(); + + /* + if(!gtk_accelerator_valid(accel->key,accel->mods)) + { + g_warning("Accelerator \"%s\" is not valid",key); + } + */ + +#ifdef DEBUG + { + g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods); + debug("%s Name: %s Keyval: %d (%s) State: %04x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + __FUNCTION__, + v3270_accelerator_get_name(accel), + accel->key, + gdk_keyval_name(accel->key), + accel->mods, + accel->mods & GDK_SHIFT_MASK ? " GDK_SHIFT_MASK" : "", + accel->mods & GDK_LOCK_MASK ? " GDK_LOCK_MASK" : "", + accel->mods & GDK_CONTROL_MASK ? " GDK_CONTROL_MASK" : "", + accel->mods & GDK_MOD1_MASK ? " GDK_MOD1_MASK" : "", + accel->mods & GDK_MOD2_MASK ? " GDK_MOD2_MASK" : "", + accel->mods & GDK_MOD3_MASK ? " GDK_MOD3_MASK" : "", + accel->mods & GDK_MOD4_MASK ? " GDK_MOD4_MASK" : "", + accel->mods & GDK_MOD5_MASK ? " GDK_MOD5_MASK" : "", + accel->mods & GDK_BUTTON1_MASK ? " GDK_BUTTON1_MASK" : "", + accel->mods & GDK_BUTTON2_MASK ? " GDK_BUTTON2_MASK" : "", + accel->mods & GDK_BUTTON3_MASK ? " GDK_BUTTON3_MASK" : "", + accel->mods & GDK_BUTTON4_MASK ? " GDK_BUTTON4_MASK" : "", + accel->mods & GDK_BUTTON5_MASK ? " GDK_BUTTON5_MASK" : "", + accel->mods & GDK_RELEASE_MASK ? " GDK_RELEASE_MASK" : "", + accel->mods & GDK_MODIFIER_MASK ? " GDK_MODIFIER_MASK" : "" + ); + + } +#endif // DEBUG + + } + const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel) { switch(accel->type) diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index 5694978..82b20ea 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -103,7 +103,7 @@ // debug("%s=%s",actions[ix].name,keys[key]); - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); + v3270_accelerator_parse(accelerator,keys[key]); widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); @@ -139,8 +139,7 @@ accelerator->arg = (gconstpointer) &toggles[ix]; accelerator->activate = G_CALLBACK(fire_lib3270_toggle); - if(toggles[ix].key) - gtk_accelerator_parse(toggles[ix].key,&accelerator->key,&accelerator->mods); + v3270_accelerator_parse(accelerator,toggles[ix].key); widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); @@ -168,7 +167,7 @@ accelerator->arg = (gconstpointer) &actions[ix]; accelerator->activate = G_CALLBACK(actions[ix].activate); - gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); + v3270_accelerator_parse(accelerator,keys[key]); widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); diff --git a/src/terminal/keyboard/map.c b/src/terminal/keyboard/map.c index 6fb89be..bd11ff0 100644 --- a/src/terminal/keyboard/map.c +++ b/src/terminal/keyboard/map.c @@ -101,7 +101,7 @@ } - V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, guint accel_key, GdkModifierType accel_mods, GCallback callback, gpointer data) + V3270Accelerator * v3270_accelerator_map_add_entry(GtkWidget *widget, const gchar *name, const gchar *accelerator, GCallback callback, gpointer data) { GSList * ix; v3270 * terminal = GTK_V3270(widget); @@ -135,21 +135,24 @@ accel->arg = data; accel->activate = callback; - accel->key = accel_key; - accel->mods = accel_mods; - // Any other accell in the same key? If yes, clear it. - for(ix = terminal->accelerators; ix; ix = g_slist_next(ix)) + v3270_accelerator_parse(accel, accelerator); + + if(accel->key) { - V3270Accelerator * acc = (V3270Accelerator *) ix->data; - if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods)) - continue; + // Any other accell in the same key and modifier? If yes, clear it. + for(ix = terminal->accelerators; ix; ix = g_slist_next(ix)) + { + V3270Accelerator * acc = (V3270Accelerator *) ix->data; + if((acc == accel) || !(acc->key == accel->key && acc->mods == accel->mods)) + continue; - debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc)); + debug("Resetting accelerator \"%s\"",v3270_accelerator_get_name(acc)); - acc->key = 0; - acc->mods = 0; + acc->key = 0; + acc->mods = 0; + } } // Sort! @@ -167,7 +170,7 @@ keyval = gdk_keyval_to_lower(keyval); // Remove unnecessary modifiers - state &= (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK); + state &= gtk_accelerator_get_default_mod_mask(); // (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK); GSList * ix; for(ix = GTK_V3270(widget)->accelerators; ix; ix = g_slist_next(ix)) -- libgit2 0.21.2