2017-04-18 23:27:52 +02:00
|
|
|
From 9a1592929ad4ab1cee093fa5fe9f1693b8551783 Mon Sep 17 00:00:00 2001
|
2017-03-15 20:38:55 +01:00
|
|
|
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
|
2017-04-12 21:10:15 +02:00
|
|
|
index 486d2759e4..51d6f2353f 100644
|
2017-03-15 20:38:55 +01:00
|
|
|
--- a/ui/vnc.c
|
|
|
|
+++ b/ui/vnc.c
|
2017-04-12 21:10:15 +02:00
|
|
|
@@ -1668,6 +1668,25 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
2017-03-15 20:38:55 +01:00
|
|
|
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
|