diff mbox

add input-send-event command

Message ID 20140616231509.GA24935@amt.cnet
State New
Headers show

Commit Message

Marcelo Tosatti June 16, 2014, 11:15 p.m. UTC
Which allows specification of absolute/relative, 
up/down and console parameters.

Suggested by Gerd Hoffman.

---
 qapi-schema.json |   18 ++++++++++++++++
 qmp-commands.hx  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ui/input.c       |   31 ++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)

Comments

Gerd Hoffmann June 17, 2014, 9:02 a.m. UTC | #1
On Mo, 2014-06-16 at 20:15 -0300, Marcelo Tosatti wrote:
> Which allows specification of absolute/relative, 
> up/down and console parameters.

Looks good overall, only minor nits.  Will wait for acks from qmp guys
before picking into input branch.

> Suggested by Gerd Hoffman.

Huh?  Signed-off missing ...

> +Press left mouse button.
> +
> +-> { "execute": "input-send-event",
> +    "arguments": { "console": 0,
> +                   "events": [ { "type": "btn",
> +                    "data" : { "down": true, "button": "Left" } },
> +                    { "type": "btn",
> +                      "data" : { "down": false, "button": "Left" } } ] } }
> +<- { "return": {} }

Bad example.  Down + up should go as separate commands (so you have a
sync inbetween), otherwise it might happen that the guest doesn't see
the button event at all.

cheers,
  Gerd
Eric Blake June 17, 2014, 11:54 a.m. UTC | #2
On 06/17/2014 03:02 AM, Gerd Hoffmann wrote:
> On Mo, 2014-06-16 at 20:15 -0300, Marcelo Tosatti wrote:
>> Which allows specification of absolute/relative, 
>> up/down and console parameters.
> 
> Looks good overall, only minor nits.  Will wait for acks from qmp guys
> before picking into input branch.
> 
>> Suggested by Gerd Hoffman.
> 
> Huh?  Signed-off missing ...
> 
>> +Press left mouse button.
>> +
>> +-> { "execute": "input-send-event",
>> +    "arguments": { "console": 0,
>> +                   "events": [ { "type": "btn",
>> +                    "data" : { "down": true, "button": "Left" } },
>> +                    { "type": "btn",
>> +                      "data" : { "down": false, "button": "Left" } } ] } }
>> +<- { "return": {} }
> 
> Bad example.  Down + up should go as separate commands (so you have a
> sync inbetween), otherwise it might happen that the guest doesn't see
> the button event at all.

Would it be worth adding a command to the union of possible events that
adds a pause?  As in:

-> { "execute": "input-send-event",
    "arguments": { "console": 0,
                   "events": [
                    { "type": "btn",
                      "data" : { "down": true, "button": "Left" } },
                    { "type": "pause", "data": { "duration": 10 } },
                    { "type": "btn",
                      "data" : { "down": false, "button": "Left" } } ] } }

that sticks a 10 ms delay between the other two events?
Eric Blake June 17, 2014, 11:59 a.m. UTC | #3
On 06/16/2014 05:15 PM, Marcelo Tosatti wrote:
> 
> Which allows specification of absolute/relative, 
> up/down and console parameters.
> 
> Suggested by Gerd Hoffman.
> 
> ---

Needs S-o-B.

>  qapi-schema.json |   18 ++++++++++++++++
>  qmp-commands.hx  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  ui/input.c       |   31 ++++++++++++++++++++++++++++
>  3 files changed, 108 insertions(+)
> 
> Index: qemu/qapi-schema.json
> ===================================================================
> --- qemu.orig/qapi-schema.json	2014-06-16 20:12:51.049064621 -0300
> +++ qemu/qapi-schema.json	2014-06-16 20:13:42.886920723 -0300
> @@ -4722,3 +4722,21 @@
>                'btn'     : 'InputBtnEvent',
>                'rel'     : 'InputMoveEvent',
>                'abs'     : 'InputMoveEvent' } }
> +
> +##
> +# @input-send-event
> +#
> +# Send input event(s) to guest.
> +#
> +# @console: Which console to send event(s) to.

Is it worth requiring console, or can it be optional and default to the
first available console (usually console 0)?

> +#
> +# @events: List of InputEvent union.
> +#
> +# Returns: Nothing on success.
> +#
> +# Since: 2.1
> +#
> +##
> +{ 'command': 'input-send-event',
> +  'data': { 'console':'int', 'events': [ 'InputEvent' ] } }

See my other mail about possibly extending the InputEvent union (or
creating a new subtype) to add delays into the mix.


> +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": {} }

Don't you also need to send the key-release events (again, possibly
after a pause), for this to work?


