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 | ... | ... |