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; } }