From: Luiz Capitulino <lcapitulino@redhat.com>
To: "Daniel P. Berrange" <berrange@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: Thu, 22 Jul 2010 10:28:39 -0300 [thread overview]
Message-ID: <20100722102839.3d84f616@redhat.com> (raw)
In-Reply-To: <20100721190656.GP21281@redhat.com>
On Wed, 21 Jul 2010 20:06:56 +0100
"Daniel P. Berrange" <berrange@redhat.com> wrote:
> 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
Right. That should be a user monitor's feature, not QMP's.
> > 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.
Hm, looks good to me, but then the hold time would be the time period
between the down/up commands. This won't be reliable in case the client
wants to exactly wait 100ms, as we can have network latency, for example.
Isn't this a problem? I believe VNC doesn't have this feature, right?
next prev parent reply other threads:[~2010-07-22 13:28 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-18 12:43 [PATCH] Monitor: Convert do_sendkey() to QObject, QError Michael Goldish
2010-07-18 12:43 ` [Qemu-devel] " Michael Goldish
2010-07-21 18:44 ` Luiz Capitulino
2010-07-21 19:06 ` Daniel P. Berrange
2010-07-22 13:28 ` Luiz Capitulino [this message]
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=20100722102839.3d84f616@redhat.com \
--to=lcapitulino@redhat.com \
--cc=berrange@redhat.com \
--cc=kvm@vger.kernel.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.