2010-10-20 23:00:35 +02:00
|
|
|
When access domU from Windows VNC client, spanish keyboard altgr key
|
|
|
|
doesn't work. According to log info, we found that the keycodes passed
|
|
|
|
from vncclient to qemu vncserver have something wrong. When altgr and "2"
|
|
|
|
pressed, keycodes vncserver receives are:
|
|
|
|
ALT_R down,
|
|
|
|
CTRL_L down,
|
|
|
|
CTRL_L up,
|
|
|
|
ATL_R up,
|
|
|
|
"2" down,
|
|
|
|
"2" up,
|
|
|
|
...
|
|
|
|
Since when send "2" down, there is no altgr modifier, the char displayed
|
|
|
|
on screen will be "2" but not "@".
|
|
|
|
|
|
|
|
To solve this problem, there is another patch applied by upstream which
|
|
|
|
sends an additional altgr modifier before "2" down in the above case.
|
|
|
|
It works well when domU is windows, but on sles10 sp3 domU, sometimes it
|
|
|
|
display "@" and sometimes it still displays "2", especially when press
|
|
|
|
altgr+2 continuously.
|
|
|
|
|
|
|
|
For the sles10 sp3 domU problem, maybe because there are two many alt_r (same
|
|
|
|
keycode as altgr on "es") up and down events and the domU OS couldn't handle
|
|
|
|
it well.
|
|
|
|
|
|
|
|
To furtherly solve this problem, I write this patch, when vncserver
|
|
|
|
is "es" and receives a alt_r keysym (this is already abnormal since "es" has
|
|
|
|
no alt_r), then treat the alt_r as alt_l. This can avoid too many altgr
|
|
|
|
keycodes up and down events and make sure the intentionally added altgr keycode can take effect.
|
|
|
|
|
|
|
|
Signed-off by Chunyan Liu (cyliu@novell.com)
|
|
|
|
|
2011-09-15 23:43:21 +02:00
|
|
|
Index: xen-4.1.2-testing/tools/ioemu-qemu-xen/vnc.c
|
2011-01-14 19:24:51 +01:00
|
|
|
===================================================================
|
2011-09-15 23:43:21 +02:00
|
|
|
--- xen-4.1.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
|
|
|
+++ xen-4.1.2-testing/tools/ioemu-qemu-xen/vnc.c
|
2011-01-14 19:24:51 +01:00
|
|
|
@@ -1308,6 +1308,9 @@ static void do_key_event(VncState *vs, i
|
2010-10-20 23:00:35 +02:00
|
|
|
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
|
|
|
altgr_keys = vs->modifiers_state[0xb8];
|
|
|
|
|
|
|
|
+ if ( !strcmp(keyboard_layout,"es") && sym == 0xffea )
|
|
|
|
+ sym = 0xffe9;
|
|
|
|
+
|
|
|
|
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
|
|
|
|
if (keycode == 0) {
|
|
|
|
fprintf(stderr, "Key lost : keysym=0x%x(%d)\n", sym, sym);
|