> +        if (!qemu_input_find_handler(1 << event->kind, con)) {
> +            error_setg(errp, "Input handler not found for"
> +                             "event type %s",

Typo: s/forevent/for event/
Marcelo Tosatti June 17, 2014, 1:41 p.m. UTC | #4
On Tue, Jun 17, 2014 at 05:54:35AM -0600, Eric Blake wrote:
> On 06/17/2014 03:02 AM, Gerd Hoffmann wrote:
> > On Mo, 2014-06-16 at 20:15 -0300, Marcelo Tosatti wrote:
> >> Which allows specification of absolute/relative, 
> >> up/down and console parameters.
> > 
> > Looks good overall, only minor nits.  Will wait for acks from qmp guys
> > before picking into input branch.
> > 
> >> Suggested by Gerd Hoffman.
> > 
> > Huh?  Signed-off missing ...
> > 
> >> +Press left mouse button.
> >> +
> >> +-> { "execute": "input-send-event",
> >> +    "arguments": { "console": 0,
> >> +                   "events": [ { "type": "btn",
> >> +                    "data" : { "down": true, "button": "Left" } },
> >> +                    { "type": "btn",
> >> +                      "data" : { "down": false, "button": "Left" } } ] } }
> >> +<- { "return": {} }
> > 
> > Bad example.  Down + up should go as separate commands (so you have a
> > sync inbetween), otherwise it might happen that the guest doesn't see
> > the button event at all.
> 
> Would it be worth adding a command to the union of possible events that
> adds a pause?  As in:
> 
> -> { "execute": "input-send-event",
>     "arguments": { "console": 0,
>                    "events": [
>                     { "type": "btn",
>                       "data" : { "down": true, "button": "Left" } },
>                     { "type": "pause", "data": { "duration": 10 } },
>                     { "type": "btn",
>                       "data" : { "down": false, "button": "Left" } } ] } }
> 
> that sticks a 10 ms delay between the other two events?

Would rather have the user wait 10 ms in between QMP commands.
Marcelo Tosatti June 17, 2014, 1:46 p.m. UTC | #5
On Tue, Jun 17, 2014 at 05:59:53AM -0600, Eric Blake wrote:
> On 06/16/2014 05:15 PM, Marcelo Tosatti wrote:
> > 
> > Which allows specification of absolute/relative, 
> > up/down and console parameters.
> > 
> > Suggested by Gerd Hoffman.
> > 
> > ---
> 
> Needs S-o-B.
> 
> >  qapi-schema.json |   18 ++++++++++++++++
> >  qmp-commands.hx  |   59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  ui/input.c       |   31 ++++++++++++++++++++++++++++
> >  3 files changed, 108 insertions(+)
> > 
> > Index: qemu/qapi-schema.json
> > ===================================================================
> > --- qemu.orig/qapi-schema.json	2014-06-16 20:12:51.049064621 -0300
> > +++ qemu/qapi-schema.json	2014-06-16 20:13:42.886920723 -0300
> > @@ -4722,3 +4722,21 @@
> >                'btn'     : 'InputBtnEvent',
> >                'rel'     : 'InputMoveEvent',
> >                'abs'     : 'InputMoveEvent' } }
> > +
> > +##
> > +# @input-send-event
> > +#
> > +# Send input event(s) to guest.
> > +#
> > +# @console: Which console to send event(s) to.
> 
> Is it worth requiring console, or can it be optional and default to the
> first available console (usually console 0)?

It is required. Would rather not allow the user to send a command
to an console without knowing what console that is.

> > +#
> > +# @events: List of InputEvent union.
> > +#
> > +# Returns: Nothing on success.
> > +#
> > +# Since: 2.1
> > +#
> > +##
> > +{ 'command': 'input-send-event',
> > +  'data': { 'console':'int', 'events': [ 'InputEvent' ] } }
> 
> See my other mail about possibly extending the InputEvent union (or
> creating a new subtype) to add delays into the mix.
> 
> 
> > +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": {} }
> 
> Don't you also need to send the key-release events (again, possibly
> after a pause), for this to work?

No, key signals on "down".

> > +        if (!qemu_input_find_handler(1 << event->kind, con)) {
> > +            error_setg(errp, "Input handler not found for"
> > +                             "event type %s",
> 
> Typo: s/forevent/for event/

Yes there is another missing space, thanks.
diff mbox

Patch

Index: qemu/qapi-schema.json
===================================================================
--- qemu.orig/qapi-schema.json	2014-06-16 20:12:51.049064621 -0300
+++ qemu/qapi-schema.json	2014-06-16 20:13:42.886920723 -0300
@@ -4722,3 +4722,21 @@ 
               'btn'     : 'InputBtnEvent',
               'rel'     : '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.1
+#
+##
+{ 'command': 'input-send-event',
+  'data': { 'console':'int', 'events': [ 'InputEvent' ] } }
+
Index: qemu/qmp-commands.hx
===================================================================
--- qemu.orig/qmp-commands.hx	2014-06-16 20:12:51.050064619 -0300
+++ qemu/qmp-commands.hx	2014-06-16 20:13:42.888920718 -0300
@@ -3572,3 +3572,62 @@ 
                    } } ] }
 
 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" } },
+                    { "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
Index: qemu/ui/input.c
===================================================================
--- qemu.orig/ui/input.c	2014-06-16 20:12:51.051064616 -0300
+++ qemu/ui/input.c	2014-06-16 20:13:42.888920718 -0300
@@ -102,6 +102,37 @@ 
     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) {