summary refs log tree commit diff stats
path: root/hw/input/hid.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2014-03-11 13:52:27 +0100
committerGerd Hoffmann <kraxel@redhat.com>2014-05-26 08:42:43 +0200
commit1ff5eedd1d0facf94b2f272058b83856b361b079 (patch)
tree2e10692c0c1a03df63262483b6c604f851356479 /hw/input/hid.c
parent86846bfe64a0104df081226711804b8517258108 (diff)
downloadfocaccia-qemu-1ff5eedd1d0facf94b2f272058b83856b361b079.tar.gz
focaccia-qemu-1ff5eedd1d0facf94b2f272058b83856b361b079.zip
input: switch hid keyboard to new input layer api.
Minimal patch to get the switchover done.  We continue processing ps/2
scancodes for now as they are part of the live migration stream.  Fixing
that, then mapping directly from QKeyValue to HID keycodes is left as
excercise for another day.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/input/hid.c')
-rw-r--r--hw/input/hid.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/hw/input/hid.c b/hw/input/hid.c
index bb0fa6a619..ff75e41a46 100644
--- a/hw/input/hid.c
+++ b/hw/input/hid.c
@@ -158,17 +158,24 @@ static void hid_pointer_event(void *opaque,
     hs->event(hs);
 }
 
-static void hid_keyboard_event(void *opaque, int keycode)
+static void hid_keyboard_event(DeviceState *dev, QemuConsole *src,
+                               InputEvent *evt)
 {
-    HIDState *hs = opaque;
+    HIDState *hs = (HIDState *)dev;
+    int scancodes[3], i, count;
     int slot;
 
-    if (hs->n == QUEUE_LENGTH) {
+    count = qemu_input_key_value_to_scancode(evt->key->key,
+                                             evt->key->down,
+                                             scancodes);
+    if (hs->n + count > QUEUE_LENGTH) {
         fprintf(stderr, "usb-kbd: warning: key event queue full\n");
         return;
     }
-    slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++;
-    hs->kbd.keycodes[slot] = keycode;
+    for (i = 0; i < count; i++) {
+        slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++;
+        hs->kbd.keycodes[slot] = scancodes[i];
+    }
     hs->event(hs);
 }
 
@@ -415,7 +422,7 @@ void hid_free(HIDState *hs)
 {
     switch (hs->kind) {
     case HID_KEYBOARD:
-        qemu_remove_kbd_event_handler(hs->kbd.eh_entry);
+        qemu_input_handler_unregister(hs->s);
         break;
     case HID_MOUSE:
     case HID_TABLET:
@@ -425,13 +432,21 @@ void hid_free(HIDState *hs)
     hid_del_idle_timer(hs);
 }
 
+static QemuInputHandler hid_keyboard_handler = {
+    .name  = "QEMU HID Keyboard",
+    .mask  = INPUT_EVENT_MASK_KEY,
+    .event = hid_keyboard_event,
+};
+
 void hid_init(HIDState *hs, int kind, HIDEventFunc event)
 {
     hs->kind = kind;
     hs->event = event;
 
     if (hs->kind == HID_KEYBOARD) {
-        hs->kbd.eh_entry = qemu_add_kbd_event_handler(hid_keyboard_event, hs);
+        hs->s = qemu_input_handler_register((DeviceState *)hs,
+                                            &hid_keyboard_handler);
+        qemu_input_handler_activate(hs->s);
     } else if (hs->kind == HID_MOUSE) {
         hs->ptr.eh_entry = qemu_add_mouse_event_handler(hid_pointer_event, hs,
                                                         0, "QEMU HID Mouse");