add input-send-event command
Which allows specification of absolute/relative, up/down and console parameters. Suggested by Gerd Hoffman. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
e37f202450
commit
50c6617fcb
|
@ -3232,6 +3232,23 @@
|
||||||
'rel' : 'InputMoveEvent',
|
'rel' : 'InputMoveEvent',
|
||||||
'abs' : 'InputMoveEvent' } }
|
'abs' : 'InputMoveEvent' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @input-send-event
|
||||||
|
#
|
||||||
|
# Send input event(s) to guest.
|
||||||
|
#
|
||||||
|
# @console: Which console to send event(s) to.
|
||||||
|
#
|
||||||
|
# @events: List of InputEvent union.
|
||||||
|
#
|
||||||
|
# Returns: Nothing on success.
|
||||||
|
#
|
||||||
|
# Since: 2.2
|
||||||
|
#
|
||||||
|
##
|
||||||
|
{ 'command': 'input-send-event',
|
||||||
|
'data': { 'console':'int', 'events': [ 'InputEvent' ] } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @NumaOptions
|
# @NumaOptions
|
||||||
#
|
#
|
||||||
|
|
|
@ -3788,4 +3788,67 @@ Example:
|
||||||
|
|
||||||
-> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } }
|
-> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } }
|
||||||
<- { "return": {} }
|
<- { "return": {} }
|
||||||
|
EQMP
|
||||||
|
|
||||||
|
{
|
||||||
|
.name = "input-send-event",
|
||||||
|
.args_type = "console:i,events:q",
|
||||||
|
.mhandler.cmd_new = qmp_marshal_input_input_send_event,
|
||||||
|
},
|
||||||
|
|
||||||
|
SQMP
|
||||||
|
@input-send-event
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Send input event to guest.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
- "console": console index.
|
||||||
|
- "events": list of input events.
|
||||||
|
|
||||||
|
The consoles are visible in the qom tree, under
|
||||||
|
/backend/console[$index]. They have a device link and head property, so
|
||||||
|
it is possible to map which console belongs to which device and display.
|
||||||
|
|
||||||
|
Example (1):
|
||||||
|
|
||||||
|
Press left mouse button.
|
||||||
|
|
||||||
|
-> { "execute": "input-send-event",
|
||||||
|
"arguments": { "console": 0,
|
||||||
|
"events": [ { "type": "btn",
|
||||||
|
"data" : { "down": true, "button": "Left" } } } }
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
-> { "execute": "input-send-event",
|
||||||
|
"arguments": { "console": 0,
|
||||||
|
"events": [ { "type": "btn",
|
||||||
|
"data" : { "down": false, "button": "Left" } } } }
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
Example (2):
|
||||||
|
|
||||||
|
Press ctrl-alt-del.
|
||||||
|
|
||||||
|
-> { "execute": "input-send-event",
|
||||||
|
"arguments": { "console": 0, "events": [
|
||||||
|
{ "type": "key", "data" : { "down": true,
|
||||||
|
"key": {"type": "qcode", "data": "ctrl" } } },
|
||||||
|
{ "type": "key", "data" : { "down": true,
|
||||||
|
"key": {"type": "qcode", "data": "alt" } } },
|
||||||
|
{ "type": "key", "data" : { "down": true,
|
||||||
|
"key": {"type": "qcode", "data": "delete" } } } ] } }
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
|
Example (3):
|
||||||
|
|
||||||
|
Move mouse pointer to absolute coordinates (20000, 400).
|
||||||
|
|
||||||
|
-> { "execute": "input-send-event" ,
|
||||||
|
"arguments": { "console": 0, "events": [
|
||||||
|
{ "type": "abs", "data" : { "axis": "X", "value" : 20000 } },
|
||||||
|
{ "type": "abs", "data" : { "axis": "Y", "value" : 400 } } ] } }
|
||||||
|
<- { "return": {} }
|
||||||
|
|
||||||
EQMP
|
EQMP
|
||||||
|
|
37
ui/input.c
37
ui/input.c
|
@ -122,6 +122,43 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qmp_input_send_event(int64_t console, InputEventList *events,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
InputEventList *e;
|
||||||
|
QemuConsole *con;
|
||||||
|
|
||||||
|
con = qemu_console_lookup_by_index(console);
|
||||||
|
if (!con) {
|
||||||
|
error_setg(errp, "console %" PRId64 " not found", console);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
|
||||||
|
error_setg(errp, "VM not running");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (e = events; e != NULL; e = e->next) {
|
||||||
|
InputEvent *event = e->value;
|
||||||
|
|
||||||
|
if (!qemu_input_find_handler(1 << event->kind, con)) {
|
||||||
|
error_setg(errp, "Input handler not found for "
|
||||||
|
"event type %s",
|
||||||
|
InputEventKind_lookup[event->kind]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (e = events; e != NULL; e = e->next) {
|
||||||
|
InputEvent *event = e->value;
|
||||||
|
|
||||||
|
qemu_input_event_send(con, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
qemu_input_event_sync();
|
||||||
|
}
|
||||||
|
|
||||||
static void qemu_input_transform_abs_rotate(InputEvent *evt)
|
static void qemu_input_transform_abs_rotate(InputEvent *evt)
|
||||||
{
|
{
|
||||||
switch (graphic_rotate) {
|
switch (graphic_rotate) {
|
||||||
|
|
Loading…
Reference in New Issue