mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
86846bfe64
commit
1ff5eedd1d
|
@ -158,17 +158,24 @@ static void hid_pointer_event(void *opaque,
|
||||||
hs->event(hs);
|
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;
|
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");
|
fprintf(stderr, "usb-kbd: warning: key event queue full\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++;
|
for (i = 0; i < count; i++) {
|
||||||
hs->kbd.keycodes[slot] = keycode;
|
slot = (hs->head + hs->n) & QUEUE_MASK; hs->n++;
|
||||||
|
hs->kbd.keycodes[slot] = scancodes[i];
|
||||||
|
}
|
||||||
hs->event(hs);
|
hs->event(hs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,7 +422,7 @@ void hid_free(HIDState *hs)
|
||||||
{
|
{
|
||||||
switch (hs->kind) {
|
switch (hs->kind) {
|
||||||
case HID_KEYBOARD:
|
case HID_KEYBOARD:
|
||||||
qemu_remove_kbd_event_handler(hs->kbd.eh_entry);
|
qemu_input_handler_unregister(hs->s);
|
||||||
break;
|
break;
|
||||||
case HID_MOUSE:
|
case HID_MOUSE:
|
||||||
case HID_TABLET:
|
case HID_TABLET:
|
||||||
|
@ -425,13 +432,21 @@ void hid_free(HIDState *hs)
|
||||||
hid_del_idle_timer(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)
|
void hid_init(HIDState *hs, int kind, HIDEventFunc event)
|
||||||
{
|
{
|
||||||
hs->kind = kind;
|
hs->kind = kind;
|
||||||
hs->event = event;
|
hs->event = event;
|
||||||
|
|
||||||
if (hs->kind == HID_KEYBOARD) {
|
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) {
|
} else if (hs->kind == HID_MOUSE) {
|
||||||
hs->ptr.eh_entry = qemu_add_mouse_event_handler(hid_pointer_event, hs,
|
hs->ptr.eh_entry = qemu_add_mouse_event_handler(hid_pointer_event, hs,
|
||||||
0, "QEMU HID Mouse");
|
0, "QEMU HID Mouse");
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define QEMU_HID_H
|
#define QEMU_HID_H
|
||||||
|
|
||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
|
#include "ui/input.h"
|
||||||
|
|
||||||
#define HID_MOUSE 1
|
#define HID_MOUSE 1
|
||||||
#define HID_TABLET 2
|
#define HID_TABLET 2
|
||||||
|
@ -31,7 +32,6 @@ typedef struct HIDKeyboardState {
|
||||||
uint8_t leds;
|
uint8_t leds;
|
||||||
uint8_t key[16];
|
uint8_t key[16];
|
||||||
int32_t keys;
|
int32_t keys;
|
||||||
QEMUPutKbdEntry *eh_entry;
|
|
||||||
} HIDKeyboardState;
|
} HIDKeyboardState;
|
||||||
|
|
||||||
struct HIDState {
|
struct HIDState {
|
||||||
|
@ -47,6 +47,7 @@ struct HIDState {
|
||||||
bool idle_pending;
|
bool idle_pending;
|
||||||
QEMUTimer *idle_timer;
|
QEMUTimer *idle_timer;
|
||||||
HIDEventFunc event;
|
HIDEventFunc event;
|
||||||
|
QemuInputHandlerState *s;
|
||||||
};
|
};
|
||||||
|
|
||||||
void hid_init(HIDState *hs, int kind, HIDEventFunc event);
|
void hid_init(HIDState *hs, int kind, HIDEventFunc event);
|
||||||
|
|
Loading…
Reference in New Issue