From 38e4ce37eec3bc0eacef766b8d13c6b48906e6ba Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 27 Nov 2019 16:44:34 -0300 Subject: [PATCH] Adding method to "dump" the accelerator table. --- src/include/v3270/actions.h | 29 +++++++++++++++++++++++------ src/terminal/keyboard/accelerator.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/terminal/keyboard/init.c | 14 +++++++++++++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/src/include/v3270/actions.h b/src/include/v3270/actions.h index 8afa5ef..8eb4070 100644 --- a/src/include/v3270/actions.h +++ b/src/include/v3270/actions.h @@ -37,16 +37,33 @@ typedef struct _V3270Accelerator V3270Accelerator; - LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) G_GNUC_DEPRECATED; + + + // + // Actions + // LIB3270_EXPORT void v3270_tab(GtkWidget *widget); - LIB3270_EXPORT void v3270_backtab(GtkWidget *widget); + + // + // Misc + // + LIB3270_EXPORT void v3270_set_scroll_action(GtkWidget *widget, GdkScrollDirection direction, GtkAction *action) G_GNUC_DEPRECATED; + + // + // Keyboard accelerators + // + LIB3270_EXPORT void v3270_backtab(GtkWidget *widget); /// @brief Reset accelerator map to defaults. - LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget); + LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget); + + LIB3270_EXPORT void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr); - LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state); - LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accell, GtkWidget *terminal); - LIB3270_EXPORT gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods); + LIB3270_EXPORT const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state); + LIB3270_EXPORT void v3270_accelerator_activate(const V3270Accelerator * accel, GtkWidget *terminal); + LIB3270_EXPORT gboolean v3270_accelerator_compare(const V3270Accelerator * accel, const guint keyval, const GdkModifierType mods); + LIB3270_EXPORT const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel); + LIB3270_EXPORT const gchar * v3270_accelerator_get_description(const V3270Accelerator * accel); G_END_DECLS diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index 0d788df..05c66e2 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -90,3 +90,67 @@ } + const gchar * v3270_accelerator_get_description(const V3270Accelerator * accel) + { + switch(accel->type) + { + case V3270_ACCELERATOR_TYPE_LIB3270_ACTION: + return gettext(((LIB3270_ACTION *) accel->arg)->summary); + + // case V3270_ACCELERATOR_TYPE_INTERNAL: + // case V3270_ACCELERATOR_TYPE_GTK_ACTION: + + } + + return NULL; + } + + const gchar * v3270_accelerator_get_name(const V3270Accelerator * accel) + { + switch(accel->type) + { + case V3270_ACCELERATOR_TYPE_LIB3270_ACTION: + return gettext(((LIB3270_ACTION *) accel->arg)->name); + + // case V3270_ACCELERATOR_TYPE_INTERNAL: + // case V3270_ACCELERATOR_TYPE_GTK_ACTION: + + } + + return NULL; + } + + void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr) + { + GSList * accelerator = GTK_V3270(widget)->accelerators; + GString * str = g_string_new(""); + + while(accelerator) + { + V3270Accelerator * current = (V3270Accelerator *) accelerator->data; + + g_string_truncate(str,0); + + while(accelerator && (((V3270Accelerator *) accelerator->data)->activate == current->activate) && (((V3270Accelerator *) accelerator->data)->arg == current->arg)) + { + V3270Accelerator *accel = (V3270Accelerator *) accelerator->data; + if(accel->key) + { + + if(str->str[0]) + g_string_append(str," "); + + g_autofree gchar * keyname = gtk_accelerator_name(accel->key,accel->mods); + g_string_append(str,keyname); + } + + accelerator = g_slist_next(accelerator); + } + + call(current,str->str,ptr); + + } + + g_string_free(str,FALSE); + + } diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index 89c4a96..be64285 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -33,6 +33,7 @@ #include #include #include + #include #ifndef GDK_NUMLOCK_MASK #define GDK_NUMLOCK_MASK GDK_MOD2_MASK @@ -95,6 +96,13 @@ } +#ifdef DEBUG + void show_accelerator(const V3270Accelerator * accel, const char *keys, gpointer ptr) + { + debug("%s=%s",v3270_accelerator_get_name(accel),keys); + } +#endif // DEBUG + void v3270_init_accelerators(v3270 *widget) { size_t ix; @@ -120,7 +128,7 @@ accelerator->arg = (gconstpointer) &actions[ix]; accelerator->activate = G_CALLBACK(fire_lib3270_action); - debug("%s=%s",actions[ix].name,keys[key]); +// debug("%s=%s",actions[ix].name,keys[key]); gtk_accelerator_parse(keys[key],&accelerator->key,&accelerator->mods); @@ -157,6 +165,10 @@ v3270_accelerator_map_sort(widget); +#ifdef DEBUG + v3270_accelerator_map_foreach(widget,show_accelerator,NULL); +#endif // DEBUG + } -- libgit2 0.21.2