46 lines
1.8 KiB
Diff
46 lines
1.8 KiB
Diff
|
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)
|
||
|
|
||
|
Index: xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||
|
===================================================================
|
||
|
--- xen-4.2.0-testing.orig/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||
|
+++ xen-4.2.0-testing/tools/qemu-xen-traditional-dir-remote/vnc.c
|
||
|
@@ -1440,6 +1440,9 @@ static void key_event(VncState *vs, int
|
||
|
int keycode;
|
||
|
int shift = 0;
|
||
|
|
||
|
+ if ( sym == 0xffea && keyboard_layout && !strcmp(keyboard_layout,"es") )
|
||
|
+ sym = 0xffe9;
|
||
|
+
|
||
|
if (sym >= 'A' && sym <= 'Z' && is_graphic_console()) {
|
||
|
sym = sym - 'A' + 'a';
|
||
|
shift = 1;
|