From cea814c38b8326606b4e4a41aae00b829b34eb8c Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 24 Aug 2020 19:04:02 -0300 Subject: [PATCH] refactoring pfkey accelerators. --- src/dialogs/settings/accelerator.c | 82 ++++++++++++---------------------------------------------------------------------- src/include/internals.h | 23 ++--------------------- src/terminal/keyboard/accelerator.c | 28 ---------------------------- src/terminal/keyboard/init.c | 20 ++++++++++++-------- src/terminal/keyboard/keyfile.c | 73 +++++++++++++++---------------------------------------------------------- src/terminal/keyboard/map.c | 7 ++++--- src/terminal/widget.c | 7 +------ 7 files changed, 46 insertions(+), 194 deletions(-) diff --git a/src/dialogs/settings/accelerator.c b/src/dialogs/settings/accelerator.c index 2bc8c0f..309e938 100644 --- a/src/dialogs/settings/accelerator.c +++ b/src/dialogs/settings/accelerator.c @@ -444,27 +444,6 @@ static void alternative_edited(GtkCellRendererAccel G_GNUC_UNUSED(*renderer), gc } gtk_tree_path_free(tree_path); - if(accel && accel->type == V3270_ACCELERATOR_TYPE_PFKEY) - { - GtkWidget * dialog = - gtk_message_dialog_new_with_markup( - GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CANCEL, - _( "The action \"%s\" can't manage alternative keys" ), - v3270_accelerator_get_description(accel) - ); - - gtk_window_set_title(GTK_WINDOW(dialog),_("Rejected by action")); - gtk_widget_show_all(dialog); - - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); - - return; - } - // Call the common validation. change_accel(widget, path, accel_key, mask, ALTERNATIVE_VALUE, ALTERNATIVE_MASK); } @@ -490,17 +469,8 @@ void load(GtkWidget *widget, GtkWidget *terminal) if(ix < G_N_ELEMENTS(keymaps)) { - if(accel->type == V3270_ACCELERATOR_TYPE_PFKEY) - { - keymaps[ix].key = GDK_F1 + (((V3270PFKeyAccelerator *)accel)->keycode - 1); - keymaps[ix].mods = 0; - } - else - { - keymaps[ix].key = accel->key; - keymaps[ix].mods = accel->mods; - } - + keymaps[ix].key = accel->key; + keymaps[ix].mods = accel->mods; ix++; } @@ -560,44 +530,19 @@ static gboolean add_accel(GtkTreeModel *model, GtkTreePath G_GNUC_UNUSED(*path), // Allways create the "main" accelerator to keep the action active. V3270Accelerator * acc = v3270_accelerator_clone(accel); - if(acc->type == V3270_ACCELERATOR_TYPE_PFKEY) { - - if(keymap[0].mods) { - g_warning("PFKey accelerator can't manage modifiers"); - } - - int pfkey = (keymap[0].key - GDK_F1) + 1; - - if(pfkey < 0 || pfkey > 22) { - - g_warning("Invalid pfkey code: %d",pfkey); + acc->key = keymap[0].key; + acc->mods = keymap[0].mods; + *accelerators = g_slist_prepend(*accelerators,acc); - } else { - - ((V3270PFKeyAccelerator *) acc)->keycode = (unsigned short) pfkey; - - } - - *accelerators = g_slist_prepend(*accelerators,acc); - - } else { - - acc->key = keymap[0].key; - acc->mods = keymap[0].mods; + // The alternative one is created only when set. + if(keymap[1].key) + { + acc = v3270_accelerator_clone(accel); + acc->key = keymap[1].key; + acc->mods = keymap[1].mods; *accelerators = g_slist_prepend(*accelerators,acc); - - // The alternative one is created only when set. - if(keymap[1].key) - { - acc = v3270_accelerator_clone(accel); - acc->key = keymap[1].key; - acc->mods = keymap[1].mods; - *accelerators = g_slist_prepend(*accelerators,acc); - } - } - return FALSE; } @@ -617,10 +562,7 @@ void apply(GtkWidget *s, GtkWidget *t) if(terminal->accelerators) g_slist_free_full(terminal->accelerators,g_free); - terminal->accelerators = accelerators; - - // And sort it. - v3270_accelerator_map_sort(terminal); + terminal->accelerators = v3270_accelerator_map_sort(accelerators); } diff --git a/src/include/internals.h b/src/include/internals.h index 5a490b5..88b9ef3 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -158,7 +158,6 @@ V3270_ACCELERATOR_TYPE_INTERNAL, ///< @brief Accelerator is internal. V3270_ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action. V3270_ACCELERATOR_TYPE_LIB3270_TOGGLE, ///< @brief Accelerator is a lib3270 toggle. - V3270_ACCELERATOR_TYPE_PFKEY, ///< @brief Accelerator is a PFKey redirector. V3270_ACCELERATOR_TYPE_CUSTOM, ///< @brief Custom (application based) accelerator. }; @@ -177,24 +176,6 @@ const gchar *name; } V3270CustomAccelerator; - typedef struct _V3270PFKeyAccelerator - { - struct _V3270Accelerator parent; - const gchar *name; - const gchar *description; - unsigned short keycode; - } V3270PFKeyAccelerator; - - /* - typedef enum v3270_toggleable_dialog - { - V3270_TOGGLEABLE_DIALOG_PASTE_FAILED, - - V3270_TOGGLEABLE_DIALOG_CUSTOM - } V3270_TOGGLEABLE_DIALOG; - - G_GNUC_INTERNAL GtkResponseType v3270_popup_toggleable_dialog(GtkWidget *widget, V3270_TOGGLEABLE_DIALOG id, const gchar *title, const gchar *summary, const gchar *body, const gchar *first_button_text, ...) G_GNUC_NULL_TERMINATED; - */ #if GTK_CHECK_VERSION(3,12,0) G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); @@ -387,8 +368,8 @@ G_GNUC_INTERNAL void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned G_GNUC_INTERNAL void v3270_update_toggle(GtkWidget *widget, LIB3270_TOGGLE_ID id, unsigned char value, const char *name); // Accelerators - G_GNUC_INTERNAL void v3270_accelerator_map_sort(v3270 *widget); - G_GNUC_INTERNAL void v3270_init_accelerators(v3270 *widget); + G_GNUC_INTERNAL GSList * v3270_accelerator_map_sort(GSList * accelerators); + G_GNUC_INTERNAL GSList * v3270_accelerator_map_load_default(GSList * accelerators); G_END_DECLS diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index 9bcaf4b..5ee178e 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -51,15 +51,6 @@ } break; - case V3270_ACCELERATOR_TYPE_PFKEY: - { - V3270PFKeyAccelerator * customAccel = g_new0(V3270PFKeyAccelerator,1); - *customAccel = *((V3270PFKeyAccelerator *) accel); - customAccel->parent.arg = (gconstpointer) customAccel; - rc = (V3270Accelerator *) customAccel; - } - break; - default: rc = g_new0(V3270Accelerator,1); *rc = *accel; @@ -176,14 +167,6 @@ description = g_dgettext(GETTEXT_PACKAGE,property->summary); break; - case V3270_ACCELERATOR_TYPE_PFKEY: - debug("%s","V3270_ACCELERATOR_TYPE_PFKEY"); - - if( ((V3270PFKeyAccelerator *)accel)->description ) - description = g_dgettext(GETTEXT_PACKAGE,((V3270PFKeyAccelerator *)accel)->description); - - break; - } debug("%s=%s",__FUNCTION__,description); @@ -218,14 +201,6 @@ description = g_dgettext(GETTEXT_PACKAGE,property->summary); break; - case V3270_ACCELERATOR_TYPE_PFKEY: - debug("%s","V3270_ACCELERATOR_TYPE_PFKEY"); - - if( ((V3270PFKeyAccelerator *)accel)->description ) - description = g_dgettext(GETTEXT_PACKAGE,((V3270PFKeyAccelerator *)accel)->description); - - break; - } debug("%s=%s",__FUNCTION__,description); @@ -299,9 +274,6 @@ case V3270_ACCELERATOR_TYPE_CUSTOM: return ((V3270CustomAccelerator *) accel)->name; - case V3270_ACCELERATOR_TYPE_PFKEY: - return ((V3270PFKeyAccelerator *) accel)->name; - } return NULL; diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index 82b20ea..fafa423 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -68,6 +68,7 @@ return lib3270_toggle(v3270_get_session(widget),action->id); } + /* static int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) { debug("%s accel=%p",__FUNCTION__,accel); @@ -75,12 +76,13 @@ return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); } + */ - void v3270_init_accelerators(v3270 *widget) + GSList * v3270_accelerator_map_load_default(GSList * accelerators) { size_t ix; - // Create accelerators for lib3270 actions. + // Create accelerators for lib3270 actions. { const LIB3270_ACTION * actions = lib3270_get_actions(); @@ -105,7 +107,7 @@ v3270_accelerator_parse(accelerator,keys[key]); - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + accelerators = g_slist_prepend(accelerators,accelerator); } @@ -119,7 +121,7 @@ accelerator->type = V3270_ACCELERATOR_TYPE_LIB3270_ACTION; accelerator->arg = (gconstpointer) &actions[ix]; accelerator->activate = G_CALLBACK(fire_lib3270_action); - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + accelerators = g_slist_prepend(accelerators,accelerator); } @@ -141,7 +143,7 @@ v3270_accelerator_parse(accelerator,toggles[ix].key); - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + accelerators = g_slist_prepend(accelerators,accelerator); } @@ -169,7 +171,7 @@ v3270_accelerator_parse(accelerator,keys[key]); - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + accelerators = g_slist_prepend(accelerators,accelerator); } @@ -184,7 +186,7 @@ accelerator->arg = (gconstpointer) &actions[ix]; accelerator->activate = G_CALLBACK(actions[ix].activate); - widget->accelerators = g_slist_prepend(widget->accelerators,accelerator); + accelerators = g_slist_prepend(accelerators,accelerator); } } @@ -192,6 +194,7 @@ } // Create PF-Key accelerators + /* { static const struct { @@ -236,8 +239,9 @@ } } + */ - v3270_accelerator_map_sort(widget); + return v3270_accelerator_map_sort(accelerators); } diff --git a/src/terminal/keyboard/keyfile.c b/src/terminal/keyboard/keyfile.c index fccd500..f293e42 100644 --- a/src/terminal/keyboard/keyfile.c +++ b/src/terminal/keyboard/keyfile.c @@ -44,36 +44,18 @@ static void save_accelerator(const V3270Accelerator * accel, const char *keys, gpointer ptr) { - if(accel->type == V3270_ACCELERATOR_TYPE_PFKEY) - { - // It's a PF-Key action! - g_autofree gchar * key = g_strdup_printf("pf%u",((V3270PFKeyAccelerator *)accel)->keycode); - - debug("%p %s=%s",accel,v3270_accelerator_get_name(accel),key); - - g_key_file_set_string( - ((struct Args *) ptr)->key_file, - ((struct Args *) ptr)->group_name, - v3270_accelerator_get_name(accel), - key - ); - - } - else - { - const gchar * key = v3270_accelerator_get_name(accel); - if(!key) - return; + const gchar * key = v3270_accelerator_get_name(accel); + if(!key) + return; // debug("%s=%s",v3270_accelerator_get_name(accel),keys); - g_key_file_set_string( - ((struct Args *) ptr)->key_file, - ((struct Args *) ptr)->group_name, - key, - (keys ? keys : "") - ); - } + g_key_file_set_string( + ((struct Args *) ptr)->key_file, + ((struct Args *) ptr)->group_name, + key, + (keys ? keys : "") + ); } @@ -137,36 +119,11 @@ for(ix=0;keycodes[ix];ix++) { - if(accel->type == V3270_ACCELERATOR_TYPE_PFKEY) - { - // It's a PFKey redirector - - unsigned int pfkey = 0; - - if(sscanf(keycodes[ix],"pf%u",&pfkey) != 1) - { - g_warning("Can't parse key \"%s\" for accelerator %s",keycodes[ix],v3270_accelerator_get_name(accel)); - return; - } - - debug("Creating special accelerator %s",v3270_accelerator_get_name(accel)); - - // Remap PFKey accelerator - V3270Accelerator * acc = v3270_accelerator_clone(accel); - ((V3270PFKeyAccelerator *) acc)->keycode = (unsigned short) pfkey; - terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); - - debug("****[%s]***",v3270_accelerator_get_name(accel)); - - } - else - { - // Standard accelerator. - V3270Accelerator * acc = v3270_accelerator_clone(accel); - gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); - acc->key = gdk_keyval_to_lower(acc->key); - terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); - } + // Standard accelerator. + V3270Accelerator * acc = v3270_accelerator_clone(accel); + gtk_accelerator_parse(keycodes[ix],&acc->key,&acc->mods); + acc->key = gdk_keyval_to_lower(acc->key); + terminal->accelerators = g_slist_prepend(terminal->accelerators,acc); } @@ -205,7 +162,7 @@ g_strfreev(keys); - v3270_accelerator_map_sort(terminal); + terminal->accelerators = v3270_accelerator_map_sort(terminal->accelerators); g_object_thaw_notify(G_OBJECT(widget)); terminal->freeze = 0; diff --git a/src/terminal/keyboard/map.c b/src/terminal/keyboard/map.c index bd11ff0..94e8c6f 100644 --- a/src/terminal/keyboard/map.c +++ b/src/terminal/keyboard/map.c @@ -44,7 +44,8 @@ g_slist_free_full(terminal->accelerators,g_free); terminal->accelerators = NULL; } - v3270_init_accelerators(terminal); + terminal->accelerators = v3270_accelerator_map_load_default(NULL); + } } @@ -57,9 +58,9 @@ return a->arg - b->arg; } - void v3270_accelerator_map_sort(v3270 *widget) + GSList * v3270_accelerator_map_sort(GSList * accelerators) { - widget->accelerators = g_slist_sort(widget->accelerators, (GCompareFunc) compare_func); + return g_slist_sort(accelerators, (GCompareFunc) compare_func); } void v3270_accelerator_map_foreach(GtkWidget *widget,void (*call)(const V3270Accelerator * accel, const char *keys, gpointer ptr), gpointer ptr) diff --git a/src/terminal/widget.c b/src/terminal/widget.c index daafee1..f1dab80 100644 --- a/src/terminal/widget.c +++ b/src/terminal/widget.c @@ -565,13 +565,8 @@ static void v3270_init(v3270 *widget) v3270_font_info_init(&widget->font); v3270_set_color_table(widget->color,v3270_get_default_colors()); - /* - for(ix = 0; ix < G_N_ELEMENTS(widget->responses); ix++) - widget->responses[ix] = GTK_RESPONSE_NONE; - */ - // Init accelerators - v3270_init_accelerators(widget); + widget->accelerators = v3270_accelerator_map_load_default(NULL); } -- libgit2 0.21.2