mirror of https://gitee.com/openkylin/qemu.git
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 common c;
|
||||
int abs_pointer_wanted; /* Whether guest supports absolute pointer */
|
||||
int raw_pointer_wanted; /* Whether guest supports raw (unscaled) pointer */
|
||||
QemuInputHandlerState *qkbd;
|
||||
QemuInputHandlerState *qmou;
|
||||
int axis[INPUT_AXIS__MAX];
|
||||
|
@ -264,24 +265,28 @@ static void xenfb_mouse_event(DeviceState *dev, QemuConsole *src,
|
|||
|
||||
case INPUT_EVENT_KIND_ABS:
|
||||
move = evt->u.abs.data;
|
||||
con = qemu_console_lookup_by_index(0);
|
||||
if (!con) {
|
||||
xen_pv_printf(&xenfb->c.xendev, 0, "No QEMU console available");
|
||||
return;
|
||||
if (xenfb->raw_pointer_wanted) {
|
||||
xenfb->axis[move->axis] = move->value;
|
||||
} else {
|
||||
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;
|
||||
|
||||
case INPUT_EVENT_KIND_REL:
|
||||
|
@ -339,6 +344,7 @@ static QemuInputHandler xenfb_rel_mouse = {
|
|||
static int input_init(struct XenDevice *xendev)
|
||||
{
|
||||
xenstore_write_be_int(xendev, "feature-abs-pointer", 1);
|
||||
xenstore_write_be_int(xendev, "feature-raw-pointer", 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -362,6 +368,13 @@ static void input_connected(struct XenDevice *xendev)
|
|||
&in->abs_pointer_wanted) == -1) {
|
||||
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) {
|
||||
qemu_input_handler_unregister(in->qkbd);
|
||||
|
|
Loading…
Reference in New Issue