diff --git a/src/include/v3270/actions.h b/src/include/v3270/actions.h index 56bf3bd..8afa5ef 100644 --- a/src/include/v3270/actions.h +++ b/src/include/v3270/actions.h @@ -44,9 +44,9 @@ /// @brief Reset accelerator map to defaults. LIB3270_EXPORT void v3270_accelerator_map_reset(GtkWidget *widget); - LIB3270_EXPORT void v3270_accelerator_activate(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 * accell, GtkWidget *terminal); + LIB3270_EXPORT gboolean v3270_accelerator_compare(const V3270Accelerator * accell, const guint keyval, const GdkModifierType mods); G_END_DECLS diff --git a/src/terminal/keyboard.c b/src/terminal/keyboard.c index 37d90d0..904b1f0 100644 --- a/src/terminal/keyboard.c +++ b/src/terminal/keyboard.c @@ -150,15 +150,12 @@ #endif // DEBUG // Check accelerator table. - GSList * acccelerator; - for(acccelerator = widget->accelerators; acccelerator; acccelerator = g_slist_next(acccelerator)) + const V3270Accelerator * acel = v3270_get_accelerator(GTK_WIDGET(widget), event->keyval, state); + if(acel) { - if(v3270_accelerator_compare((V3270Accelerator *) acccelerator->data, event->keyval, state)) - { - v3270_accelerator_activate((V3270Accelerator *) acccelerator->data,GTK_WIDGET(widget)); - return TRUE; - } - + debug("%s will fire",__FUNCTION__); + v3270_accelerator_activate(acel,GTK_WIDGET(widget)); + return TRUE; } // Check PFKeys @@ -173,21 +170,6 @@ } } - /* - for(f=0; f < (int) G_N_ELEMENTS(keycode);f++) - { - if(keycode[f].keyval == event->keyval && state == keycode[f].state) - { - if(keycode[f].exec) - keycode[f].exec(widget->host); - else - return FALSE; - return TRUE; - - } - } - */ - return FALSE; } @@ -198,6 +180,22 @@ terminal->activity.timestamp = time(0); update_keyboard_state(terminal,event,TRUE); + if(event->state & GDK_NUMLOCK_MASK) + { + // Hack for special keys + const V3270Accelerator * acel = v3270_get_accelerator(widget, event->keyval, event->state); + + debug("acel=%p",acel); + + if(acel) + { + debug("%s will fire",__FUNCTION__); + v3270_accelerator_activate(acel,GTK_WIDGET(widget)); + gtk_im_context_reset(terminal->input_method); + return TRUE; + } + } + if(gtk_im_context_filter_keypress(terminal->input_method,event)) return TRUE; diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index 4011214..0d788df 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -68,13 +68,25 @@ return accell->key == keyval && accell->mods == mods; } - void v3270_accelerator_activate(V3270Accelerator * accell, GtkWidget *terminal) + void v3270_accelerator_activate(const V3270Accelerator * acel, GtkWidget *terminal) { - int rc = ((int (*)(GtkWidget *, const void *)) accell->activate)(terminal,accell->arg); + int rc = ((int (*)(GtkWidget *, const void *)) acel->activate)(terminal,acel->arg); if(rc) gdk_display_beep(gdk_display_get_default()); } + const V3270Accelerator * v3270_get_accelerator(GtkWidget *widget, guint keyval, GdkModifierType state) + { + GSList * acccelerator; + for(acccelerator = GTK_V3270(widget)->accelerators; acccelerator; acccelerator = g_slist_next(acccelerator)) + { + if(v3270_accelerator_compare((V3270Accelerator *) acccelerator->data, keyval, state)) + return (V3270Accelerator *) acccelerator->data; + } + + return NULL; + + } diff --git a/src/terminal/keyboard/init.c b/src/terminal/keyboard/init.c index 5b76e70..89c4a96 100644 --- a/src/terminal/keyboard/init.c +++ b/src/terminal/keyboard/init.c @@ -40,11 +40,21 @@ /*--[ Globals ]--------------------------------------------------------------------------------------*/ -/* + static int fire_keypad_action(GtkWidget *widget, const struct InternalAction * action); + static const struct InternalAction InternalActions[] = { + { + GDK_KP_Add, + GDK_NUMLOCK_MASK, + G_CALLBACK(fire_keypad_action) + }, + { + GDK_KP_Subtract, + GDK_NUMLOCK_MASK, + G_CALLBACK(fire_keypad_action) + } }; -*/ /*--[ Implement ]------------------------------------------------------------------------------------*/ @@ -64,6 +74,27 @@ } + static int fire_keypad_action(GtkWidget *widget, const struct InternalAction * action) + { + int rc = 0; + debug("%s",__FUNCTION__); + + if(v3270_get_toggle(widget,LIB3270_TOGGLE_KP_ALTERNATIVE)) + { + if(action->key == GDK_KP_Add) + rc = lib3270_nextfield(GTK_V3270(widget)->host); + else + rc = lib3270_previousfield(GTK_V3270(widget)->host); + } + else + { + v3270_set_string(widget, action->key == GDK_KP_Add ? "+" : "-"); + } + + return rc; + + } + void v3270_init_accelerators(v3270 *widget) { size_t ix; @@ -105,7 +136,6 @@ } - /* // Create accelerators for internal actions. { size_t ix; @@ -124,7 +154,6 @@ } } - */ v3270_accelerator_map_sort(widget); -- libgit2 0.21.2