From f3ce154a7e63cb2a5c9be400c1d1fc212879b90a Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 24 Aug 2020 20:25:54 -0300 Subject: [PATCH] Refactoring PFkey engine to allow remapping from accelerator dialog. --- src/include/internals.h | 7 +++++++ src/terminal/keyboard.c | 2 ++ src/terminal/keyboard/accelerator.c | 11 +++++++++++ src/terminal/keyboard/init.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/include/internals.h b/src/include/internals.h index 88b9ef3..4e5b989 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -158,6 +158,7 @@ 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. V3270_ACCELERATOR_TYPE_CUSTOM, ///< @brief Custom (application based) accelerator. }; @@ -170,6 +171,12 @@ GCallback activate; }; + typedef struct _V3270PFKeyAccelerator + { + struct _V3270Accelerator parent; + GdkAtom name; + } V3270PFKeyAccelerator; + typedef struct _V3270CustomAccelerator { struct _V3270Accelerator parent; diff --git a/src/terminal/keyboard.c b/src/terminal/keyboard.c index a869621..cb22515 100644 --- a/src/terminal/keyboard.c +++ b/src/terminal/keyboard.c @@ -148,6 +148,7 @@ return TRUE; } + /* if(event->keyval >= GDK_F1 && event->keyval <= GDK_F12 && !(event->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK))) { // It's a PFKey Action. @@ -162,6 +163,7 @@ } } + */ return FALSE; diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index 5ee178e..54f32f7 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -51,6 +51,14 @@ } break; + case V3270_ACCELERATOR_TYPE_PFKEY: + { + V3270PFKeyAccelerator * accell = g_new0(V3270PFKeyAccelerator,1); + *accell = *((V3270PFKeyAccelerator *) accel); + rc = (V3270Accelerator *) accell; + } + break; + default: rc = g_new0(V3270Accelerator,1); *rc = *accel; @@ -271,6 +279,9 @@ case V3270_ACCELERATOR_TYPE_INTERNAL: return lib3270_property_get_name((const LIB3270_PROPERTY *) accel->arg); + case V3270_ACCELERATOR_TYPE_PFKEY: + return gdk_atom_name(((const V3270PFKeyAccelerator *) accel)->name); + case V3270_ACCELERATOR_TYPE_CUSTOM: return ((V3270CustomAccelerator *) accel)->name; diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index fafa423..bc9f9f1 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -68,15 +68,42 @@ return lib3270_toggle(v3270_get_session(widget),action->id); } - /* - static int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) + static int fire_pfkey_action(GtkWidget *widget, gpointer *id) { - debug("%s accel=%p",__FUNCTION__,accel); - debug("%s Accelerator(%s)=%p pfkey=%d",__FUNCTION__,accel->name,accel,accel->keycode); + debug("%s(%u)",__FUNCTION__,GPOINTER_TO_INT(id)); + return lib3270_pfkey(GTK_V3270(widget)->host,GPOINTER_TO_INT(id)); + } + + static V3270PFKeyAccelerator * v3270_pfkey_accelerator_new(int id, const gchar *keyname) + { + V3270PFKeyAccelerator * accelerator = g_new0(V3270PFKeyAccelerator,1); + + accelerator->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; + accelerator->parent.arg = GINT_TO_POINTER(id); + + g_autofree gchar *name = g_strdup_printf("pf%02d",id); + debug("%s(%s)",__FUNCTION__,name); + accelerator->name = gdk_atom_intern(name,FALSE); - return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); + if(keyname) { + + v3270_accelerator_parse((V3270Accelerator *) accelerator,keyname); + + } else { + + g_autofree gchar *kn = NULL; + if(id < 12) + kn = g_strdup_printf("F%u",id); + else + kn = g_strdup_printf("F%u",id-12); + + v3270_accelerator_parse((V3270Accelerator *) accelerator,kn); + } + + accelerator->parent.activate = G_CALLBACK(fire_pfkey_action); + + return accelerator; } - */ GSList * v3270_accelerator_map_load_default(GSList * accelerators) { @@ -194,6 +221,21 @@ } // Create PF-Key accelerators + { + unsigned short key; + // PF1 - PF24 + for(key = 1; key < 25; key++) { + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,NULL)); + + if(key == 7) { + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,"Page_Up")); + } else if(key == 8) { + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,"Page_Down")); + } + + } + + } /* { static const struct -- libgit2 0.21.2