Commit 101ba80b338039cd0e67fae16991be75042e8fe4

Authored by Perry Werneck
1 parent 83078a43
Exists in master and in 1 other branch develop

Fixing accelerator engine

using the terminal display for "beeps".
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 }
... ...