Qemu support for multiple keyboard devices
v6 cover Qemu support for multiple keyboard devices
v6 (Dmitry Zhurikhin <[email protected]>):
- merge with commit 57aa265d462a64a06268be26d49020729cff56c1
- moved changes from usb-hid.c and qemu_activate_keyboard_event_handler function to the first patch as more appropriate
- changed some keyboard names to be more consistent
- added 'info keyboard' to the 'info subcommand' documentation chapter
- fixed an 'avoid assignment of zero to static variable' warning by 'scripts/checkpatch.pl'
Qemu support for multiple keyboard devices:
Patch #1
Adding keyboard is done to the queue instead of "last added keyboard wins", when removing keyboard via device_del - previous keyboard is selected.
Patch #2
Adding 2 new monitor commands to handle keyboard list:
'info keyboard' - show all keyboard devices and mark the current one 'keyboard_set' - set active keyboard by index as displayed by 'info keyboard'
Shahar Havivi (2):
Support for multiple keyboard devices
Two new monitor commands: 'info keyboard', 'keyboard_set'
console.h | 20 +++++- hmp-commands.hx | 20 ++++++ 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 | 3 +- hw/syborg_keyboard.c | 3 +- hw/usb-hid.c | 12 +++- hw/xenfb.c | 5 +- input.c | 168 +++++++++++++++++++++++++++++++++++++++++++++----- monitor.c | 8 +++ 16 files changed, 227 insertions(+), 33 deletions(-)
PATCH v6 1/2 Support for multiple keyboard devices
From: Shahar Havivi <[email protected]>
Adding keyboard is done to the queue instead of "last added keyboard wins", when removing keyboard via device_del - previous keyboard is selected.
--- console.h | 16 +++++++++++- 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 | 3 +- hw/syborg_keyboard.c | 3 +- hw/usb-hid.c | 12 ++++++++- hw/xenfb.c | 5 ++- input.c | 63 +++++++++++++++++++++++++++++++++++++------------ 14 files changed, 90 insertions(+), 33 deletions(-)
console.h +14 -2
@@ -43,8 +43,20 @@ typedef struct QEMUPutLEDEntry {QTAILQ_ENTRY (QEMUPutLEDEntry) next; } QEMUPutLEDEntry; -void qemu_add_kbd_event_handler (QEMUPutKBDEvent *func,void *opaque); -void qemu_remove_kbd_event_handler (void ); +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); +void qemu_activate_keyboard_event_handler (QEMUPutKbdEntry *entry);QEMUPutMouseEntry *qemu_add_mouse_event_handler (QEMUPutMouseEvent *func,void *opaque,int absolute,const char *name);
hw/adb.c +1 -1
@@ -293,7 +293,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,"QEMU ADB Keyboard" );vmstate_register (NULL ,-1 , &vmstate_adb_kbd, s); }
hw/escc.c +2 -1
@@ -928,7 +928,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 ;
hw/musicpal.c +1 -1
@@ -1454,7 +1454,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,"QEMU Musicpal Keyboard" );return 0 ; }
hw/nseries.c +2 -2
@@ -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,"QEMU Nokia N800 Keyboard" );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,"QEMU Nokia N810 Keyboard" );/* Attach the LM8322 keyboard to the I2C bus, * should happen in n8x0_i2c_setup and s->kbd be initialised here. */
hw/palm.c +1 -1
@@ -232,7 +232,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,"QEMU Palm Keyboard" );palmte_gpio_setup (cpu);
hw/ps2.c +1 -1
@@ -610,7 +610,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 (NULL ,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; }
hw/pxa2xx_keypad.c +2 -1
@@ -333,5 +333,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, +"QEMU PXA Keypad" ); }
hw/spitz.c +2 -1
@@ -487,7 +487,8 @@ static void spitz_keyboard_register(PXA2xxState *cpu)qemu_mod_timer (s->kbdtimer,qemu_get_clock_ns (vm_clock)); -qemu_add_kbd_event_handler (spitz_keyboard_handler, s); +qemu_add_kbd_event_handler (spitz_keyboard_handler, s, +"QEMU Spitz Keyboard" ); }static int spitz_keyboard_init (SysBusDevice *dev)
hw/stellaris_input.c +2 -1
@@ -84,6 +84,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, +"QEMU Stellaris Gamepad" );vmstate_register (NULL ,-1 , &vmstate_stellaris_gamepad, s); }
hw/syborg_keyboard.c +2 -1
@@ -197,7 +197,8 @@ 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, +"QEMU Syborg Keyboard" );vmstate_register (&dev->qdev,-1 , &vmstate_syborg_keyboard, s);return 0 ;
hw/usb-hid.c +10 -2
@@ -66,6 +66,8 @@ typedef struct USBKeyboardState {uint8_t leds;uint8_t key[16 ];int32_t keys; +int keyboard_grabbed; +QEMUPutKbdEntry *eh_entry; } USBKeyboardState; typedef struct USBHIDState {
@@ -663,6 +665,11 @@ static int usb_keyboard_poll(USBHIDState *hs, uint8_t *buf, int len)if (len <2 )return 0 ; +if (!s->keyboard_grabbed) { +qemu_activate_keyboard_event_handler (s->eh_entry); + s->keyboard_grabbed =1 ; + } +usb_keyboard_process_keycode (hs); buf[0 ] = s->modifiers &0xff ;
@@ -710,7 +717,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);memset (s->kbd.keycodes,0 ,sizeof (s->kbd.keycodes)); s->head =0 ; s->n =0 ;
@@ -845,7 +853,7 @@ static void usb_hid_handle_destroy(USBDevice *dev)switch (s->kind) {case USB_KEYBOARD : -qemu_remove_kbd_event_handler (); +qemu_remove_kbd_event_handler (s->kbd.eh_entry);break ;default :qemu_remove_mouse_event_handler (s->ptr.eh_entry);
hw/xenfb.c +3 -2
@@ -66,6 +66,7 @@ struct XenInput {int button_state;/* Last seen pointer button state */ int extended;QEMUPutMouseEntry *qmouse; +QEMUPutKbdEntry *qkbd; };#define UP_QUEUE 8
@@ -371,7 +372,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" );
@@ -386,7 +387,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); }
input.c +47 -16
88 lines not on this page · raw message
Signature · 1 line
1.7.1
PATCH v6 2/2 Two new monitor commands: 'info keyboard', 'keyboard_set'
In reply to Dmitry ZhurikhinFrom: Shahar Havivi <[email protected]>
Adding 2 new monitor commands to handle keyboard list:
'info keyboard' - show all keyboard devices and mark the current one 'keyboard_set' - set active keyboard by index as displayed by 'info keyboard'
--- console.h | 4 ++ hmp-commands.hx | 20 ++++++++++ input.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ monitor.c | 8 ++++ 4 files changed, 137 insertions(+), 0 deletions(-)
console.h +4 -0
@@ -90,6 +90,10 @@ void do_info_mice_print(Monitor *mon, const QObject *data);void do_info_mice (Monitor *mon,QObject **ret_data);void do_mouse_set (Monitor *mon,const QDict *qdict); +void do_info_keyboard_print (Monitor *mon,const QObject *data); +void do_info_keyboard (Monitor *mon,QObject **ret_data); +int do_keyboard_set (Monitor *mon,const QDict *qdict,QObject **ret_data); +/* keysym is a unicode code except for special keys (see QEMU_KEY_xxx constants) */ #define QEMU_KEY_ESC1 (c) ((c) | 0xe100)
hmp-commands.hx +20 -0
@@ -647,6 +647,24 @@ info mice @end example ETEXI + { + .name = "keyboard_set", + .args_type = "index:i", + .params = "index", + .help = "set which keyboard device receives events", + .mhandler.cmd_new = do_keyboard_set, + }, + +STEXI +@item keyboard_set @var{index} +@findex keyboard_set +Set which keyboard device receives events at given @var{index}, index +can be obtained with +@example +info keyboard +@end example +ETEXI + #ifdef HAS_AUDIO { .name = "wavcapture",
@@ -1332,6 +1350,8 @@ show the current VM status (running|paused) show guest PCMCIA status @item info mice show which guest mouse is receiving events +@item info keyboard +show which guest keyboard is receiving events @item info vnc show the vnc server status @item info name
input.c +105 -0
108 lines not on this page · raw message
monitor.c +8 -0
@@ -2995,6 +2995,14 @@ static const mon_cmd_t info_cmds[] = { .mhandler.info_new = do_info_mice, }, { + .name = "keyboard", + .args_type = "", + .params = "", + .help = "show which guest keyboard is receiving events", + .user_print = do_info_keyboard_print, + .mhandler.info_new = do_info_keyboard, + }, + { .name = "vnc", .args_type = "", .params = "",
Signature · 1 line
1.7.1