diff --git a/src/include/v3270.h b/src/include/v3270.h index 34492be..5b4ab7e 100644 --- a/src/include/v3270.h +++ b/src/include/v3270.h @@ -178,6 +178,7 @@ LIB3270_EXPORT void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color); LIB3270_EXPORT void v3270_set_color(GtkWidget *widget, enum V3270_COLOR id, GdkColor *color); LIB3270_EXPORT GdkColor * v3270_get_color(GtkWidget *widget, enum V3270_COLOR id); + LIB3270_EXPORT gboolean v3270_set_keyboard_action(GtkWidget *widget, const gchar *key_name, GtkAction *action); // Misc LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget); diff --git a/src/pw3270/uiparser/parser.c b/src/pw3270/uiparser/parser.c index 645f797..0fffdca 100644 --- a/src/pw3270/uiparser/parser.c +++ b/src/pw3270/uiparser/parser.c @@ -30,6 +30,7 @@ */ #include "private.h" + #include #ifdef HAVE_GTKMAC #include @@ -109,8 +110,10 @@ struct action_info { GtkActionGroup ** group; GtkAccelGroup * accel_group; + GtkWidget * widget; }; + static void action_group_setup(gpointer key, GtkAction *action, struct action_info *info) { int group_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action),"id_group")); @@ -130,7 +133,7 @@ static void action_group_setup(gpointer key, GtkAction *action, struct action_in */ - if(key_name) + if(key_name && !v3270_set_keyboard_action(info->widget,key_name,action)) { gtk_action_group_add_action_with_accel(info->group[group_id],action,key_name); gtk_action_connect_accelerator(action); @@ -176,6 +179,7 @@ void parser_build(struct parser *p, GtkWidget *widget) GtkWidget * parent; int f; + a_info.widget = widget; a_info.group = g_new0(GtkActionGroup *,(g_strv_length((gchar **) p->group)+1)); a_info.accel_group = gtk_accel_group_new(); @@ -221,7 +225,7 @@ void parser_build(struct parser *p, GtkWidget *widget) gtk_window_add_accel_group(GTK_WINDOW(p->toplevel),a_info.accel_group); gtk_window_set_default(GTK_WINDOW(p->toplevel),widget); - + #ifdef HAVE_GTKMAC if(p->topmenu) { diff --git a/src/pw3270/v3270/keyboard.c b/src/pw3270/v3270/keyboard.c index 5994ede..76685e0 100644 --- a/src/pw3270/v3270/keyboard.c +++ b/src/pw3270/v3270/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); diff --git a/ui/99debug.xml b/ui/99debug.xml index 33c6c3b..e5d43d1 100644 --- a/ui/99debug.xml +++ b/ui/99debug.xml @@ -52,4 +52,6 @@ + + -- libgit2 0.21.2