Pārlūkot izejas kodu

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>
Daniel P. Berrange 8 gadi atpakaļ
vecāks
revīzija
e92316ad30
1 mainītis faili ar 13 papildinājumiem un 19 dzēšanām
  1. 13 19
      ui/spice-input.c

+ 13 - 19
ui/spice-input.c

@@ -50,6 +50,7 @@ static const SpiceKbdInterface kbd_interface = {
 
 
 static void kbd_push_key(SpiceKbdInstance *sin, uint8_t scancode)
 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);
     QemuSpiceKbd *kbd = container_of(sin, QemuSpiceKbd, sin);
     int keycode;
     int keycode;
     bool up;
     bool up;
@@ -58,32 +59,25 @@ static void kbd_push_key(SpiceKbdInstance *sin, uint8_t scancode)
         kbd->emul0 = true;
         kbd->emul0 = true;
         return;
         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++;
         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;
             kbd->pauseseq = 0;
-            return;
         }
         }
+        return;
+    } else {
         kbd->pauseseq = 0;
         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);
     qemu_input_event_send_key_number(NULL, keycode, !up);
 }
 }