Commit 101ba80b338039cd0e67fae16991be75042e8fe4
1 parent
83078a43
Exists in
master
and in
1 other branch
Fixing accelerator engine
using the terminal display for "beeps".
Showing
3 changed files
with
30 additions
and
29 deletions
Show diff stats
src/terminal/keyboard.c
| ... | ... | @@ -86,15 +86,27 @@ |
| 86 | 86 | |
| 87 | 87 | static gboolean check_keypress(v3270 *widget, const GdkEventKey *event) |
| 88 | 88 | { |
| 89 | - GdkKeymap * keymap = gdk_keymap_get_for_display(gtk_widget_get_display(GTK_WIDGET(widget))); | |
| 89 | + //GdkKeymap * keymap = gdk_keymap_get_for_display(gtk_widget_get_display(GTK_WIDGET(widget))); | |
| 90 | 90 | |
| 91 | 91 | // From gtk_accelerator_name at https://gitlab.gnome.org/GNOME/gtk/blob/master/gtk/gtkaccelgroup.c |
| 92 | 92 | // Side steps issue from https://mail.gnome.org/archives/gtk-app-devel-list/2007-August/msg00053.html |
| 93 | 93 | guint keyval = gdk_keyval_to_lower(event->keyval); |
| 94 | 94 | |
| 95 | 95 | // Add virtual modifiers to event state. |
| 96 | - GdkModifierType state = event->state & ~GDK_RELEASE_MASK; | |
| 97 | - gdk_keymap_add_virtual_modifiers(keymap,&state); | |
| 96 | + GdkModifierType state = event->state & GDK_MODIFIER_MASK; | |
| 97 | + // gdk_keymap_add_virtual_modifiers(keymap,&state); | |
| 98 | + | |
| 99 | +/* | |
| 100 | +#ifdef WIN32 | |
| 101 | + // FIXME (perry#1#): Find a better way! | |
| 102 | + if( event->keyval == 0xffffff && event->hardware_keycode == 0x0013) | |
| 103 | + keyval = GDK_Pause; | |
| 104 | + | |
| 105 | + // Windows sets <ctrl> in left/right control | |
| 106 | + else if(state & GDK_CONTROL_MASK && (keyval == GDK_Control_R || keyval == GDK_Control_L)) | |
| 107 | + state &= ~GDK_CONTROL_MASK; | |
| 108 | +#endif | |
| 109 | +*/ | |
| 98 | 110 | |
| 99 | 111 | // Check if the application can handle the key. |
| 100 | 112 | gboolean handled = FALSE; |
| ... | ... | @@ -103,14 +115,17 @@ |
| 103 | 115 | v3270_widget_signal[V3270_SIGNAL_KEYPRESS], |
| 104 | 116 | 0, |
| 105 | 117 | keyval, |
| 106 | - state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK), // FIXME: Remove the reset flags after the main application update. | |
| 118 | + event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_ALT_MASK), // FIXME: use the processed state after the main application update. | |
| 107 | 119 | &handled |
| 108 | 120 | ); |
| 109 | 121 | |
| 110 | - debug("Keyboard action was %s (keyval=%08x state=%08x)",handled ? "Handled" : "Not handled",event->keyval,event->state); | |
| 122 | + //debug("Keyboard action was %s (keyval=%08x state=%08x)",handled ? "Handled" : "Not handled",event->keyval,event->state); | |
| 111 | 123 | if(handled) |
| 112 | 124 | return TRUE; |
| 113 | 125 | |
| 126 | + if(!gtk_accelerator_valid(keyval,state)) | |
| 127 | + return FALSE; | |
| 128 | + | |
| 114 | 129 | // |
| 115 | 130 | // Check for accelerator. |
| 116 | 131 | // |
| ... | ... | @@ -131,7 +146,8 @@ |
| 131 | 146 | |
| 132 | 147 | if(pfcode > 0 && pfcode < 25) |
| 133 | 148 | { |
| 134 | - lib3270_pfkey(widget->host,pfcode); | |
| 149 | + if(lib3270_pfkey(widget->host,pfcode)) | |
| 150 | + gdk_display_beep(gtk_widget_get_display(GTK_WIDGET(widget))); | |
| 135 | 151 | return TRUE; |
| 136 | 152 | } |
| 137 | 153 | else |
| ... | ... | @@ -144,16 +160,6 @@ |
| 144 | 160 | gboolean handled = FALSE; |
| 145 | 161 | const V3270Accelerator * accel; |
| 146 | 162 | |
| 147 | -#ifdef WIN32 | |
| 148 | - // FIXME (perry#1#): Find a better way! | |
| 149 | - if( event->keyval == 0xffffff && event->hardware_keycode == 0x0013) | |
| 150 | - event->keyval = GDK_Pause; | |
| 151 | - | |
| 152 | - // Windows sets <ctrl> in left/right control | |
| 153 | - else if(event->state & GDK_CONTROL_MASK && (event->keyval == GDK_Control_R || event->keyval == GDK_Control_L)) | |
| 154 | - event->state &= ~GDK_CONTROL_MASK; | |
| 155 | -#endif | |
| 156 | - | |
| 157 | 163 | g_signal_emit( |
| 158 | 164 | GTK_WIDGET(widget), |
| 159 | 165 | v3270_widget_signal[V3270_SIGNAL_KEYPRESS], | ... | ... |
src/terminal/keyboard/accelerator.c
| ... | ... | @@ -60,14 +60,14 @@ |
| 60 | 60 | { |
| 61 | 61 | // Problems: |
| 62 | 62 | |
| 63 | - debug("%s: keys: %08x %08x",__FUNCTION__,accel->key,keyval); | |
| 63 | +// debug("%s: keys: %08x %08x",__FUNCTION__,accel->key,keyval); | |
| 64 | 64 | |
| 65 | 65 | // It's the same key? |
| 66 | 66 | if(accel->key != keyval) |
| 67 | 67 | { |
| 68 | 68 | g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); |
| 69 | 69 | g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); |
| 70 | - debug("%s: Rejected by key %08x %08x (%s %s)",__FUNCTION__,accel->key,keyval,acckey,qkey); | |
| 70 | +// debug("%s: Rejected by key %08x %08x (%s %s)",__FUNCTION__,accel->key,keyval,acckey,qkey); | |
| 71 | 71 | return FALSE; |
| 72 | 72 | } |
| 73 | 73 | |
| ... | ... | @@ -75,20 +75,15 @@ |
| 75 | 75 | if(accel->mods == mods) |
| 76 | 76 | return TRUE; |
| 77 | 77 | |
| 78 | +/* | |
| 78 | 79 | #ifdef DEBUG |
| 79 | 80 | { |
| 80 | 81 | g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); |
| 81 | 82 | g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); |
| 82 | - 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)); | |
| 83 | +// 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)); | |
| 83 | 84 | } |
| 84 | 85 | #endif // DEBUG |
| 85 | - | |
| 86 | - // All of the required mods is "ON"? | |
| 87 | - if(accel->mods != (mods & accel->mods)) | |
| 88 | - { | |
| 89 | - debug("%s: Rejected %08x %08x",__FUNCTION__,accel->mods,(mods & accel->mods)); | |
| 90 | - return FALSE; | |
| 91 | - } | |
| 86 | +*/ | |
| 92 | 87 | |
| 93 | 88 | return TRUE; |
| 94 | 89 | } |
| ... | ... | @@ -98,7 +93,7 @@ |
| 98 | 93 | int rc = ((int (*)(GtkWidget *, gconstpointer)) acel->activate)(terminal, acel->arg); |
| 99 | 94 | |
| 100 | 95 | if(rc) |
| 101 | - gdk_display_beep(gdk_display_get_default()); | |
| 96 | + gdk_display_beep(gtk_widget_get_display(terminal)); | |
| 102 | 97 | |
| 103 | 98 | } |
| 104 | 99 | ... | ... |
src/terminal/mouse.c
| ... | ... | @@ -134,7 +134,7 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event) |
| 134 | 134 | if(handled) |
| 135 | 135 | return; |
| 136 | 136 | |
| 137 | - gdk_display_beep(gdk_display_get_default()); | |
| 137 | + gdk_display_beep(gtk_widget_get_display(GTK_WIDGET(widget))); | |
| 138 | 138 | } |
| 139 | 139 | |
| 140 | 140 | 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) |
| 215 | 215 | v3270_popup_security_dialog(widget); |
| 216 | 216 | |
| 217 | 217 | } else { |
| 218 | - gdk_display_beep(gdk_display_get_default()); | |
| 218 | + gdk_display_beep(gtk_widget_get_display(widget)); | |
| 219 | 219 | } |
| 220 | 220 | |
| 221 | 221 | } | ... | ... |