[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3/3] xenfb: Add "feature-no-abs-rescale" for Windows PV frontend
Windows PV frontend requires absolute mouse values in the range [0, 0x7fff]. Add a feature to not rescale the axes to DisplaySurface size. Also allows Windows PV frontend to connect without a vfb device. Moves the rescaling of axes to a seperate function with additional null-pointer checks. Signed-off-by: Owen smith <owen.smith@xxxxxxxxxx> --- hw/display/xenfb.c | 52 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/hw/display/xenfb.c b/hw/display/xenfb.c index c4375c8..65c373b 100644 --- a/hw/display/xenfb.c +++ b/hw/display/xenfb.c @@ -61,6 +61,7 @@ struct common { struct XenInput { struct common c; int abs_pointer_wanted; /* Whether guest supports absolute pointer */ + int no_abs_rescale; /* Whether guest wants rescaled abs axes */ int button_state; /* Last seen pointer button state */ int extended; QEMUPutKbdEntry *qkbd; @@ -325,6 +326,25 @@ static void xenfb_key_event(void *opaque, int scancode) xenfb_send_key(xenfb, down, scancode2linux[scancode]); } +static void xenfb_rescale_mouse(struct XenInput *xenfb, int *dx, int *dy) +{ + DisplaySurface *surface; + int dw, dh; + + if (xenfb->c.con == NULL) { + return; + } + surface = qemu_console_surface(xenfb->c.con); + if (surface == NULL) { + return; + } + dw = surface_width(surface); + dh = surface_height(surface); + + *dx = *dx * (dw - 1) / 0x7fff; + *dy = *dy * (dh - 1) / 0x7fff; +} + /* * Send a mouse event from the client to the guest OS * @@ -338,18 +358,16 @@ 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; - if (xenfb->abs_pointer_wanted) - xenfb_send_position(xenfb, - dx * (dw - 1) / 0x7fff, - dy * (dh - 1) / 0x7fff, - dz); - else + if (xenfb->abs_pointer_wanted) { + if (!xenfb->no_abs_rescale) { + xenfb_rescale_mouse(xenfb, &dx, &dy); + } + xenfb_send_position(xenfb, dx, dy, dz); + } else { xenfb_send_motion(xenfb, dx, dy, dz); + } for (i = 0 ; i < 8 ; i++) { int lastDown = xenfb->button_state & (1 << i); @@ -366,6 +382,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-no-abs-rescale", 1); return 0; } @@ -374,7 +391,17 @@ static int input_initialise(struct XenDevice *xendev) struct XenInput *in = container_of(xendev, struct XenInput, c.xendev); int rc; - if (!in->c.con) { + if (xenstore_read_fe_int(xendev, "request-abs-pointer", + &in->abs_pointer_wanted) == -1) { + in->abs_pointer_wanted = 0; + } + + if (xenstore_read_fe_int(xendev, "request-no-abs-rescale", + &in->no_abs_rescale) == -1) { + in->no_abs_rescale = 0; + } + + if (!in->c.con && !in->no_abs_rescale) { xen_be_printf(xendev, 1, "ds not set (yet)\n"); return -1; } @@ -390,11 +417,6 @@ static void input_connected(struct XenDevice *xendev) { struct XenInput *in = container_of(xendev, struct XenInput, c.xendev); - if (xenstore_read_fe_int(xendev, "request-abs-pointer", - &in->abs_pointer_wanted) == -1) { - in->abs_pointer_wanted = 0; - } - if (in->qmouse) { qemu_remove_mouse_event_handler(in->qmouse); } -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |