From: "Daniel P. Berrange" <berrange@redhat.com>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Michael Goldish <mgoldish@redhat.com>,
qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: Re: [Qemu-devel] [PATCH] Monitor: Convert do_sendkey() to QObject, QError
Date: Wed, 21 Jul 2010 20:06:56 +0100 [thread overview]
Message-ID: <20100721190656.GP21281@redhat.com> (raw)
In-Reply-To: <20100721154414.0e70823e@redhat.com>
On Wed, Jul 21, 2010 at 03:44:14PM -0300, Luiz Capitulino wrote:
> On Sun, 18 Jul 2010 15:43:55 +0300
> Michael Goldish <mgoldish@redhat.com> wrote:
>
> > Signed-off-by: Michael Goldish <mgoldish@redhat.com>
>
> Do you need this for 0.13? I think the development window is already closed.
>
> > ---
> > monitor.c | 15 ++++++++-------
> > qemu-monitor.hx | 22 +++++++++++++++++++++-
> > qerror.c | 12 ++++++++++++
> > qerror.h | 9 +++++++++
> > 4 files changed, 50 insertions(+), 8 deletions(-)
> >
> > diff --git a/monitor.c b/monitor.c
> > index d5377de..082c29d 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -1614,7 +1614,7 @@ static void release_keys(void *opaque)
> > }
> > }
> >
> > -static void do_sendkey(Monitor *mon, const QDict *qdict)
> > +static int do_sendkey(Monitor *mon, const QDict *qdict, QObject **ret_data)
> > {
> > char keyname_buf[16];
> > char *separator;
> > @@ -1636,18 +1636,18 @@ static void do_sendkey(Monitor *mon, const QDict *qdict)
> > if (keyname_len > 0) {
> > pstrcpy(keyname_buf, sizeof(keyname_buf), string);
> > if (keyname_len > sizeof(keyname_buf) - 1) {
> > - monitor_printf(mon, "invalid key: '%s...'\n", keyname_buf);
> > - return;
> > + qerror_report(QERR_INVALID_KEY, keyname_buf);
> > + return -1;
> > }
> > if (i == MAX_KEYCODES) {
> > - monitor_printf(mon, "too many keys\n");
> > - return;
> > + qerror_report(QERR_TOO_MANY_KEYS);
> > + return -1;
> > }
> > keyname_buf[keyname_len] = 0;
> > keycode = get_keycode(keyname_buf);
> > if (keycode < 0) {
> > - monitor_printf(mon, "unknown key: '%s'\n", keyname_buf);
> > - return;
> > + qerror_report(QERR_UNKNOWN_KEY, keyname_buf);
> > + return -1;
> > }
> > keycodes[i++] = keycode;
> > }
> > @@ -1666,6 +1666,7 @@ static void do_sendkey(Monitor *mon, const QDict *qdict)
> > /* delayed key up events */
> > qemu_mod_timer(key_timer, qemu_get_clock(vm_clock) +
> > muldiv64(get_ticks_per_sec(), hold_time, 1000));
> > + return 0;
> > }
> >
> > static int mouse_button_state;
> > diff --git a/qemu-monitor.hx b/qemu-monitor.hx
> > index f7e46c4..8b6cf09 100644
> > --- a/qemu-monitor.hx
> > +++ b/qemu-monitor.hx
> > @@ -532,7 +532,8 @@ ETEXI
> > .args_type = "string:s,hold_time:i?",
> > .params = "keys [hold_ms]",
> > .help = "send keys to the VM (e.g. 'sendkey ctrl-alt-f1', default hold time=100 ms)",
> > - .mhandler.cmd = do_sendkey,
> > + .user_print = monitor_user_noop,
> > + .mhandler.cmd_new = do_sendkey,
> > },
> >
> > STEXI
> > @@ -549,6 +550,25 @@ sendkey ctrl-alt-f1
> > This command is useful to send keys that your graphical user interface
> > intercepts at low level, such as @code{ctrl-alt-f1} in X Window.
> > ETEXI
> > +SQMP
> > +sendkey
> > +-------
> > +
> > +Send keys to the emulator.
> > +
> > +Arguments:
> > +
> > +- "string": key names or key codes in hexadecimal format separated by dashes (json-string)
>
> This is leaking bad stuff from the user monitor into QMP.
>
> I think we should have a "keys" key, which accepts an array of keys. Strings
> are key names, integers are key codes. Unfortunately, key codes will have to
> be specified in decimal.
I can see why keynames are nice in the text monitor, but is there a need
for JSON mode to accept keynames too ? If we're focusing on providing a
machine protocol, then keycodes seem like they sufficient to me. Apps can
using the command can provide symbol constants for the keycodes, or string
if actually needed by their end users
>
> Example:
>
> { "execute": "sendkey", "arguments": { "keys": ["foo", 10, "bar", 15] } }
>
> However, in order to maintain the current user monitor behavior, you will
> have to add a new args_type so that you can move the current parsing out
> of the handler to the user monitor parser. Then you'll have to change the
> handler to work with an array.
>
> A bit of work.
>
> Another related issue is that, this probably should an async handler. But
> as we don't have the proper infrastructure yet, I'm ok with having this in
> its current form.
>
> > +- "hold_time": duration in milliseconds to hold the keys down (json-int, optional, default=100)
Having 'hold-time' which applies to the full list of keys is limiting
the flexibility of apps. eg, it means you can only do
down ctrl
down alt
down f1
wait 100ms
up ctrl
up alt
up f1
Again I can see why the impl works this way currently, because it is
clearly a nicer option for humans. For a machine protocol though it
seems sub-optimal. What if app needed more flexibility over ordering
of press+release events eg to release in a different order
down ctrl
down alt
down f1
wait 100ms
up f1
up ctrl
up alt
Should we just follow VNC and explicitly have a up/down flag in
the protocol & let press & release events be sent separately.
{ "execute": "sendkey", "arguments": { "keycode": 0x31, "down": true } }
We could allow multiple keycodes in one message
{ "execute": "sendkey", "arguments": { "keycodes": [ 0x31, 0x32 ], "down": true } }
but its not really adding critical functionality that can't be got by
sending a sequence of sendkey commands in a row.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
next prev parent reply other threads:[~2010-07-21 19:07 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-18 12:43 [Qemu-devel] [PATCH] Monitor: Convert do_sendkey() to QObject, QError Michael Goldish
2010-07-21 18:44 ` Luiz Capitulino
2010-07-21 19:06 ` Daniel P. Berrange [this message]
2010-07-22 13:28 ` Luiz Capitulino
2010-07-22 13:45 ` Daniel P. Berrange
2010-07-22 13:50 ` Luiz Capitulino
2010-07-22 14:03 ` Daniel P. Berrange
2010-07-22 14:36 ` Luiz Capitulino
2010-07-21 20:30 ` Michael Goldish
2010-07-22 13:39 ` Luiz Capitulino
2010-07-22 21:17 ` Artyom Tarasenko
2010-07-22 22:27 ` Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100721190656.GP21281@redhat.com \
--to=berrange@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=lcapitulino@redhat.com \
--cc=mgoldish@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).