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,15 +86,27 @@
86 86
87 static gboolean check_keypress(v3270 *widget, const GdkEventKey *event) 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 // From gtk_accelerator_name at https://gitlab.gnome.org/GNOME/gtk/blob/master/gtk/gtkaccelgroup.c 91 // From gtk_accelerator_name at https://gitlab.gnome.org/GNOME/gtk/blob/master/gtk/gtkaccelgroup.c
92 // Side steps issue from https://mail.gnome.org/archives/gtk-app-devel-list/2007-August/msg00053.html 92 // Side steps issue from https://mail.gnome.org/archives/gtk-app-devel-list/2007-August/msg00053.html
93 guint keyval = gdk_keyval_to_lower(event->keyval); 93 guint keyval = gdk_keyval_to_lower(event->keyval);
94 94
95 // Add virtual modifiers to event state. 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 // Check if the application can handle the key. 111 // Check if the application can handle the key.
100 gboolean handled = FALSE; 112 gboolean handled = FALSE;
@@ -103,14 +115,17 @@ @@ -103,14 +115,17 @@
103 v3270_widget_signal[V3270_SIGNAL_KEYPRESS], 115 v3270_widget_signal[V3270_SIGNAL_KEYPRESS],
104 0, 116 0,
105 keyval, 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 &handled 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 if(handled) 123 if(handled)
112 return TRUE; 124 return TRUE;
113 125
  126 + if(!gtk_accelerator_valid(keyval,state))
  127 + return FALSE;
  128 +
114 // 129 //
115 // Check for accelerator. 130 // Check for accelerator.
116 // 131 //
@@ -131,7 +146,8 @@ @@ -131,7 +146,8 @@
131 146
132 if(pfcode > 0 && pfcode < 25) 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 return TRUE; 151 return TRUE;
136 } 152 }
137 else 153 else
@@ -144,16 +160,6 @@ @@ -144,16 +160,6 @@
144 gboolean handled = FALSE; 160 gboolean handled = FALSE;
145 const V3270Accelerator * accel; 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 g_signal_emit( 163 g_signal_emit(
158 GTK_WIDGET(widget), 164 GTK_WIDGET(widget),
159 v3270_widget_signal[V3270_SIGNAL_KEYPRESS], 165 v3270_widget_signal[V3270_SIGNAL_KEYPRESS],
src/terminal/keyboard/accelerator.c
@@ -60,14 +60,14 @@ @@ -60,14 +60,14 @@
60 { 60 {
61 // Problems: 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 // It's the same key? 65 // It's the same key?
66 if(accel->key != keyval) 66 if(accel->key != keyval)
67 { 67 {
68 g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); 68 g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods);
69 g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); 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 return FALSE; 71 return FALSE;
72 } 72 }
73 73
@@ -75,20 +75,15 @@ @@ -75,20 +75,15 @@
75 if(accel->mods == mods) 75 if(accel->mods == mods)
76 return TRUE; 76 return TRUE;
77 77
  78 +/*
78 #ifdef DEBUG 79 #ifdef DEBUG
79 { 80 {
80 g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods); 81 g_autofree gchar * acckey = gtk_accelerator_name(accel->key,accel->mods);
81 g_autofree gchar * qkey = gtk_accelerator_name(keyval,mods); 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 #endif // DEBUG 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 return TRUE; 88 return TRUE;
94 } 89 }
@@ -98,7 +93,7 @@ @@ -98,7 +93,7 @@
98 int rc = ((int (*)(GtkWidget *, gconstpointer)) acel->activate)(terminal, acel->arg); 93 int rc = ((int (*)(GtkWidget *, gconstpointer)) acel->activate)(terminal, acel->arg);
99 94
100 if(rc) 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,7 +134,7 @@ void v3270_emit_popup(v3270 *widget, int baddr, GdkEventButton *event)
134 if(handled) 134 if(handled)
135 return; 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 static V3270_OIA_FIELD get_field_from_event(v3270 *widget, GdkEventButton *event) 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,7 +215,7 @@ gboolean v3270_button_release_event(GtkWidget *widget, GdkEventButton*event)
215 v3270_popup_security_dialog(widget); 215 v3270_popup_security_dialog(widget);
216 216
217 } else { 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 }