On Thu, 8 Jun 2017, Owen Smith wrote: > Advertise "feature-vkbd-standalone" to indicate the backend > can connect without a vfb device connection. > When "request-vkbd-standalone" is set to 1, the backend does > not wait for a QemuConsole to be setup before connecting the > vkbd device. This also means that absolute coordinates cannot > be scaled to the non-existent QemuConsole's sizes, and remain > unscaled, in the range [0, 0x7FFF]. > > Signed-off-by: Owen Smith <owen.sm...@citrix.com> > --- > hw/display/xenfb.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c > index e76c0d8..2ebc81b 100644 > --- a/hw/display/xenfb.c > +++ b/hw/display/xenfb.c > @@ -52,6 +52,7 @@ struct common { > struct XenInput { > struct common c; > int abs_pointer_wanted; /* Whether guest supports absolute pointer */ > + int vkbd_standalone; /* Guest supports vkbd without vfb device */ > int button_state; /* Last seen pointer button state */ > int extended; > QEMUPutMouseEntry *qmouse; > @@ -306,18 +307,22 @@ static void xenfb_mouse_event(void *opaque, > int dx, int dy, int dz, int button_state) > { > struct XenInput *xenfb = opaque; > - DisplaySurface *surface = qemu_console_surface(xenfb->c.con); > - int dw = surface_width(surface); > - int dh = surface_height(surface); > - int i; > + int i, x, y; > + if (xenfb->c.con != NULL) { > + DisplaySurface *surface = qemu_console_surface(xenfb->c.con); > + int dw = surface_width(surface); > + int dh = surface_height(surface); > + x = dx * (dh - 1) / 0x7fff; > + y = dy * (dw - 1) / 0x7fff; > + } else { > + x = dx; > + y = dy; > + } > > trace_xenfb_mouse_event(opaque, dx, dy, dz, button_state, > xenfb->abs_pointer_wanted); > if (xenfb->abs_pointer_wanted) > - xenfb_send_position(xenfb, > - dx * (dw - 1) / 0x7fff, > - dy * (dh - 1) / 0x7fff, > - dz); > + xenfb_send_position(xenfb, x, y, dz); > else > xenfb_send_motion(xenfb, dx, dy, dz); > > @@ -336,6 +341,7 @@ static void xenfb_mouse_event(void *opaque, > static int input_init(struct XenDevice *xendev) > { > xenstore_write_be_int(xendev, "feature-abs-pointer", 1); > + xenstore_write_be_int(xendev, "feature-vkbd-standalone", 1); > return 0; > } > > @@ -345,8 +351,14 @@ static int input_initialise(struct XenDevice *xendev) > int rc; > > if (!in->c.con) { > - xen_pv_printf(xendev, 1, "ds not set (yet)\n"); > - return -1; > + if (xenstore_read_fe_int(xendev, "request-vkbd-standalone", > + &in->vkbd_standalone) == -1) { > + in->vkbd_standalone = 0; > + } > + if (in->vkbd_standalone == 0) { > + xen_pv_printf(xendev, 1, "ds not set (yet)\n"); > + return -1; > + }
In your changes to include/public/io/kbdif.h, make sure to write when (at what xenstore status stage) the frontend needs to write request-vkbd-standalone. This patch looks good: Reviewed-by: Stefano Stabellini <sstabell...@kernel.org> > } > > rc = common_bind(&in->c);