From 101ba80b338039cd0e67fae16991be75042e8fe4 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 13 Dec 2019 08:56:48 -0300 Subject: [PATCH] Fixing accelerator engine using the terminal display for "beeps". --- src/terminal/keyboard.c | 38 ++++++++++++++++++++++---------------- src/terminal/keyboard/accelerator.c | 17 ++++++----------- src/terminal/mouse.c | 4 ++-- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/terminal/keyboard.c b/src/terminal/keyboard.c index e39a652..136e94a 100644 --- a/src/terminal/keyboard.c +++ b/src/terminal/keyboard.c @@ -86,15 +86,27 @@ static gboolean check_keypress(v3270 *widget, const GdkEventKey *event) { - GdkKeymap * keymap = gdk_keymap_get_for_display(gtk_widget_get_display(GTK_WIDGET(widget))); + //GdkKeymap * keymap = gdk_keymap_get_for_display(gtk_widget_get_display(GTK_WIDGET(widget))); // From gtk_accelerator_name at https://gitlab.gnome.org/GNOME/gtk/blob/master/gtk/gtkaccelgroup.c // Side steps issue from https://mail.gnome.org/archives/gtk-app-devel-list/2007-August/msg00053.html guint keyval = gdk_keyval_to_lower(event->keyval); // Add virtual modifiers to event state. - GdkModifierType state = event->state & ~GDK_RELEASE_MASK; - gdk_keymap_add_virtual_modifiers(keymap,&state); + GdkModifierType state = event->state & GDK_MODIFIER_MASK; + // gdk_keymap_add_virtual_modifiers(keymap,&state); + +/* +#ifdef WIN32 + // FIXME (perry#1#): Find a better way! + if( event->keyval == 0xffffff && event->hardware_keycode == 0x0013) + keyval = GDK_Pause; + + // Windows sets in left/right control + else if(state & GDK_CONTROL_MASK && (keyval == GDK_Control_R || keyval == GDK_Control_L)) + state &= ~GDK_CONTROL_MASK; +#endif +*/ // Check if the application can handle the key. gboolean handled = FALSE; @@ -103,14 +115,17 @@ v3270_widget_signal[V3270_SIGNAL_KEYPRESS], 0, keyval, - state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK), // FIXME: Remove the reset flags after the main application update. + event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK), // FIXME: use the processed state after the main application update. &handled ); - debug("Keyboard action was %s (keyval=%08x state=%08x)",handled ? "Handled" : "Not handled",event->keyval,event->state); + //debug("Keyboard action was %s (keyval=%08x state=%08x)",handled ? "Handled" : "Not handled",event->keyval,event->state); if(handled) return TRUE; + if(!gtk_accelerator_valid(keyval,state)) + return FALSE; + // // Check for accelerator. // @@ -131,7 +146,8 @@ if(pfcode > 0 && pfcode < 25) { - lib3270_pfkey(widget->host,pfcode); + if(lib3270_pfkey(widget->host,pfcode)) + gdk_display_beep(gtk_widget_get_display(GTK_WIDGET(widget))); return TRUE; } else @@ -144,16 +160,6 @@ gboolean handled = FALSE; const V3270Accelerator * accel; -#ifdef WIN32 - // FIXME (perry#1#): Find a better way! - if( event->keyval == 0xffffff && event->hardware_keycode == 0x0013) - event->keyval = GDK_Pause; - - // Windows sets in left/right control - else if(event->state & GDK_CONTROL_MASK && (event->keyval == GDK_Control_R || event->keyval == GDK_Control_L)) - event->state &= ~GDK_CONTROL_MASK; -#endif - g_signal_emit( GTK_WIDGET(widget), v3270_widget_signal[V3270_SIGNAL_KEYPRESS], diff --git a/src/terminal/keyboard/accelerator.c b/src/terminal/keyboard/accelerator.c index 9ee37fb..afd6ee5 100644 --- a/src/terminal/keyboard/accelerator.c +++ b/src/terminal/keyboard/accelerator.c @@ -60,14 +60,14 @@ { // Problems: - debug("%s: keys: %08x %08x",__FUNCTION__,accel->key,keyval); +// debug("%s: keys: %08x %08x",__FUNCTION__,accel->key,keyval); // It's the same key? if(accel->key != keyval) { g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); - debug("%s: Rejected by key %08x %08x (%s %s)",__FUNCTION__,accel->key,keyval,acckey,qkey); +// debug("%s: Rejected by key %08x %08x (%s %s)",__FUNCTION__,accel->key,keyval,acckey,qkey); return FALSE; } @@ -75,20 +75,15 @@ if(accel->mods == mods) return TRUE; +/* #ifdef DEBUG { g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); - debug("%s: accel=%s (%0u/%08x) query=%s (%u/%08x) xor=%08x and=%08x",__FUNCTION__,acckey,accel->key,accel->mods,qkey,keyval,mods,(accel->mods^mods),(accel->mods & mods)); +// debug("%s: accel=%s (%0u/%08x) query=%s (%u/%08x) xor=%08x and=%08x",__FUNCTION__,acckey,accel->key,accel->mods,qkey,keyval,mods,(accel->mods^mods),(accel->mods & mods)); } #endif // DEBUG - - // All of the required mods is "ON"? - if(accel->mods != (mods & accel->mods)) - { - debug("%s: Rejected %08x %08x",__FUNCTION__,accel->mods,(mods & accel->mods)); - return FALSE; - } +*/ return TRUE; } @@ -98,7 +93,7 @@ int rc = ((int (*)(GtkWidget *, gconstpointer)) acel->activate)(terminal, acel->arg); if(rc) - gdk_display_beep(gdk_display_get_default()); + gdk_display_beep(gtk_widget_get_display(terminal)); } diff --git a/src/terminal/mouse.c b/src/terminal/mouse.c index 0693393..b37219c 100644 --- a/src/terminal/mouse.c +++ b/src/terminal/mouse.c @@ -134,7 +134,7 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) if(handled) return; - gdk_display_beep(gdk_display_get_default()); + gdk_display_beep(gtk_widget_get_display(GTK_WIDGET(widget))); } static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event) @@ -215,7 +215,7 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event) v3270_popup_security_dialog(widget); } else { - gdk_display_beep(gdk_display_get_default()); + gdk_display_beep(gtk_widget_get_display(widget)); } } -- libgit2 0.21.2