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 | } | ... | ... |