Index: new/ui/vnc.c
===================================================================
---- new.orig/ui/vnc.c 2012-09-24 07:15:00.000000000 +0200
-+++ new/ui/vnc.c 2012-09-24 07:15:22.000000000 +0200
-@@ -1496,6 +1496,10 @@
+--- new.orig/ui/vnc.c 2014-11-20 06:45:06.000000000 +0100
++++ new/ui/vnc.c 2014-11-20 06:50:51.000000000 +0100
+@@ -1633,6 +1633,10 @@
static void do_key_event(VncState *vs, int down, int keycode, int sym)
{
/* QEMU console switch */
switch(keycode) {
case 0x2a: /* Left Shift */
-@@ -1566,12 +1570,42 @@
+@@ -1712,7 +1716,24 @@
}
- if (is_graphic_console()) {
+ if (qemu_console_is_graphic(NULL)) {
+
+ /* our java vnc client never sends ALTGR, so we create
+ an artificial up/down event */
+ !vs->modifiers_state[0xb8];
+
+ if (emul_altgr) {
-+ reset_keys(vs);
-+ kbd_put_keycode(SCANCODE_EMUL0);
-+ kbd_put_keycode(0xb8 & SCANCODE_KEYCODEMASK);
++ reset_keys(vs);
++ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, true);
+ }
+
-+ int emul_shift = (mods & SCANCODE_SHIFT) &&
-+ !vs->modifiers_state[0x2a];
-+
-+ if (emul_shift) {
-+ kbd_put_keycode(0x2a & SCANCODE_KEYCODEMASK);
-+ }
-+
- if (keycode & SCANCODE_GREY)
- kbd_put_keycode(SCANCODE_EMUL0);
- if (down)
- kbd_put_keycode(keycode & SCANCODE_KEYCODEMASK);
- else
- kbd_put_keycode(keycode | SCANCODE_UP);
-+
-+ if (emul_shift) {
-+ kbd_put_keycode(0x2a | SCANCODE_UP);
-+ }
+ qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
+
+ if (emul_altgr) {
-+ kbd_put_keycode(SCANCODE_EMUL0);
-+ kbd_put_keycode(0xb8 | SCANCODE_UP);
++ qemu_input_event_send_key_number(vs->vd->dcl.con, 0xb8, false);
+ }
+
} else {
bool numlock = vs->modifiers_state[0x45];
bool control = (vs->modifiers_state[0x1d] ||
-@@ -1708,7 +1742,8 @@
+@@ -1851,7 +1872,8 @@
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);
}
+@@ -3046,7 +3068,7 @@
+ char *vnc_display_local_addr(DisplayState *ds)
+ {
+ VncDisplay *vs = vnc_display;
+-
++
+ return vnc_socket_local_addr("%s:%s", vs->lsock);
+ }