Qemu support for multiple keyboard devices
v5 cover Qemu support for multiple keyboard devices
v5:
Merge with commit 46aaebff40f942e7b17b426916a3dee9b8b6f274 and last monitor changes.
Qemu support for multiple keyboard devices:
Patch #1 adding keyboard is done to qemu tail queue instead of
"last added keyboard wins",
when removing keyboard via device_del - prev keyboard selected.
Patch #2 adding 2 new monitor command to handle keyboard list:
'info keyboard' - show all keyboards and mark the current one 'keyboard_set' - set active keyboard by index as display in
'info keyboard'
Shahar Havivi (2):
Support for multiple keyboard devices
Two new monitor commands: 'info keyboard', 'keyboard_set'
console.h | 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 | 2 +- hw/syborg_keyboard.c | 2 +- hw/usb-hid.c | 12 +++- hw/xenfb.c | 5 +- input.c | 168 +++++++++++++++++++++++++++++++++++++++++++++----- monitor.c | 8 +++ qemu-monitor.hx | 18 +++++ 16 files changed, 223 insertions(+), 33 deletions(-)
PATCH v5 1/2 Support for multiple keyboard devices
--- console.h | 15 +++++++++++- 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 | 6 +++- hw/xenfb.c | 5 ++- input.c | 57 ++++++++++++++++++++++++++++++++++++-------------- 14 files changed, 75 insertions(+), 33 deletions(-)
console.h +13 -2
@@ -41,8 +41,19 @@ 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);QEMUPutMouseEntry *qemu_add_mouse_event_handler (QEMUPutMouseEvent *func,void *opaque,int absolute,const char *name);
hw/adb.c +1 -1
@@ -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); }
hw/escc.c +2 -1
@@ -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 ;
hw/musicpal.c +1 -1
@@ -1445,7 +1445,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 ; }
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,"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. */
hw/palm.c +1 -1
@@ -227,7 +227,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);
hw/ps2.c +1 -1
@@ -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; }
hw/pxa2xx_keypad.c +2 -1
@@ -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" ); }
hw/spitz.c +2 -1
@@ -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);
hw/stellaris_input.c +1 -1
@@ -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); }
hw/syborg_keyboard.c +1 -1
@@ -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);
hw/usb-hid.c +4 -2
@@ -56,6 +56,7 @@ typedef struct USBKeyboardState {uint8_t leds;uint8_t key[16 ];int keys; +QEMUPutKbdEntry *eh_entry; } USBKeyboardState; typedef struct USBHIDState {
@@ -634,7 +635,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 ; }
@@ -857,7 +859,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
@@ -67,6 +67,7 @@ struct XenInput {int button_state;/* Last seen pointer button state */ int extended;QEMUPutMouseEntry *qmouse; +QEMUPutKbdEntry *qkbd; };#define UP_QUEUE 8
@@ -372,7 +373,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" );
@@ -387,7 +388,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 +41 -16
82 lines not on this page · raw message
Signature · 1 line
1.7.0.4
PATCH v5 2/2 Two new monitor commands: 'info keyboard', 'keyboard_set'
In reply to Shahar Havivi--- console.h | 5 ++ hw/usb-hid.c | 6 +++ input.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ monitor.c | 8 ++++ qemu-monitor.hx | 18 +++++++++ 5 files changed, 148 insertions(+), 0 deletions(-)
console.h +5 -0
@@ -54,6 +54,7 @@ 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);
@@ -87,6 +88,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)
hw/usb-hid.c +6 -0
@@ -56,6 +56,7 @@ typedef struct USBKeyboardState {uint8_t leds;uint8_t key[16 ];int keys; +int keyboard_grabbed;QEMUPutKbdEntry *eh_entry; } USBKeyboardState;
@@ -587,6 +588,11 @@ static int usb_keyboard_poll(USBKeyboardState *s, 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 ; + } + buf[0 ] = s->modifiers &0xff ; buf[1 ] =0 ;if (s->keys >6 )
input.c +111 -0
114 lines not on this page · raw message
monitor.c +8 -0
@@ -2475,6 +2475,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 = "",
qemu-monitor.hx +18 -0
@@ -813,6 +813,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",
Signature · 1 line
1.7.0.4