Commit f3ce154a7e63cb2a5c9be400c1d1fc212879b90a
1 parent
cea814c3
Exists in
master
and in
1 other branch
Refactoring PFkey engine to allow remapping from accelerator dialog.
Showing
4 changed files
with
68 additions
and
6 deletions
Show diff stats
src/include/internals.h
| ... | ... | @@ -158,6 +158,7 @@ |
| 158 | 158 | V3270_ACCELERATOR_TYPE_INTERNAL, ///< @brief Accelerator is internal. |
| 159 | 159 | V3270_ACCELERATOR_TYPE_LIB3270_ACTION, ///< @brief Accelerator is a lib3270 action. |
| 160 | 160 | V3270_ACCELERATOR_TYPE_LIB3270_TOGGLE, ///< @brief Accelerator is a lib3270 toggle. |
| 161 | + V3270_ACCELERATOR_TYPE_PFKEY, ///< @brief Accelerator is a PFKEY. | |
| 161 | 162 | V3270_ACCELERATOR_TYPE_CUSTOM, ///< @brief Custom (application based) accelerator. |
| 162 | 163 | }; |
| 163 | 164 | |
| ... | ... | @@ -170,6 +171,12 @@ |
| 170 | 171 | GCallback activate; |
| 171 | 172 | }; |
| 172 | 173 | |
| 174 | + typedef struct _V3270PFKeyAccelerator | |
| 175 | + { | |
| 176 | + struct _V3270Accelerator parent; | |
| 177 | + GdkAtom name; | |
| 178 | + } V3270PFKeyAccelerator; | |
| 179 | + | |
| 173 | 180 | typedef struct _V3270CustomAccelerator |
| 174 | 181 | { |
| 175 | 182 | struct _V3270Accelerator parent; | ... | ... |
src/terminal/keyboard.c
| ... | ... | @@ -148,6 +148,7 @@ |
| 148 | 148 | return TRUE; |
| 149 | 149 | } |
| 150 | 150 | |
| 151 | + /* | |
| 151 | 152 | if(event->keyval >= GDK_F1 && event->keyval <= GDK_F12 && !(event->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK))) |
| 152 | 153 | { |
| 153 | 154 | // It's a PFKey Action. |
| ... | ... | @@ -162,6 +163,7 @@ |
| 162 | 163 | } |
| 163 | 164 | |
| 164 | 165 | } |
| 166 | + */ | |
| 165 | 167 | |
| 166 | 168 | return FALSE; |
| 167 | 169 | ... | ... |
src/terminal/keyboard/accelerator.c
| ... | ... | @@ -51,6 +51,14 @@ |
| 51 | 51 | } |
| 52 | 52 | break; |
| 53 | 53 | |
| 54 | + case V3270_ACCELERATOR_TYPE_PFKEY: | |
| 55 | + { | |
| 56 | + V3270PFKeyAccelerator * accell = g_new0(V3270PFKeyAccelerator,1); | |
| 57 | + *accell = *((V3270PFKeyAccelerator *) accel); | |
| 58 | + rc = (V3270Accelerator *) accell; | |
| 59 | + } | |
| 60 | + break; | |
| 61 | + | |
| 54 | 62 | default: |
| 55 | 63 | rc = g_new0(V3270Accelerator,1); |
| 56 | 64 | *rc = *accel; |
| ... | ... | @@ -271,6 +279,9 @@ |
| 271 | 279 | case V3270_ACCELERATOR_TYPE_INTERNAL: |
| 272 | 280 | return lib3270_property_get_name((const LIB3270_PROPERTY *) accel->arg); |
| 273 | 281 | |
| 282 | + case V3270_ACCELERATOR_TYPE_PFKEY: | |
| 283 | + return gdk_atom_name(((const V3270PFKeyAccelerator *) accel)->name); | |
| 284 | + | |
| 274 | 285 | case V3270_ACCELERATOR_TYPE_CUSTOM: |
| 275 | 286 | return ((V3270CustomAccelerator *) accel)->name; |
| 276 | 287 | ... | ... |
src/terminal/keyboard/init.c
| ... | ... | @@ -68,15 +68,42 @@ |
| 68 | 68 | return lib3270_toggle(v3270_get_session(widget),action->id); |
| 69 | 69 | } |
| 70 | 70 | |
| 71 | - /* | |
| 72 | - static int fire_pfkey_action(GtkWidget *widget, V3270PFKeyAccelerator *accel) | |
| 71 | + static int fire_pfkey_action(GtkWidget *widget, gpointer *id) | |
| 73 | 72 | { |
| 74 | - debug("%s accel=%p",__FUNCTION__,accel); | |
| 75 | - debug("%s Accelerator(%s)=%p pfkey=%d",__FUNCTION__,accel->name,accel,accel->keycode); | |
| 73 | + debug("%s(%u)",__FUNCTION__,GPOINTER_TO_INT(id)); | |
| 74 | + return lib3270_pfkey(GTK_V3270(widget)->host,GPOINTER_TO_INT(id)); | |
| 75 | + } | |
| 76 | + | |
| 77 | + static V3270PFKeyAccelerator * v3270_pfkey_accelerator_new(int id, const gchar *keyname) | |
| 78 | + { | |
| 79 | + V3270PFKeyAccelerator * accelerator = g_new0(V3270PFKeyAccelerator,1); | |
| 80 | + | |
| 81 | + accelerator->parent.type = V3270_ACCELERATOR_TYPE_PFKEY; | |
| 82 | + accelerator->parent.arg = GINT_TO_POINTER(id); | |
| 83 | + | |
| 84 | + g_autofree gchar *name = g_strdup_printf("pf%02d",id); | |
| 85 | + debug("%s(%s)",__FUNCTION__,name); | |
| 86 | + accelerator->name = gdk_atom_intern(name,FALSE); | |
| 76 | 87 | |
| 77 | - return lib3270_pfkey(v3270_get_session(widget),(int) accel->keycode); | |
| 88 | + if(keyname) { | |
| 89 | + | |
| 90 | + v3270_accelerator_parse((V3270Accelerator *) accelerator,keyname); | |
| 91 | + | |
| 92 | + } else { | |
| 93 | + | |
| 94 | + g_autofree gchar *kn = NULL; | |
| 95 | + if(id < 12) | |
| 96 | + kn = g_strdup_printf("F%u",id); | |
| 97 | + else | |
| 98 | + kn = g_strdup_printf("<shift>F%u",id-12); | |
| 99 | + | |
| 100 | + v3270_accelerator_parse((V3270Accelerator *) accelerator,kn); | |
| 101 | + } | |
| 102 | + | |
| 103 | + accelerator->parent.activate = G_CALLBACK(fire_pfkey_action); | |
| 104 | + | |
| 105 | + return accelerator; | |
| 78 | 106 | } |
| 79 | - */ | |
| 80 | 107 | |
| 81 | 108 | GSList * v3270_accelerator_map_load_default(GSList * accelerators) |
| 82 | 109 | { |
| ... | ... | @@ -194,6 +221,21 @@ |
| 194 | 221 | } |
| 195 | 222 | |
| 196 | 223 | // Create PF-Key accelerators |
| 224 | + { | |
| 225 | + unsigned short key; | |
| 226 | + // PF1 - PF24 | |
| 227 | + for(key = 1; key < 25; key++) { | |
| 228 | + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,NULL)); | |
| 229 | + | |
| 230 | + if(key == 7) { | |
| 231 | + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,"Page_Up")); | |
| 232 | + } else if(key == 8) { | |
| 233 | + accelerators = g_slist_prepend(accelerators,v3270_pfkey_accelerator_new(key,"Page_Down")); | |
| 234 | + } | |
| 235 | + | |
| 236 | + } | |
| 237 | + | |
| 238 | + } | |
| 197 | 239 | /* |
| 198 | 240 | { |
| 199 | 241 | static const struct | ... | ... |