Message ID | 20140616231509.GA24935@amt.cnet |
---|---|
State | New |
Headers | show |
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
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?
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/
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.
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.
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) {