summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qapi-schema.json32
-rw-r--r--qmp-commands.hx17
-rw-r--r--ui/input.c15
3 files changed, 36 insertions, 28 deletions
diff --git a/qapi-schema.json b/qapi-schema.json
index 7b8f2a13e6..b6322398c6 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3829,24 +3829,24 @@
#
# Send input event(s) to guest.
#
-# @console: #optional console to send event(s) to.
-# This parameter can be used to send the input event to
-# specific input devices in case (a) multiple input devices
-# of the same kind are added to the virtual machine and (b)
-# you have configured input routing (see docs/multiseat.txt)
-# for those input devices. If input routing is not
-# configured this parameter has no effect.
-# If @console is missing, only devices that aren't associated
-# with a console are admissible.
-# If @console is specified, it must exist, and both devices
-# associated with that console and devices not associated with a
-# console are admissible, but the former take precedence.
-
-#
+# @device: #optional display device to send event(s) to.
+# @head: #optional head to send event(s) to, in case the
+# display device supports multiple scanouts.
# @events: List of InputEvent union.
#
# Returns: Nothing on success.
#
+# The @display and @head parameters can be used to send the input
+# event to specific input devices in case (a) multiple input devices
+# of the same kind are added to the virtual machine and (b) you have
+# configured input routing (see docs/multiseat.txt) for those input
+# devices. The parameters work exactly like the device and head
+# properties of input devices. If @device is missing, only devices
+# that have no input routing config are admissible. If @device is
+# specified, both input devices with and without input routing config
+# are admissible, but devices with input routing config take
+# precedence.
+
# Since: 2.2
#
# Note: this command is experimental, and not a stable API. Things that
@@ -3856,7 +3856,9 @@
#
##
{ 'command': 'x-input-send-event',
- 'data': { '*console':'int', 'events': [ 'InputEvent' ] } }
+ 'data': { '*device': 'str',
+ '*head' : 'int',
+ 'events' : [ 'InputEvent' ] } }
##
# @NumaOptions
diff --git a/qmp-commands.hx b/qmp-commands.hx
index 13f158d568..b1a2b97f87 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -4671,8 +4671,9 @@ Send input event to guest.
Arguments:
-- "console": console index. (json-int, optional)
-- "events": list of input events.
+- "device": display device (json-string, optional)
+- "head": display head (json-int, optional)
+- "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
@@ -4685,15 +4686,15 @@ Example (1):
Press left mouse button.
-> { "execute": "x-input-send-event",
- "arguments": { "console": 0,
+ "arguments": { "device": "video0",
"events": [ { "type": "btn",
- "data" : { "down": true, "button": "Left" } } ] } }
+ "data" : { "down": true, "button": "Left" } } ] } }
<- { "return": {} }
-> { "execute": "x-input-send-event",
- "arguments": { "console": 0,
+ "arguments": { "device": "video0",
"events": [ { "type": "btn",
- "data" : { "down": false, "button": "Left" } } ] } }
+ "data" : { "down": false, "button": "Left" } } ] } }
<- { "return": {} }
Example (2):
@@ -4701,7 +4702,7 @@ Example (2):
Press ctrl-alt-del.
-> { "execute": "x-input-send-event",
- "arguments": { "console": 0, "events": [
+ "arguments": { "events": [
{ "type": "key", "data" : { "down": true,
"key": {"type": "qcode", "data": "ctrl" } } },
{ "type": "key", "data" : { "down": true,
@@ -4715,7 +4716,7 @@ Example (3):
Move mouse pointer to absolute coordinates (20000, 400).
-> { "execute": "x-input-send-event" ,
- "arguments": { "console": 0, "events": [
+ "arguments": { "events": [
{ "type": "abs", "data" : { "axis": "X", "value" : 20000 } },
{ "type": "abs", "data" : { "axis": "Y", "value" : 400 } } ] } }
<- { "return": {} }
diff --git a/ui/input.c b/ui/input.c
index fce99bab40..0887bb54ca 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -119,17 +119,22 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
return NULL;
}
-void qmp_x_input_send_event(bool has_console, int64_t console,
+void qmp_x_input_send_event(bool has_device, const char *device,
+ bool has_head, int64_t head,
InputEventList *events, Error **errp)
{
InputEventList *e;
QemuConsole *con;
+ Error *err = NULL;
con = NULL;
- if (has_console) {
- con = qemu_console_lookup_by_index(console);
- if (!con) {
- error_setg(errp, "console %" PRId64 " not found", console);
+ if (has_device) {
+ if (!has_head) {
+ head = 0;
+ }
+ con = qemu_console_lookup_by_device_name(device, head, &err);
+ if (err) {
+ error_propagate(errp, err);
return;
}
}