From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49730) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Woph6-0004Wt-VI for qemu-devel@nongnu.org; Mon, 26 May 2014 03:51:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Woph0-0007sW-4n for qemu-devel@nongnu.org; Mon, 26 May 2014 03:51:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:18054) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wopgz-0007s9-TA for qemu-devel@nongnu.org; Mon, 26 May 2014 03:51:34 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4Q7pX15005173 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 26 May 2014 03:51:33 -0400 From: Gerd Hoffmann Date: Mon, 26 May 2014 09:51:21 +0200 Message-Id: <1401090686-1095-6-git-send-email-kraxel@redhat.com> In-Reply-To: <1401090686-1095-1-git-send-email-kraxel@redhat.com> References: <1401090686-1095-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PULL 05/10] input: switch hid keyboard to new input layer api. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Gerd Hoffmann 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 --- hw/input/hid.c | 29 ++++++++++++++++++++++------- include/hw/input/hid.h | 3 ++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/hw/input/hid.c b/hw/input/hid.c index bb0fa6a..ff75e41 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"); diff --git a/include/hw/input/hid.h b/include/hw/input/hid.h index 2567879..fb913ba 100644 --- a/include/hw/input/hid.h +++ b/include/hw/input/hid.h @@ -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); -- 1.8.3.1