* [Qemu-devel] [PATCH v3] add input-send-event command
@ 2014-09-29 18:56 Marcelo Tosatti
2014-09-29 19:12 ` Eric Blake
0 siblings, 1 reply; 4+ messages in thread
From: Marcelo Tosatti @ 2014-09-29 18:56 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: Amos Kong, qemu-devel
Which allows specification of absolute/relative,
up/down and console parameters.
Suggested by Gerd Hoffman.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
---
qapi-schema.json | 17 +++++++++++++++
qmp-commands.hx | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
ui/input.c | 31 ++++++++++++++++++++++++++
3 files changed, 111 insertions(+)
diff --git a/qapi-schema.json b/qapi-schema.json
index 4bfaf20..2e9e261 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3233,6 +3233,23 @@
'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
#
# A discriminated record of NUMA options. (for OptsVisitor)
diff --git a/qmp-commands.hx b/qmp-commands.hx
index f581813..db7b5f1 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -3789,3 +3789,66 @@ Example:
-> { "execute": "trace-event-set-state", "arguments": { "name": "qemu_memalign", "enable": "true" } }
<- { "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
+its 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
diff --git a/ui/input.c b/ui/input.c
index 89d9db7..66f4108 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -122,6 +122,37 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
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;
+ }
+ qemu_input_event_send(con, event);
+ }
+ qemu_input_event_sync();
+}
+
static void qemu_input_transform_abs_rotate(InputEvent *evt)
{
switch (graphic_rotate) {
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] add input-send-event command
2014-09-29 18:56 [Qemu-devel] [PATCH v3] add input-send-event command Marcelo Tosatti
@ 2014-09-29 19:12 ` Eric Blake
2014-09-29 19:30 ` Marcelo Tosatti
0 siblings, 1 reply; 4+ messages in thread
From: Eric Blake @ 2014-09-29 19:12 UTC (permalink / raw)
To: Marcelo Tosatti, Gerd Hoffmann; +Cc: Amos Kong, qemu-devel
[-- Attachment #1: Type: text/plain, Size: 2984 bytes --]
On 09/29/2014 12:56 PM, Marcelo Tosatti wrote:
>
> Which allows specification of absolute/relative,
> up/down and console parameters.
>
> Suggested by Gerd Hoffman.
>
> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
>
> ---
> qapi-schema.json | 17 +++++++++++++++
> qmp-commands.hx | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> ui/input.c | 31 ++++++++++++++++++++++++++
> 3 files changed, 111 insertions(+)
>
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 4bfaf20..2e9e261 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -3233,6 +3233,23 @@
> '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' ] } }
'console' is mandatory; I guess that's okay.
Are we guaranteed that either all events are sent? Or is there a need to
worry about partial success (on a list of 3 events, the first gets sent,
then some error is encountered on the second, and the third is not
attempted)? Are the only errors due to something that can be detected
up front (such as trying to send a mouse event to a console that has
only keyboard support)?
> +The consoles are visible in the qom tree, under
> +/backend/console[$index]. They have a device link and head property, so
> +its possible to map which console belongs to which device and display.
s/its/it's/ (or 'it is')
> +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;
Ouch. You can return mid-loop. I'd be more comfortable with a two-pass
algorithm (first pass ensures all list elements have a handler, second
actually calls qemu_input_event_send) or with a return that gives an
integer count of how many list items were processed.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 539 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] add input-send-event command
2014-09-29 19:12 ` Eric Blake
@ 2014-09-29 19:30 ` Marcelo Tosatti
2014-09-30 6:51 ` Gerd Hoffmann
0 siblings, 1 reply; 4+ messages in thread
From: Marcelo Tosatti @ 2014-09-29 19:30 UTC (permalink / raw)
To: Eric Blake; +Cc: Amos Kong, Gerd Hoffmann, qemu-devel
On Mon, Sep 29, 2014 at 01:12:44PM -0600, Eric Blake wrote:
> On 09/29/2014 12:56 PM, Marcelo Tosatti wrote:
> >
> > Which allows specification of absolute/relative,
> > up/down and console parameters.
> >
> > Suggested by Gerd Hoffman.
> >
> > Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
> >
> > ---
> > qapi-schema.json | 17 +++++++++++++++
> > qmp-commands.hx | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > ui/input.c | 31 ++++++++++++++++++++++++++
> > 3 files changed, 111 insertions(+)
> >
> > diff --git a/qapi-schema.json b/qapi-schema.json
> > index 4bfaf20..2e9e261 100644
> > --- a/qapi-schema.json
> > +++ b/qapi-schema.json
> > @@ -3233,6 +3233,23 @@
> > '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' ] } }
>
> 'console' is mandatory; I guess that's okay.
>
> Are we guaranteed that either all events are sent? Or is there a need to
Events can be dropped at hardware level if the event queue is full, for
example. Would have to modify individual drivers to return error codes,
i suppose. Gerd?
> worry about partial success (on a list of 3 events, the first gets sent,
> then some error is encountered on the second, and the third is not
> attempted)? Are the only errors due to something that can be detected
> up front (such as trying to send a mouse event to a console that has
> only keyboard support)?
>
> > +The consoles are visible in the qom tree, under
> > +/backend/console[$index]. They have a device link and head property, so
> > +its possible to map which console belongs to which device and display.
>
> s/its/it's/ (or 'it is')
>
> > +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;
>
>
> Ouch. You can return mid-loop. I'd be more comfortable with a two-pass
> algorithm (first pass ensures all list elements have a handler, second
> actually calls qemu_input_event_send) or with a return that gives an
> integer count of how many list items were processed.
Sure.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH v3] add input-send-event command
2014-09-29 19:30 ` Marcelo Tosatti
@ 2014-09-30 6:51 ` Gerd Hoffmann
0 siblings, 0 replies; 4+ messages in thread
From: Gerd Hoffmann @ 2014-09-30 6:51 UTC (permalink / raw)
To: Marcelo Tosatti; +Cc: Amos Kong, qemu-devel
Hi,
> > 'console' is mandatory; I guess that's okay.
> >
> > Are we guaranteed that either all events are sent? Or is there a need to
>
> Events can be dropped at hardware level if the event queue is full, for
> example. Would have to modify individual drivers to return error codes,
> i suppose. Gerd?
Events can be dropped at hardware level indeed. Hard to check
beforehand, and we don't even return errors today as the ui code (which
would see the error) can't do much about it. Not sure this is worth
changing, this usually only happens in case the guest has trouble
driving the device, in which case you have bigger problems anyway.
Events can also be dropped because there is no device they can be
delivered to. This can easily be checked for the whole event list
before you start sending the events, just call qemu_input_find_handler()
and see whenever it returns a handler or not. So we can go for a
"all-or-nothing" model here. In the x86 world this can happen with
absolute mouse moves only because there is always a ps2 kbd+mouse.
cheers,
Gerd
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-09-30 6:52 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-29 18:56 [Qemu-devel] [PATCH v3] add input-send-event command Marcelo Tosatti
2014-09-29 19:12 ` Eric Blake
2014-09-29 19:30 ` Marcelo Tosatti
2014-09-30 6:51 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).