xenfb: Add [feature|request]-raw-pointer
Writes "feature-raw-pointer" during init to indicate the backend can pass raw unscaled values for absolute axes to the frontend. Frontends set "request-raw-pointer" to indicate the backend should not attempt to scale absolute values to console size. "request-raw-pointer" is only valid if "request-abs-pointer" is also set. Raw unscaled pointer values are in the range [0, 0x7fff] "feature-raw-pointer" and "request-raw-pointer" added to Xen header in commit 7868654ff7fe5e4a2eeae2b277644fa884a5031e Signed-off-by: Owen Smith <owen.smith@citrix.com> Reviewed-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
parent
a1ccbafded
commit
34975e536f
|
@ -52,6 +52,7 @@ struct common {
|
||||||
struct XenInput {
|
struct XenInput {
|
||||||
struct common c;
|
struct common c;
|
||||||
int abs_pointer_wanted; /* Whether guest supports absolute pointer */
|
int abs_pointer_wanted; /* Whether guest supports absolute pointer */
|
||||||
|
int raw_pointer_wanted; /* Whether guest supports raw (unscaled) pointer */
|
||||||
QemuInputHandlerState *qkbd;
|
QemuInputHandlerState *qkbd;
|
||||||
QemuInputHandlerState *qmou;
|
QemuInputHandlerState *qmou;
|
||||||
int axis[INPUT_AXIS__MAX];
|
int axis[INPUT_AXIS__MAX];
|
||||||
|
@ -264,24 +265,28 @@ static void xenfb_mouse_event(DeviceState *dev, QemuConsole *src,
|
||||||
|
|
||||||
case INPUT_EVENT_KIND_ABS:
|
case INPUT_EVENT_KIND_ABS:
|
||||||
move = evt->u.abs.data;
|
move = evt->u.abs.data;
|
||||||
con = qemu_console_lookup_by_index(0);
|
if (xenfb->raw_pointer_wanted) {
|
||||||
if (!con) {
|
xenfb->axis[move->axis] = move->value;
|
||||||
xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available");
|
} else {
|
||||||
return;
|
con = qemu_console_lookup_by_index(0);
|
||||||
|
if (!con) {
|
||||||
|
xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
surface = qemu_console_surface(con);
|
||||||
|
switch (move->axis) {
|
||||||
|
case INPUT_AXIS_X:
|
||||||
|
scale = surface_width(surface) - 1;
|
||||||
|
break;
|
||||||
|
case INPUT_AXIS_Y:
|
||||||
|
scale = surface_height(surface) - 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
scale = 0x8000;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
xenfb->axis[move->axis] = move->value * scale / 0x7fff;
|
||||||
}
|
}
|
||||||
surface = qemu_console_surface(con);
|
|
||||||
switch (move->axis) {
|
|
||||||
case INPUT_AXIS_X:
|
|
||||||
scale = surface_width(surface) - 1;
|
|
||||||
break;
|
|
||||||
case INPUT_AXIS_Y:
|
|
||||||
scale = surface_height(surface) - 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
scale = 0x8000;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
xenfb->axis[move->axis] = move->value * scale / 0x7fff;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INPUT_EVENT_KIND_REL:
|
case INPUT_EVENT_KIND_REL:
|
||||||
|
@ -339,6 +344,7 @@ static QemuInputHandler xenfb_rel_mouse = {
|
||||||
static int input_init(struct XenDevice *xendev)
|
static int input_init(struct XenDevice *xendev)
|
||||||
{
|
{
|
||||||
xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
|
xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
|
||||||
|
xenstore_write_be_int(xendev, "feature-raw-pointer", 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,6 +368,13 @@ static void input_connected(struct XenDevice *xendev)
|
||||||
&in->abs_pointer_wanted) == -1) {
|
&in->abs_pointer_wanted) == -1) {
|
||||||
in->abs_pointer_wanted = 0;
|
in->abs_pointer_wanted = 0;
|
||||||
}
|
}
|
||||||
|
if (xenstore_read_fe_int(xendev, "request-raw-pointer",
|
||||||
|
&in->raw_pointer_wanted) == -1) {
|
||||||
|
in->raw_pointer_wanted = 0;
|
||||||
|
}
|
||||||
|
if (in->raw_pointer_wanted && in->abs_pointer_wanted == 0) {
|
||||||
|
xen_pv_printf(xendev, 0, "raw pointer set without abs pointer");
|
||||||
|
}
|
||||||
|
|
||||||
if (in->qkbd) {
|
if (in->qkbd) {
|
||||||
qemu_input_handler_unregister(in->qkbd);
|
qemu_input_handler_unregister(in->qkbd);
|
||||||
|
|
Loading…
Reference in a new issue