input: mouse: add graphic_rotate support

Transform absolute mouse events according to graphic_rotate.

Legacy input code does it for both absolute and relative events,
but the logic is broken for relative coordinates, so this is
most likely not used anyway.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
master
Gerd Hoffmann 2013-11-28 11:29:33 +01:00
parent 43579403a3
commit d3535431e8
1 changed files with 31 additions and 0 deletions

View File

@ -50,6 +50,31 @@ qemu_input_find_handler(uint32_t mask)
return NULL;
}
static void qemu_input_transform_abs_rotate(InputEvent *evt)
{
switch (graphic_rotate) {
case 90:
if (evt->abs->axis == INPUT_AXIS_X) {
evt->abs->axis = INPUT_AXIS_Y;
} else if (evt->abs->axis == INPUT_AXIS_Y) {
evt->abs->axis = INPUT_AXIS_X;
evt->abs->value = INPUT_EVENT_ABS_SIZE - 1 - evt->abs->value;
}
break;
case 180:
evt->abs->value = INPUT_EVENT_ABS_SIZE - 1 - evt->abs->value;
break;
case 270:
if (evt->abs->axis == INPUT_AXIS_X) {
evt->abs->axis = INPUT_AXIS_Y;
evt->abs->value = INPUT_EVENT_ABS_SIZE - 1 - evt->abs->value;
} else if (evt->abs->axis == INPUT_AXIS_Y) {
evt->abs->axis = INPUT_AXIS_X;
}
break;
}
}
void qemu_input_event_send(QemuConsole *src, InputEvent *evt)
{
QemuInputHandlerState *s;
@ -58,6 +83,12 @@ void qemu_input_event_send(QemuConsole *src, InputEvent *evt)
return;
}
/* pre processing */
if (graphic_rotate && (evt->kind == INPUT_EVENT_KIND_ABS)) {
qemu_input_transform_abs_rotate(evt);
}
/* send event */
s = qemu_input_find_handler(1 << evt->kind);
s->handler->event(s->dev, src, evt);
s->events++;