From: "John V. Baboval" <john.babo...@citrix.com> This is mostly just RFC at this point, since I'm not quite ready to submit the associated multi-head video adapter, drivers and UI that consume this stuff. (I still have to remove some Xen/XenClient specific stuff from it).
These are the infrastructure hooks I needed to add in order to support XenClient Enterprise style multi-head with the current QEMU tip. The general architecture is as follows: Other than the initial display (which works as it always has), displays are dynamically added by the UI. This can be the result of command line parameters, hotplug notifications from UDEV, the user clicking an "Add Display" button in a menu, or whatever. The UI adds the display by calling graphic_hw_add_display(), which returns the QemuConsole for the new display. The video adapter can either allocate all supported displays up-front, or spoof up a new one when its add_display handler is called, either way, it's responsible for providing the new QemuConsole to the UI. If the display hardware doesn't support multi-head (add_display handler == NULL), or if the maximum number of displays are already connected, graphic_hw_add_display returns NULL. Once the UI has the new QemuConsole, it needs to do basic configuration. A new opaque pointer has been added to the DisplayChangeListener. The UI should set this to something which will allow it to determine which QemuConsole its handlers have been called for. It should then register its DisplayChangeListener with the QemuConsole. It should then provide a sane EDID with graphic_hw_store_edid(), and notify the adapter of the relative positions of the display windows with graphic_hw_set_orientation(). (Per earlier discussions with Gerd, the orientation should eventually live on the QemuConsole itself, in which case graphic_hw_set_orientation would need to be replaced with something like qemu_console_set_orientation(). I'll take care of that before the next version; I wanted to get something out for people to see before leaving for holiday travel though.) Once configuration is complete, and anytime the UI has completed configuration changes (plugs/unplugs, re-orientation, change in "supported resolution" due to window resizing), the UI should call graphic_hw_notify(). If the display adapter needs to re-initialize, it can call dpy_reset(). The UI should then reconfigure the EDID and orientation. The last hook added here is not really multi-head related, but is an optimization for showing/hiding the cursor. Things I'd still like to do: Submit the emulated multi-head graphics adapter along with the GPL Xorg and binary Windows drivers. Clean up the "active_console" stuff, which doesn't make a lot of sense anymore. Modify one of the stock UIs to consume this stuff. John V. Baboval (7): console: Add graphic_hw_store_edid() console: Add graphic_hw_set_orientation() console: Add graphic_hw_add_display() console: Add graphic_hw_notify() ui: Add dpy_reset() ui: Add dpy_cursor_enable() ui: Add an opaque pointer to the DisplayChangeListener include/ui/console.h | 22 ++++++++++++++++++++ ui/console.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) -- 1.7.9.5