56 lines
2.0 KiB
Diff
56 lines
2.0 KiB
Diff
|
From 87164237f308f856e2429044f88f7fe61243f745 Mon Sep 17 00:00:00 2001
|
||
|
From: Chunyan Liu <cyliu@suse.com>
|
||
|
Date: Thu, 3 Mar 2016 16:48:17 +0800
|
||
|
Subject: [PATCH] Fix tigervnc long press issue
|
||
|
|
||
|
Using xen tools 'xl vncviewer' with tigervnc (default on SLE-12),
|
||
|
found that: the display of the guest is unexpected while keep
|
||
|
pressing a key. We expect the same character multiple times, but
|
||
|
it prints only one time. This happens on a PV guest in text mode.
|
||
|
|
||
|
After debugging, found that tigervnc sends repeated key down events
|
||
|
in this case, to differentiate from user pressing the same key many
|
||
|
times. Vnc server only prints the character when it finally receives
|
||
|
key up event.
|
||
|
|
||
|
To solve this issue, this patch tries to add additional key up event
|
||
|
before the next repeated key down event (if the key is not a control
|
||
|
key).
|
||
|
|
||
|
[CYL: BSC#882405]
|
||
|
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
||
|
---
|
||
|
ui/vnc.c | 19 +++++++++++++++++++
|
||
|
1 file changed, 19 insertions(+)
|
||
|
|
||
|
diff --git a/ui/vnc.c b/ui/vnc.c
|
||
|
index 8d0c16b23f..392c466dad 100644
|
||
|
--- a/ui/vnc.c
|
||
|
+++ b/ui/vnc.c
|
||
|
@@ -1770,6 +1770,25 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
||
|
if (down)
|
||
|
vs->modifiers_state[keycode] ^= 1;
|
||
|
break;
|
||
|
+ default:
|
||
|
+ if (qemu_console_is_graphic(NULL)) {
|
||
|
+ /* record key 'down' info. Some client like tigervnc
|
||
|
+ * will send key down repeatedly if user pressing a
|
||
|
+ * a key for long time. In this case, we should add
|
||
|
+ * additional key up event before repeated key down,
|
||
|
+ * so that it can display the key multiple times.
|
||
|
+ */
|
||
|
+ if (down) {
|
||
|
+ if (vs->modifiers_state[keycode]) {
|
||
|
+ /* add a key up event */
|
||
|
+ do_key_event(vs, 0, keycode, sym);
|
||
|
+ }
|
||
|
+ vs->modifiers_state[keycode] = 1;
|
||
|
+ } else {
|
||
|
+ vs->modifiers_state[keycode] = 0;
|
||
|
+ }
|
||
|
+ }
|
||
|
+ break;
|
||
|
}
|
||
|
|
||
|
/* Turn off the lock state sync logic if the client support the led
|