aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2017-07-27 18:46:40 +0100
committerGerd Hoffmann <kraxel@redhat.com>2017-07-28 12:35:40 +0200
commite92316ad3074aaf13bced21f03c98969ca6f73a9 (patch)
treeed01c667a6fd3285b3d1efff0b7c9b7dfc99f099
parente01151de165070c25a1b202e9e2392950bd7c8da (diff)
downloadqemu-e92316ad3074aaf13bced21f03c98969ca6f73a9.zip
qemu-e92316ad3074aaf13bced21f03c98969ca6f73a9.tar.gz
qemu-e92316ad3074aaf13bced21f03c98969ca6f73a9.tar.bz2
ui: correctly detect spice PAUSE scancode sequence
The SPICE input code is currently detcting 0xe1 0x1d 0x45 as the PAUSE key make sequence and 0xe1 0x9d 0xc5 as the break sequence. This is incorrect, because all 6 scancodes together are the make sequence, and there is no break sequence. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20170727174640.30359-1-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--ui/spice-input.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/ui/spice-input.c b/ui/spice-input.c
index cda9976..3d41aa1 100644
--- a/ui/spice-input.c
+++ b/ui/spice-input.c
@@ -50,6 +50,7 @@ static const SpiceKbdInterface kbd_interface = {
static void kbd_push_key(SpiceKbdInstance *sin, uint8_t scancode)
{
+ static const uint8_t pauseseq[] = { 0xe1, 0x1d, 0x45, 0xe1, 0x9d, 0xc5 };
QemuSpiceKbd *kbd = container_of(sin, QemuSpiceKbd, sin);
int keycode;
bool up;
@@ -58,32 +59,25 @@ static void kbd_push_key(SpiceKbdInstance *sin, uint8_t scancode)
kbd->emul0 = true;
return;
}
- keycode = scancode & ~SCANCODE_UP;
- up = scancode & SCANCODE_UP;
- if (kbd->emul0) {
- kbd->emul0 = false;
- keycode |= SCANCODE_GREY;
- }
- if (scancode == SCANCODE_EMUL1) {
+ if (scancode == pauseseq[kbd->pauseseq]) {
kbd->pauseseq++;
- return;
- } else if (kbd->pauseseq == 1) {
- if (keycode == 0x1d) {
- kbd->pauseseq++;
- return;
- } else {
- kbd->pauseseq = 0;
- }
- } else if (kbd->pauseseq == 2) {
- if (keycode == 0x45) {
- qemu_input_event_send_key_qcode(NULL, Q_KEY_CODE_PAUSE, !up);
+ if (kbd->pauseseq == G_N_ELEMENTS(pauseseq)) {
+ qemu_input_event_send_key_qcode(NULL, Q_KEY_CODE_PAUSE, true);
kbd->pauseseq = 0;
- return;
}
+ return;
+ } else {
kbd->pauseseq = 0;
}
+ keycode = scancode & ~SCANCODE_UP;
+ up = scancode & SCANCODE_UP;
+ if (kbd->emul0) {
+ kbd->emul0 = false;
+ keycode |= SCANCODE_GREY;
+ }
+
qemu_input_event_send_key_number(NULL, keycode, !up);
}