Commit 1ff5eedd authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

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: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 86846bfe
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -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;
    }
    for (i = 0; i < count; i++) {
        slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++;
    hs->kbd.keycodes[slot] = keycode;
        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");
+2 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
#define QEMU_HID_H

#include "migration/vmstate.h"
#include "ui/input.h"

#define HID_MOUSE     1
#define HID_TABLET    2
@@ -31,7 +32,6 @@ typedef struct HIDKeyboardState {
    uint8_t leds;
    uint8_t key[16];
    int32_t keys;
    QEMUPutKbdEntry *eh_entry;
} HIDKeyboardState;

struct HIDState {
@@ -47,6 +47,7 @@ struct HIDState {
    bool idle_pending;
    QEMUTimer *idle_timer;
    HIDEventFunc event;
    QemuInputHandlerState *s;
};

void hid_init(HIDState *hs, int kind, HIDEventFunc event);