Loading docs/multiseat.txt +15 −2 Original line number Diff line number Diff line Loading @@ -2,8 +2,8 @@ multiseat howto (with some multihead coverage) ============================================== host side --------- host devices ------------ First you must compile qemu with a user interface supporting multihead/multiseat and input event routing. Right now this Loading Loading @@ -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 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 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, Loading hw/input/virtio-input-hid.c +11 −0 Original line number Diff line number Diff line Loading @@ -252,7 +252,11 @@ static void virtio_input_handle_sync(DeviceState *dev) static void virtio_input_hid_realize(DeviceState *dev, Error **errp) { VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev); 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) Loading Loading @@ -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) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); dc->props = virtio_input_hid_properties; vic->realize = virtio_input_hid_realize; vic->unrealize = virtio_input_hid_unrealize; vic->change_active = virtio_input_hid_change_active; Loading include/hw/virtio/virtio-input.h +2 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,8 @@ struct VirtIOInputClass { struct VirtIOInputHID { VirtIOInput parent_obj; char *display; uint32_t head; QemuInputHandler *handler; QemuInputHandlerState *hs; int ledstate; Loading Loading
docs/multiseat.txt +15 −2 Original line number Diff line number Diff line Loading @@ -2,8 +2,8 @@ multiseat howto (with some multihead coverage) ============================================== host side --------- host devices ------------ First you must compile qemu with a user interface supporting multihead/multiseat and input event routing. Right now this Loading Loading @@ -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 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 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, Loading
hw/input/virtio-input-hid.c +11 −0 Original line number Diff line number Diff line Loading @@ -252,7 +252,11 @@ static void virtio_input_handle_sync(DeviceState *dev) static void virtio_input_hid_realize(DeviceState *dev, Error **errp) { VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev); 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) Loading Loading @@ -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) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass); dc->props = virtio_input_hid_properties; vic->realize = virtio_input_hid_realize; vic->unrealize = virtio_input_hid_unrealize; vic->change_active = virtio_input_hid_change_active; Loading
include/hw/virtio/virtio-input.h +2 −0 Original line number Diff line number Diff line Loading @@ -95,6 +95,8 @@ struct VirtIOInputClass { struct VirtIOInputHID { VirtIOInput parent_obj; char *display; uint32_t head; QemuInputHandler *handler; QemuInputHandlerState *hs; int ledstate; Loading