diff --git a/keyboard.c b/keyboard.c index 5994ede..76685e0 100644 --- a/keyboard.c +++ b/keyboard.c @@ -55,6 +55,42 @@ #define GDK_NUMLOCK_MASK GDK_MOD2_MASK #endif +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + static struct _keycode + { + guint keyval; + GdkModifierType state; + int (*exec)(H3270 *session); + GtkAction * action; + } keycode[] = + { + { GDK_Left, 0, lib3270_cursor_left, NULL }, + { GDK_Up, 0, lib3270_cursor_up, NULL }, + { GDK_Right, 0, lib3270_cursor_right, NULL }, + { GDK_Down, 0, lib3270_cursor_down, NULL }, + { GDK_Tab, 0, lib3270_nextfield, NULL }, + { GDK_ISO_Left_Tab, GDK_SHIFT_MASK, lib3270_previousfield, NULL }, + { GDK_KP_Left, 0, lib3270_cursor_left, NULL }, + { GDK_KP_Up, 0, lib3270_cursor_up, NULL }, + { GDK_KP_Right, 0, lib3270_cursor_right, NULL }, + { GDK_KP_Down, 0, lib3270_cursor_down, NULL }, + + { GDK_KP_Add, GDK_NUMLOCK_MASK, NULL, NULL }, + { GDK_KP_Subtract, GDK_NUMLOCK_MASK, NULL, NULL }, + + { GDK_3270_PrintScreen, 0, NULL, NULL }, + { GDK_Sys_Req, 0, lib3270_sysreq, NULL }, + + { GDK_Print, GDK_CONTROL_MASK, NULL, NULL }, + { GDK_Print, GDK_SHIFT_MASK, lib3270_sysreq, NULL }, + { GDK_Control_R, 0, NULL, NULL }, + { GDK_Control_L, 0, NULL, NULL }, + +#ifdef WIN32 + { GDK_Pause, 0, NULL, NULL }, +#endif + }; /*--[ Implement ]------------------------------------------------------------------------------------*/ @@ -84,40 +120,6 @@ static gboolean check_keypress(v3270 *widget, GdkEventKey *event) { - static const struct _keycode - { - guint keyval; - GdkModifierType state; - int (*exec)(H3270 *session); - } keycode[] = - { - { GDK_Left, 0, lib3270_cursor_left }, - { GDK_Up, 0, lib3270_cursor_up }, - { GDK_Right, 0, lib3270_cursor_right }, - { GDK_Down, 0, lib3270_cursor_down }, - { GDK_Tab, 0, lib3270_nextfield }, - { GDK_ISO_Left_Tab, GDK_SHIFT_MASK, lib3270_previousfield }, - { GDK_KP_Left, 0, lib3270_cursor_left }, - { GDK_KP_Up, 0, lib3270_cursor_up }, - { GDK_KP_Right, 0, lib3270_cursor_right }, - { GDK_KP_Down, 0, lib3270_cursor_down }, - - { GDK_KP_Add, GDK_NUMLOCK_MASK, NULL }, - { GDK_KP_Subtract, GDK_NUMLOCK_MASK, NULL }, - - { GDK_3270_PrintScreen, 0, NULL }, - { GDK_Sys_Req, 0, lib3270_sysreq }, - - { GDK_Print, GDK_CONTROL_MASK, NULL }, - { GDK_Print, GDK_SHIFT_MASK, lib3270_sysreq }, - { GDK_Control_R, 0, NULL }, - { GDK_Control_L, 0, NULL }, - -#ifdef WIN32 - { GDK_Pause, 0, NULL }, -#endif - }; - int f; int state = event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK); gboolean handled = FALSE; @@ -153,17 +155,43 @@ { if(keycode[f].keyval == event->keyval && state == keycode[f].state) { - if(keycode[f].exec) - { + trace("%s: id=%d action=%p",__FUNCTION__,f,keycode[f].action); + if(keycode[f].action) + gtk_action_activate(keycode[f].action); + else if(keycode[f].exec) keycode[f].exec(widget->host); - return TRUE; - } + else + return FALSE; + return TRUE; + } } return FALSE; } + gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action) + { + guint keyval; + GdkModifierType state; + int f; + + g_return_val_if_fail(GTK_IS_V3270(widget),FALSE); + + gtk_accelerator_parse(key_name,&keyval,&state); + + for(f=0; f < G_N_ELEMENTS(keycode);f++) + { + if(keycode[f].keyval == keyval && keycode[f].state == state) + { + keycode[f].action = action; + return TRUE; + } + } + + return FALSE; + } + gboolean v3270_key_press_event(GtkWidget *widget, GdkEventKey *event) { v3270 * terminal = GTK_V3270(widget); -- libgit2 0.21.2