0c76f22ef1
- bnc#633573 - System fail to boot after running several warm reboot tests 22749-vtd-workarounds.patch - Upstream patches from Jan 22744-ept-pod-locking.patch 22777-vtd-ats-fixes.patch 22781-pod-hap-logdirty.patch 22782-x86-emul-smsw.patch 22789-i386-no-x2apic.patch 22790-svm-resume-migrate-pirqs.patch 22816-x86-pirq-drop-priv-check.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=94
119 lines
3.8 KiB
Diff
119 lines
3.8 KiB
Diff
# HG changeset patch
|
|
# User Ian Jackson <ian.jackson@eu.citrix.com>
|
|
# Date 1284481903 -3600
|
|
# Node ID f71a4c18e34e86e1011662fa42c10ec54bff0688
|
|
# Parent 080b5a094d4e0acab6646125f91f988911409016
|
|
ioemu: fix VNC altgr-insert behavior
|
|
|
|
When access to a Xen DomU (Linux) from a VNC client in Windows, alt-gr
|
|
key is not working properly with Spanish keyboard. When Alt + another
|
|
key pressed, vncserver receives Altgr down, Altgr up and key down
|
|
messages in order, that causes incorrect output.
|
|
|
|
With following patch, when vncerver receives key down message, it
|
|
first check if the keysym needs altgr modifer, if it needs altgr
|
|
modifier but altgr is not 'down', sending altgr keycode before sending
|
|
key keycode.
|
|
|
|
Signed-off-by: Chunyan Liu <cyliu@novell.com>
|
|
|
|
committer: Ian Jackson <Ian.Jackson@eu.citrix.com>
|
|
git-commit-id: f95d202ed6444dacb15fbea4dee185eb0e048d9a
|
|
|
|
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/keymaps.c
|
|
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/keymaps.c
|
|
@@ -51,6 +51,7 @@ typedef struct {
|
|
struct key_range *numlock_range;
|
|
struct key_range *shift_range;
|
|
struct key_range *localstate_range;
|
|
+ struct key_range *altgr_range;
|
|
} kbd_layout_t;
|
|
|
|
static void add_to_key_range(struct key_range **krp, int code) {
|
|
@@ -133,6 +134,10 @@ static kbd_layout_t *parse_keyboard_layo
|
|
add_to_key_range(&k->localstate_range, keycode);
|
|
//fprintf(stderr, "localstate keysym %04x keycode %d\n", keysym, keycode);
|
|
}
|
|
+ if (rest && strstr(rest, "altgr")) {
|
|
+ add_to_key_range(&k->altgr_range, keysym);
|
|
+ //fprintf(stderr, "altgr keysym %04x keycode %d\n", keysym, keycode);
|
|
+ }
|
|
|
|
/* if(keycode&0x80)
|
|
keycode=(keycode<<8)^0x80e0; */
|
|
@@ -233,3 +238,16 @@ static inline int keycode_is_shiftable(v
|
|
return 0;
|
|
return 1;
|
|
}
|
|
+
|
|
+static inline int keysym_is_altgr(void *kbd_layout, int keysym)
|
|
+{
|
|
+ kbd_layout_t *k = kbd_layout;
|
|
+ struct key_range *kr;
|
|
+
|
|
+ for (kr = k->altgr_range; kr; kr = kr->next)
|
|
+ if (keysym >= kr->start && keysym <= kr->end){
|
|
+ return 1;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
Index: xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
===================================================================
|
|
--- xen-4.0.2-testing.orig/tools/ioemu-qemu-xen/vnc.c
|
|
+++ xen-4.0.2-testing/tools/ioemu-qemu-xen/vnc.c
|
|
@@ -1274,12 +1274,27 @@ static void press_key_shift_up(VncState
|
|
}
|
|
}
|
|
|
|
+static void press_key_altgr_down(VncState *vs, int down)
|
|
+{
|
|
+ kbd_put_keycode(0xe0);
|
|
+ if (down){
|
|
+ kbd_put_keycode(0xb8 & 0x7f);
|
|
+ vs->modifiers_state[0xb8] = 1;
|
|
+ }
|
|
+ else {
|
|
+ kbd_put_keycode(0xb8 | 0x80);
|
|
+ vs->modifiers_state[0xb8] = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
static void do_key_event(VncState *vs, int down, uint32_t sym)
|
|
{
|
|
int keycode;
|
|
int shift_keys = 0;
|
|
int shift = 0;
|
|
int keypad = 0;
|
|
+ int altgr = 0;
|
|
+ int altgr_keys = 0;
|
|
|
|
if (is_graphic_console()) {
|
|
if (sym >= 'A' && sym <= 'Z') {
|
|
@@ -1289,8 +1304,11 @@ static void do_key_event(VncState *vs, i
|
|
else {
|
|
shift = keysym_is_shift(vs->kbd_layout, sym & 0xFFFF);
|
|
}
|
|
+
|
|
+ altgr = keysym_is_altgr(vs->kbd_layout, sym & 0xFFFF);
|
|
}
|
|
shift_keys = vs->modifiers_state[0x2a] | vs->modifiers_state[0x36];
|
|
+ altgr_keys = vs->modifiers_state[0xb8];
|
|
|
|
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
|
|
if (keycode == 0) {
|
|
@@ -1357,6 +1375,11 @@ static void do_key_event(VncState *vs, i
|
|
}
|
|
|
|
if (is_graphic_console()) {
|
|
+
|
|
+ if (altgr && !altgr_keys) {
|
|
+ press_key_altgr_down(vs, down);
|
|
+ }
|
|
+
|
|
/* If the shift state needs to change then simulate an additional
|
|
keypress before sending this one. Ignore for non shiftable keys.
|
|
*/
|