ui/gtk.c
diff --git a/ui/gtk.c b/ui/gtk.c
index e96e15435a..f277c0ab36 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -116,7 +116,7 @@
#endif
-#define HOTKEY_MODIFIERS (GDK_CONTROL_MASK | GDK_MOD1_MASK)
+#define HOTKEY_MODIFIERS (GDK_CONTROL_MASK) // | GDK_MOD1_MASK)
static const guint16 *keycode_map;
static size_t keycode_maplen;
@@ -282,7 +282,7 @@ static void gd_update_caption(GtkDisplayState *s)
if (s->ptr_owner != NULL &&
s->ptr_owner->window == NULL) {
- grab = _(" - Press Ctrl+Alt+G to release grab");
+ grab = _(" - Press Ctrl+G to release grab");
}
if (is_paused) {
@@ -1092,6 +1092,11 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
GtkDisplayState *s = vc->s;
int qcode;
+ int handled = 0;
+ int keydown = 0;
+ static int alt_down = 0;
+ static int shift_down = 0;
+
if (s->ignore_keys) {
s->ignore_keys = (key->type == GDK_KEY_PRESS);
return TRUE;
@@ -1118,6 +1123,87 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
qcode = gd_map_keycode(key->hardware_keycode);
+ handled = 0;
+ keydown = (key->type == GDK_KEY_PRESS);
+ //printf("%d, %d, %d\n", key->hardware_keycode, qcode, keydown);
+ switch (qcode) {
+ case 1: // lshift
+ case 2: // rshift
+ shift_down = keydown;
+ break;
+ case 4: // alt
+ handled = 1;
+ alt_down = keydown;
+ return FALSE;
+ case 5: // lctrl
+ break;
+ case 56:
+ if (alt_down) {
+ // '<'
+ qkbd_state_key_event(vc->gfx.kbd, 1, 1);
+ qkbd_state_key_event(vc->gfx.kbd, 56, keydown);
+ qkbd_state_key_event(vc->gfx.kbd, 1, 0);
+ handled = 1;
+ }
+ else if (shift_down) {
+ // '<'
+ qkbd_state_key_event(vc->gfx.kbd, 1, 0);
+ qkbd_state_key_event(vc->gfx.kbd, 45, keydown);
+ handled = 1;
+ }
+ break;
+ case 57:
+ if (alt_down) {
+ // '>'
+ qkbd_state_key_event(vc->gfx.kbd, 1, 1);
+ qkbd_state_key_event(vc->gfx.kbd, 57, keydown);
+ qkbd_state_key_event(vc->gfx.kbd, 1, 0);
+ handled = 1;
+ }
+ break;
+ case 43:
+ if (alt_down) {
+ // '['
+ qkbd_state_key_event(vc->gfx.kbd, 33, keydown);
+ handled = 1;
+ }
+ break;
+ case 44:
+ if (alt_down) {
+ // ']'
+ qkbd_state_key_event(vc->gfx.kbd, 34, keydown);
+ handled = 1;
+ }
+ break;
+ case 46:
+ if (alt_down) {
+ // '`'
+ qkbd_state_key_event(vc->gfx.kbd, 47, keydown);
+ handled = 1;
+ }
+ break;
+ case 58:
+ if (alt_down) {
+ // '\'
+ qkbd_state_key_event(vc->gfx.kbd, 48, keydown);
+ handled = 1;
+ }
+ break;
+ case 9:
+ if (alt_down) {
+ // '|'
+ qkbd_state_key_event(vc->gfx.kbd, 1, 1);
+ qkbd_state_key_event(vc->gfx.kbd, 48, keydown);
+ qkbd_state_key_event(vc->gfx.kbd, 1, 0);
+ handled = 1;
+ }
+ break;
+ }
+
+ if (handled) {
+ return TRUE;
+ }
+
trace_gd_key_event(vc->label, key->hardware_keycode, qcode,
(key->type == GDK_KEY_PRESS) ? "down" : "up");