[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2 v4] Support for multiple keyboard devices
From: |
Shahar Havivi |
Subject: |
Re: [Qemu-devel] [PATCH 1/2 v4] Support for multiple keyboard devices |
Date: |
Fri, 29 Apr 2011 14:23:32 -0400 (EDT) |
Fine with me
On Apr 29, 2011, at 19:24, Dmitry Zhurikhin <address@hidden> wrote:
> On 05/11/2010 12:18 AM, Anthony Liguori wrote:
>> On 04/18/2010 02:21 PM, Shahar Havivi wrote:
>>> Patch add QEMUPutKbdEntry structure - handling each keyboard entry, the
>>> structure handled
>>> by qemu tail queue.
>>> Adding a new keyboard add to the list and select it, removing keyboard
>>> select the previous
>>> keyboard in list.
>>>
>>> Signed-off-by: Shahar Havivi<address@hidden>
>>
>> Applied all. Thanks.
> Hello. What happened to this patchset? Seems like it didn't make to the
> trunk. Were there any objections not discussed on the list? If there are no
> objections I'll update these patches and resend them. Is it OK?
>
> Regards,
> Dmitry
>
>>
>> Regards,
>>
>> Anthony Liguori
>>
>>> ---
>>> console.h | 14 ++++++++++++-
>>> hw/adb.c | 2 +-
>>> hw/escc.c | 3 +-
>>> hw/musicpal.c | 2 +-
>>> hw/nseries.c | 4 +-
>>> hw/palm.c | 2 +-
>>> hw/ps2.c | 2 +-
>>> hw/pxa2xx_keypad.c | 3 +-
>>> hw/spitz.c | 3 +-
>>> hw/stellaris_input.c | 2 +-
>>> hw/syborg_keyboard.c | 2 +-
>>> hw/usb-hid.c | 10 ++++++--
>>> hw/xenfb.c | 5 ++-
>>> input.c | 51
>>> ++++++++++++++++++++++++++++++++++++++++---------
>>> 14 files changed, 78 insertions(+), 27 deletions(-)
>>>
>>> diff --git a/console.h b/console.h
>>> index 6def115..91b66ea 100644
>>> --- a/console.h
>>> +++ b/console.h
>>> @@ -41,7 +41,19 @@ typedef struct QEMUPutLEDEntry {
>>> QTAILQ_ENTRY(QEMUPutLEDEntry) next;
>>> } QEMUPutLEDEntry;
>>>
>>> -void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
>>> +typedef struct QEMUPutKbdEntry {
>>> + char *qemu_put_kbd_name;
>>> + QEMUPutKBDEvent *qemu_put_kbd_event;
>>> + void *qemu_put_kbd_event_opaque;
>>> + int index;
>>> +
>>> + QTAILQ_ENTRY(QEMUPutKbdEntry) node;
>>> +} QEMUPutKbdEntry;
>>> +
>>> +QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func,
>>> + void *opaque,
>>> + const char *name);
>>> +void qemu_remove_kbd_event_handler(QEMUPutKbdEntry *entry);
>>> QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
>>> void *opaque, int absolute,
>>> const char *name);
>>> diff --git a/hw/adb.c b/hw/adb.c
>>> index 4fb7a62..09afcf9 100644
>>> --- a/hw/adb.c
>>> +++ b/hw/adb.c
>>> @@ -304,7 +304,7 @@ void adb_kbd_init(ADBBusState *bus)
>>> s = qemu_mallocz(sizeof(KBDState));
>>> d = adb_register_device(bus, ADB_KEYBOARD, adb_kbd_request,
>>> adb_kbd_reset, s);
>>> - qemu_add_kbd_event_handler(adb_kbd_put_keycode, d);
>>> + qemu_add_kbd_event_handler(adb_kbd_put_keycode, d, "adb");
>>> register_savevm("adb_kbd", -1, 1, adb_kbd_save,
>>> adb_kbd_load, s);
>>> }
>>> diff --git a/hw/escc.c b/hw/escc.c
>>> index 6d2fd36..2b21d98 100644
>>> --- a/hw/escc.c
>>> +++ b/hw/escc.c
>>> @@ -919,7 +919,8 @@ static int escc_init1(SysBusDevice *dev)
>>> "QEMU Sun Mouse");
>>> }
>>> if (s->chn[1].type == kbd) {
>>> - qemu_add_kbd_event_handler(sunkbd_event,&s->chn[1]);
>>> + qemu_add_kbd_event_handler(sunkbd_event,&s->chn[1],
>>> + "QEMU Sun Keyboard");
>>> }
>>>
>>> return 0;
>>> diff --git a/hw/musicpal.c b/hw/musicpal.c
>>> index ebd933e..e1a3b6a 100644
>>> --- a/hw/musicpal.c
>>> +++ b/hw/musicpal.c
>>> @@ -1447,7 +1447,7 @@ static int musicpal_key_init(SysBusDevice *dev)
>>>
>>> qdev_init_gpio_out(&dev->qdev, s->out, ARRAY_SIZE(s->out));
>>>
>>> - qemu_add_kbd_event_handler(musicpal_key_event, s);
>>> + qemu_add_kbd_event_handler(musicpal_key_event, s, "Musicpal");
>>>
>>> return 0;
>>> }
>>> diff --git a/hw/nseries.c b/hw/nseries.c
>>> index 0273eee..abfcec3 100644
>>> --- a/hw/nseries.c
>>> +++ b/hw/nseries.c
>>> @@ -262,7 +262,7 @@ static void n800_tsc_kbd_setup(struct n800_s *s)
>>> if (n800_keys[i]>= 0)
>>> s->keymap[n800_keys[i]] = i;
>>>
>>> - qemu_add_kbd_event_handler(n800_key_event, s);
>>> + qemu_add_kbd_event_handler(n800_key_event, s, "Nokia n800");
>>>
>>> tsc210x_set_transform(s->ts.chip,&n800_pointercal);
>>> }
>>> @@ -371,7 +371,7 @@ static void n810_kbd_setup(struct n800_s *s)
>>> if (n810_keys[i]> 0)
>>> s->keymap[n810_keys[i]] = i;
>>>
>>> - qemu_add_kbd_event_handler(n810_key_event, s);
>>> + qemu_add_kbd_event_handler(n810_key_event, s, "Nokia n810");
>>>
>>> /* Attach the LM8322 keyboard to the I2C bus,
>>> * should happen in n8x0_i2c_setup and s->kbd be initialised here. */
>>> diff --git a/hw/palm.c b/hw/palm.c
>>> index 6d19167..1b405d4 100644
>>> --- a/hw/palm.c
>>> +++ b/hw/palm.c
>>> @@ -228,7 +228,7 @@ static void palmte_init(ram_addr_t ram_size,
>>>
>>> palmte_microwire_setup(cpu);
>>>
>>> - qemu_add_kbd_event_handler(palmte_button_event, cpu);
>>> + qemu_add_kbd_event_handler(palmte_button_event, cpu, "Palm Keyboard");
>>>
>>> palmte_gpio_setup(cpu);
>>>
>>> diff --git a/hw/ps2.c b/hw/ps2.c
>>> index f0b206a..886da37 100644
>>> --- a/hw/ps2.c
>>> +++ b/hw/ps2.c
>>> @@ -596,7 +596,7 @@ void *ps2_kbd_init(void (*update_irq)(void *, int),
>>> void *update_arg)
>>> s->common.update_arg = update_arg;
>>> s->scancode_set = 2;
>>> vmstate_register(0,&vmstate_ps2_keyboard, s);
>>> - qemu_add_kbd_event_handler(ps2_put_keycode, s);
>>> + qemu_add_kbd_event_handler(ps2_put_keycode, s, "QEMU PS/2 Keyboard");
>>> qemu_register_reset(ps2_kbd_reset, s);
>>> return s;
>>> }
>>> diff --git a/hw/pxa2xx_keypad.c b/hw/pxa2xx_keypad.c
>>> index 060df58..2b75351 100644
>>> --- a/hw/pxa2xx_keypad.c
>>> +++ b/hw/pxa2xx_keypad.c
>>> @@ -332,5 +332,6 @@ void pxa27x_register_keypad(PXA2xxKeyPadState *kp,
>>> struct keymap *map,
>>> }
>>>
>>> kp->map = map;
>>> - qemu_add_kbd_event_handler((QEMUPutKBDEvent *) pxa27x_keyboard_event,
>>> kp);
>>> + qemu_add_kbd_event_handler((QEMUPutKBDEvent *) pxa27x_keyboard_event,
>>> kp,
>>> + "PXA keypad");
>>> }
>>> diff --git a/hw/spitz.c b/hw/spitz.c
>>> index 564519b..b1c0af0 100644
>>> --- a/hw/spitz.c
>>> +++ b/hw/spitz.c
>>> @@ -506,7 +506,8 @@ static void spitz_keyboard_register(PXA2xxState *cpu)
>>> pxa2xx_gpio_out_set(cpu->gpio, spitz_gpio_key_strobe[i],
>>> s->strobe[i]);
>>>
>>> spitz_keyboard_pre_map(s);
>>> - qemu_add_kbd_event_handler((QEMUPutKBDEvent *) spitz_keyboard_handler,
>>> s);
>>> + qemu_add_kbd_event_handler((QEMUPutKBDEvent *) spitz_keyboard_handler,
>>> s,
>>> + "Spitz keyboard");
>>>
>>> register_savevm("spitz_keyboard", 0, 0,
>>> spitz_keyboard_save, spitz_keyboard_load, s);
>>> diff --git a/hw/stellaris_input.c b/hw/stellaris_input.c
>>> index 33395a4..775cb46 100644
>>> --- a/hw/stellaris_input.c
>>> +++ b/hw/stellaris_input.c
>>> @@ -85,7 +85,7 @@ void stellaris_gamepad_init(int n, qemu_irq *irq, const
>>> int *keycode)
>>> s->buttons[i].keycode = keycode[i];
>>> }
>>> s->num_buttons = n;
>>> - qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s);
>>> + qemu_add_kbd_event_handler(stellaris_gamepad_put_key, s, "Stellaris
>>> Gamepad");
>>> register_savevm("stellaris_gamepad", -1, 1,
>>> stellaris_gamepad_save, stellaris_gamepad_load, s);
>>> }
>>> diff --git a/hw/syborg_keyboard.c b/hw/syborg_keyboard.c
>>> index 4a562f8..d1651b4 100644
>>> --- a/hw/syborg_keyboard.c
>>> +++ b/hw/syborg_keyboard.c
>>> @@ -218,7 +218,7 @@ static int syborg_keyboard_init(SysBusDevice *dev)
>>> }
>>> s->key_fifo = qemu_mallocz(s->fifo_size * sizeof(s->key_fifo[0]));
>>>
>>> - qemu_add_kbd_event_handler(syborg_keyboard_event, s);
>>> + qemu_add_kbd_event_handler(syborg_keyboard_event, s, "Syborg
>>> Keyboard");
>>>
>>> register_savevm("syborg_keyboard", -1, 1,
>>> syborg_keyboard_save, syborg_keyboard_load, s);
>>> diff --git a/hw/usb-hid.c b/hw/usb-hid.c
>>> index 8e6c6e0..dbab5d3 100644
>>> --- a/hw/usb-hid.c
>>> +++ b/hw/usb-hid.c
>>> @@ -55,6 +55,7 @@ typedef struct USBKeyboardState {
>>> uint8_t leds;
>>> uint8_t key[16];
>>> int keys;
>>> + QEMUPutKbdEntry *eh_entry;
>>> } USBKeyboardState;
>>>
>>> typedef struct USBHIDState {
>>> @@ -633,7 +634,8 @@ static void usb_keyboard_handle_reset(USBDevice *dev)
>>> {
>>> USBHIDState *s = (USBHIDState *)dev;
>>>
>>> - qemu_add_kbd_event_handler(usb_keyboard_event, s);
>>> + s->kbd.eh_entry = qemu_add_kbd_event_handler(usb_keyboard_event, s,
>>> + dev->product_desc);
>>> s->protocol = 1;
>>> }
>>>
>>> @@ -854,9 +856,11 @@ static void usb_hid_handle_destroy(USBDevice *dev)
>>> {
>>> USBHIDState *s = (USBHIDState *)dev;
>>>
>>> - if (s->kind != USB_KEYBOARD)
>>> + if (s->kind != USB_KEYBOARD) {
>>> qemu_remove_mouse_event_handler(s->ptr.eh_entry);
>>> - /* TODO: else */
>>> + } else {
>>> + qemu_remove_kbd_event_handler(s->kbd.eh_entry);
>>> + }
>>> }
>>>
>>> static int usb_hid_initfn(USBDevice *dev, int kind)
>>> diff --git a/hw/xenfb.c b/hw/xenfb.c
>>> index 422cd53..0c1d1ec 100644
>>> --- a/hw/xenfb.c
>>> +++ b/hw/xenfb.c
>>> @@ -68,6 +68,7 @@ struct XenInput {
>>> int button_state; /* Last seen pointer button state */
>>> int extended;
>>> QEMUPutMouseEntry *qmouse;
>>> + QEMUPutKbdEntry *qkbd;
>>> };
>>>
>>> #define UP_QUEUE 8
>>> @@ -373,7 +374,7 @@ static int input_connect(struct XenDevice *xendev)
>>> if (rc != 0)
>>> return rc;
>>>
>>> - qemu_add_kbd_event_handler(xenfb_key_event, in);
>>> + in->qkbd = qemu_add_kbd_event_handler(xenfb_key_event, in, "Xen
>>> Keyboard");
>>> in->qmouse = qemu_add_mouse_event_handler(xenfb_mouse_event, in,
>>> in->abs_pointer_wanted,
>>> "Xen PVFB Mouse");
>>> @@ -388,7 +389,7 @@ static void input_disconnect(struct XenDevice *xendev)
>>> qemu_remove_mouse_event_handler(in->qmouse);
>>> in->qmouse = NULL;
>>> }
>>> - qemu_add_kbd_event_handler(NULL, NULL);
>>> + qemu_remove_kbd_event_handler(in->qkbd);
>>> common_unbind(&in->c);
>>> }
>>>
>>> diff --git a/input.c b/input.c
>>> index 8f0941e..18875a9 100644
>>> --- a/input.c
>>> +++ b/input.c
>>> @@ -28,20 +28,14 @@
>>> #include "console.h"
>>> #include "qjson.h"
>>>
>>> -static QEMUPutKBDEvent *qemu_put_kbd_event;
>>> -static void *qemu_put_kbd_event_opaque;
>>> +static QTAILQ_HEAD(, QEMUPutKbdEntry) kbd_handlers =
>>> + QTAILQ_HEAD_INITIALIZER(kbd_handlers);
>>> static QTAILQ_HEAD(, QEMUPutLEDEntry) led_handlers =
>>> QTAILQ_HEAD_INITIALIZER(led_handlers);
>>> static QTAILQ_HEAD(, QEMUPutMouseEntry) mouse_handlers =
>>> QTAILQ_HEAD_INITIALIZER(mouse_handlers);
>>> static NotifierList mouse_mode_notifiers =
>>> NOTIFIER_LIST_INITIALIZER(mouse_mode_notifiers);
>>>
>>> -void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque)
>>> -{
>>> - qemu_put_kbd_event_opaque = opaque;
>>> - qemu_put_kbd_event = func;
>>> -}
>>> -
>>> static void check_mode_change(void)
>>> {
>>> static int current_is_absolute, current_has_absolute;
>>> @@ -60,6 +54,38 @@ static void check_mode_change(void)
>>> current_has_absolute = has_absolute;
>>> }
>>>
>>> +QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func,
>>> + void *opaque,
>>> + const char *name)
>>> +{
>>> + static int index = 0;
>>> + QEMUPutKbdEntry *s, *cursor;
>>> +
>>> + QTAILQ_FOREACH(cursor,&kbd_handlers, node) {
>>> + if (cursor->qemu_put_kbd_event == func&&
>>> + cursor->qemu_put_kbd_event_opaque == opaque) {
>>> + return cursor;
>>> + }
>>> + }
>>> +
>>> + s = qemu_mallocz(sizeof(QEMUPutKbdEntry));
>>> +
>>> + s->qemu_put_kbd_event_opaque = opaque;
>>> + s->qemu_put_kbd_event = func;
>>> + s->qemu_put_kbd_name = qemu_strdup(name);
>>> + s->index = index++;
>>> +
>>> + QTAILQ_INSERT_TAIL(&kbd_handlers, s, node);
>>> +
>>> + return s;
>>> +}
>>> +
>>> +void qemu_remove_kbd_event_handler(QEMUPutKbdEntry *entry)
>>> +{
>>> + QTAILQ_REMOVE(&kbd_handlers, entry, node);
>>> + qemu_free(entry);
>>> +}
>>> +
>>> QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
>>> void *opaque, int absolute,
>>> const char *name)
>>> @@ -123,9 +149,14 @@ void qemu_remove_led_event_handler(QEMUPutLEDEntry
>>> *entry)
>>>
>>> void kbd_put_keycode(int keycode)
>>> {
>>> - if (qemu_put_kbd_event) {
>>> - qemu_put_kbd_event(qemu_put_kbd_event_opaque, keycode);
>>> + QEMUPutKbdEntry *entry;
>>> +
>>> + if (QTAILQ_EMPTY(&kbd_handlers)) {
>>> + return;
>>> }
>>> +
>>> + entry = QTAILQ_FIRST(&kbd_handlers);
>>> + entry->qemu_put_kbd_event(entry->qemu_put_kbd_event_opaque, keycode);
>>> }
>>>
>>> void kbd_put_ledstate(int ledstate)
>>
>>
>>
>