virtio-input: add input routing support

Add display and head properties for input routing to
virtio-input devices, update multiseat documentation.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2015-06-24 11:59:16 +02:00
parent 6686ce3f16
commit 5cce173323
3 changed files with 28 additions and 2 deletions

View File

@ -2,8 +2,8 @@
multiseat howto (with some multihead coverage) multiseat howto (with some multihead coverage)
============================================== ==============================================
host side host devices
--------- ------------
First you must compile qemu with a user interface supporting First you must compile qemu with a user interface supporting
multihead/multiseat and input event routing. Right now this multihead/multiseat and input event routing. Right now this
@ -41,6 +41,19 @@ The "display=video2" sets up the input routing. Any input coming from
the window which belongs to the video.2 display adapter will be routed the window which belongs to the video.2 display adapter will be routed
to these input devices. to these input devices.
Starting with qemu 2.4 and linux kernel 4.1 you can also use virtio
for the input devices, using this ...
-device pci-bridge,addr=12.0,chassis_nr=2,id=head.2 \
-device secondary-vga,bus=head.2,addr=02.0,id=video.2 \
-device virtio-keyboard-pci,bus=head.2,addr=03.0,display=video.2 \
-device virtio-tablet-pci,bus=head.2,addr=03.0,display=video.2
... instead of xhci and usb hid devices.
host ui
-------
The sdl2 ui will start up with two windows, one for each display The sdl2 ui will start up with two windows, one for each display
device. The gtk ui will start with a single window and each display device. The gtk ui will start with a single window and each display
in a separate tab. You can either simply switch tabs to switch heads, in a separate tab. You can either simply switch tabs to switch heads,

View File

@ -252,7 +252,11 @@ static void virtio_input_handle_sync(DeviceState *dev)
static void virtio_input_hid_realize(DeviceState *dev, Error **errp) static void virtio_input_hid_realize(DeviceState *dev, Error **errp)
{ {
VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev); VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev);
vhid->hs = qemu_input_handler_register(dev, vhid->handler); vhid->hs = qemu_input_handler_register(dev, vhid->handler);
if (vhid->display && vhid->hs) {
qemu_input_handler_bind(vhid->hs, vhid->display, vhid->head, NULL);
}
} }
static void virtio_input_hid_unrealize(DeviceState *dev, Error **errp) static void virtio_input_hid_unrealize(DeviceState *dev, Error **errp)
@ -301,10 +305,17 @@ static void virtio_input_hid_handle_status(VirtIOInput *vinput,
} }
} }
static Property virtio_input_hid_properties[] = {
DEFINE_PROP_STRING("display", VirtIOInputHID, display),
DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0),
};
static void virtio_input_hid_class_init(ObjectClass *klass, void *data) static void virtio_input_hid_class_init(ObjectClass *klass, void *data)
{ {
DeviceClass *dc = DEVICE_CLASS(klass);
VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass);
dc->props = virtio_input_hid_properties;
vic->realize = virtio_input_hid_realize; vic->realize = virtio_input_hid_realize;
vic->unrealize = virtio_input_hid_unrealize; vic->unrealize = virtio_input_hid_unrealize;
vic->change_active = virtio_input_hid_change_active; vic->change_active = virtio_input_hid_change_active;

View File

@ -95,6 +95,8 @@ struct VirtIOInputClass {
struct VirtIOInputHID { struct VirtIOInputHID {
VirtIOInput parent_obj; VirtIOInput parent_obj;
char *display;
uint32_t head;
QemuInputHandler *handler; QemuInputHandler *handler;
QemuInputHandlerState *hs; QemuInputHandlerState *hs;
int ledstate; int ledstate;