66 lines
2.0 KiB
Diff
66 lines
2.0 KiB
Diff
From 8c4c8041d0cb8523af453e1d1a8408215db6964f Mon Sep 17 00:00:00 2001
|
|
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
|
|
Date: Wed, 9 Dec 2015 14:17:38 +0100
|
|
Subject: [PATCH 15/28] vnc: altgr emulation
|
|
|
|
---
|
|
ui/vnc.c | 26 +++++++++++++++++++++++++-
|
|
1 file changed, 25 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/ui/vnc.c b/ui/vnc.c
|
|
index 349cfc9d86..9c8ab42eea 100644
|
|
--- a/ui/vnc.c
|
|
+++ b/ui/vnc.c
|
|
@@ -1631,6 +1631,10 @@ static void kbd_leds(void *opaque, int ledstate)
|
|
|
|
static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|
{
|
|
+ int mods = keycode & 0xf00;
|
|
+
|
|
+ keycode &= SCANCODE_KEYMASK;
|
|
+
|
|
/* QEMU console switch */
|
|
switch(keycode) {
|
|
case 0x2a: /* Left Shift */
|
|
@@ -1711,8 +1715,27 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|
}
|
|
|
|
if (qemu_console_is_graphic(NULL)) {
|
|
+
|
|
+ /* our java vnc client never sends ALTGR, so we create
|
|
+ an artificial up/down event */
|
|
+
|
|
+ int emul_altgr = (mods & SCANCODE_ALTGR) &&
|
|
+ !vs->modifiers_state[0xb8];
|
|
+
|
|
+ if (emul_altgr) {
|
|
+ reset_keys(vs);
|
|
+ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, true);
|
|
+ qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
|
|
+ }
|
|
+
|
|
qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
|
|
qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
|
|
+
|
|
+ if (emul_altgr) {
|
|
+ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, false);
|
|
+ qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
|
|
+ }
|
|
+
|
|
} else {
|
|
bool numlock = vs->modifiers_state[0x45];
|
|
bool control = (vs->modifiers_state[0x1d] ||
|
|
@@ -1852,7 +1875,8 @@ static void key_event(VncState *vs, int down, uint32_t sym)
|
|
lsym = lsym - 'A' + 'a';
|
|
}
|
|
|
|
- keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF) & SCANCODE_KEYMASK;
|
|
+ keycode = keysym2scancode(vs->vd->kbd_layout, lsym & 0xFFFF);
|
|
+
|
|
trace_vnc_key_event_map(down, sym, keycode, code2name(keycode));
|
|
do_key_event(vs, down, keycode, sym);
|
|
}
|
|
--
|
|
2.11.0
|
|
|