qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Jamie Lokier <jamie@shareable.org>
Cc: Kevin Wolf <kwolf@redhat.com>, Glauber Costa <glommer@gmail.com>,
	Mulyadi Santosa <mulyadi.santosa@gmail.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] new SDL keyboard shortcuts to start and stop VM
Date: Thu, 22 Oct 2009 12:40:36 -0200	[thread overview]
Message-ID: <20091022124036.5df991f3@doriath> (raw)
In-Reply-To: <20091021183503.GA27677@shareable.org>

On Wed, 21 Oct 2009 19:35:03 +0100
Jamie Lokier <jamie@shareable.org> wrote:

> Mulyadi Santosa wrote:
> > On Wed, Oct 21, 2009 at 11:24 PM, Glauber Costa <glommer@gmail.com> wrote:
> > > You can provide a monitor command to do that
> > >
> > > something in the lines of:
> > > - add_macro <key> <command_list>
> > > - remove_macro <key>
> > > - list_macros
> > 
> > Please CMIIW, "command_list" here refers to at least one of monitor
> > commands, right? meaning, i.e one could do:
> > add_macro ctrl_alt_shift_s "stop"
> > 
> > or extend that so it does:
> > add_macro ctrl_alt_shift_s "stop print $pc"
> > 
> > so, it stops the VM followed by printing program counter.
> 
> If the monitor accepted ";" as a command separator, to put multiple
> commands on a single line, <command_list> could just be a quoted
> string which is processed as a line.

 Why is ";" needed?

> If we're going to have keyboard macros, it would be nice and probably
> very easy to have monitor macros too - monitor commands which expand
> to a line in the same way.
> 
> The number of times I've typed things like send_key control-alt-del
> and would have appreciated a "cad" macro...

 Yeah, I agree.

 When testing migration, for example, I have to type 'migrate -d tcp:0:4444'
several times... Maybe there's a smarter way to do this, but the monitor
macros idea seems interesting to me.

> Syntax idea comes to mind is:
> 
>     - Add ";" as command separator.

 Not difficult, but not trivial.

>     - add_macro <name> <command-string>
>     - remove_macro <name>
>     - list_macros

 Why not macro_add?

> 
>     - add_key key <key> <command-string>
>     - remove_key <key> <command-string>
>     - list_keys

 What's key?

 Anyway, below there's a patch with an initial implementation. I've
implemented it using the "old" monitor style because I didn't want
to think about the right "object model" for this yet..

 If people think this is interesting I will work on a serious
implementation for submission.

 Ah, it doesn't have macro_del and if we use QObjects we can
consider saving its json representation in file so that we can
have macro_load.

commit e7fa305f82f4f99168166bda437e86d3a6343064
Author: Luiz Capitulino <lcapitulino@redhat.com>
Date:   Thu Oct 22 12:26:06 2009 -0200

    monitor: Add macro support
    
    This is a buggy, untested, initial implementation, which only supports
    "macro_add" and "macro_list".
    
    Example:
    
    (qemu) macro_add mi "migrate -d tcp:localhost:4444"
    
    Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>

diff --git a/monitor.c b/monitor.c
index 2566f4a..f8e2844 100644
--- a/monitor.c
+++ b/monitor.c
@@ -107,6 +107,15 @@ struct Monitor {
     QLIST_ENTRY(Monitor) entry;
 };
 
+typedef struct MonitorMacro {
+    QTAILQ_ENTRY(MonitorMacro) entry;
+    const char *name;
+    const char *command_line;
+} MonitorMacro;
+
+static QTAILQ_HEAD(monitor_macros, MonitorMacro) monitor_macros = 
+    QTAILQ_HEAD_INITIALIZER(monitor_macros);
+
 static QLIST_HEAD(mon_list, Monitor) mon_list;
 
 static const mon_cmd_t mon_cmds[];
@@ -1909,6 +1918,25 @@ static void do_closefd(Monitor *mon, const QDict *qdict)
                    fdname);
 }
 
+static void do_macro_add(Monitor *mon, const QDict *qdict)
+{
+    MonitorMacro *macro;
+
+    macro = qemu_mallocz(sizeof(*macro));
+    macro->name = qemu_strdup(qdict_get_str(qdict, "name"));
+    macro->command_line = qemu_strdup(qdict_get_str(qdict, "command"));
+
+    QTAILQ_INSERT_TAIL(&monitor_macros, macro, entry);
+}
+
+static void do_macro_list(Monitor *mon, const QDict *qdict)
+{
+    MonitorMacro *macro;
+
+    QTAILQ_FOREACH(macro, &monitor_macros, entry)
+        monitor_printf(mon, "%s: \"%s\"\n", macro->name, macro->command_line);
+}
+
 static void do_loadvm(Monitor *mon, const QDict *qdict)
 {
     int saved_vm_running  = vm_running;
@@ -2902,6 +2930,45 @@ static char *key_get_info(const char *type, char **key)
     return ++p;
 }
 
+static const mon_cmd_t *find_command(const char *cmdname)
+{
+    const mon_cmd_t *cmd;
+
+    /* find the command */
+    for (cmd = mon_cmds; cmd->name != NULL; cmd++) {
+        if (compare_cmd(cmdname, cmd->name))
+            return cmd;
+    }
+
+    return NULL;
+}
+
+static const mon_cmd_t *find_macro(char *cmdname, size_t len, const char **pos)
+{
+    const char *p;
+    MonitorMacro *macro;
+    const mon_cmd_t *cmd;
+
+    QTAILQ_FOREACH(macro, &monitor_macros, entry) {
+        if (strcmp(macro->name, cmdname) == 0)
+            break;
+    }
+
+    if (!macro)
+        return NULL;
+
+    p = get_command_name(macro->command_line, cmdname, len);
+    if (!p)
+        return NULL;
+
+    cmd = find_command(cmdname);
+    if (!cmd)
+        return NULL;
+
+    *pos = p;
+    return cmd;
+}
+
 static int default_fmt_format = 'x';
 static int default_fmt_size = 4;
 
@@ -2927,15 +2994,13 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
     if (!p)
         return NULL;
 
-    /* find the command */
-    for(cmd = mon_cmds; cmd->name != NULL; cmd++) {
-        if (compare_cmd(cmdname, cmd->name))
-            break;
-    }
-
-    if (cmd->name == NULL) {
-        monitor_printf(mon, "unknown command: '%s'\n", cmdname);
-        return NULL;
+    cmd = find_macro(cmdname, sizeof(cmdname), &p);
+    if (!cmd) {
+        cmd = find_command(cmdname);
+        if (!cmd) {
+            monitor_printf(mon, "unknown command: '%s'\n", cmdname);
+            return NULL;
+        }
     }
 
     /* parse the parameters */
diff --git a/qemu-monitor.hx b/qemu-monitor.hx
index 29999c6..37561be 100644
--- a/qemu-monitor.hx
+++ b/qemu-monitor.hx
@@ -1031,6 +1031,30 @@ Close the file descriptor previously assigned to @var{fdname} using the
 used by another monitor command.
 ETEXI
 
+    {
+        .name       = "macro_add",
+        .args_type  = "name:s,command:s",
+        .params     = "name command",
+        .help       = "add a new monitor macro",
+        .mhandler.cmd = do_macro_add,
+    },
+
+STEXI
+@item macro_add @var{name} @var{command}
+ETEXI
+
+    {
+        .name       = "macro_list",
+        .args_type  = "",
+        .params     = "",
+        .help       = "list monitor macros",
+        .mhandler.cmd = do_macro_list,
+    },
+
+STEXI
+@item macro_list
+ETEXI
+
 STEXI
 @end table
 ETEXI

  reply	other threads:[~2009-10-22 14:40 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-18 16:24 [Qemu-devel] [PATCH] new SDL keyboard shortcuts to start and stop VM Mulyadi Santosa
2009-10-19 22:20 ` Anthony Liguori
2009-10-20  3:16   ` Mulyadi Santosa
2009-10-20  7:58     ` Gerd Hoffmann
2009-10-20  8:12     ` Daniel P. Berrange
2009-10-20 10:40   ` Kevin Wolf
2009-10-20 16:59     ` Anthony Liguori
2009-10-20 17:08     ` Daniel P. Berrange
2009-10-20 22:14       ` Mulyadi Santosa
2009-10-21  7:27       ` Kevin Wolf
2009-10-21 13:52         ` Glauber Costa
2009-10-21 16:04           ` Mulyadi Santosa
2009-10-21 16:24             ` Glauber Costa
2009-10-21 16:44               ` Mulyadi Santosa
2009-10-21 16:48                 ` Glauber Costa
2009-10-21 18:35                 ` Jamie Lokier
2009-10-22 14:40                   ` Luiz Capitulino [this message]
2009-10-22 15:02                     ` Kevin Wolf
2009-10-22 16:32                       ` Luiz Capitulino
2009-10-22 15:40                     ` Anthony Liguori
2009-10-22 16:38                       ` Luiz Capitulino
2009-10-22 18:32                         ` Anthony Liguori
     [not found]                           ` <m33a5bj851.fsf@neno.mitica>
2009-10-23  7:40                             ` [Qemu-devel] " Kevin Wolf
2009-10-23 11:23                               ` Mulyadi Santosa
2009-10-23 11:45                                 ` Kevin Wolf
2009-10-23 13:59                                   ` Anthony Liguori
2009-10-23 14:36                                     ` Kevin Wolf
2009-10-25 15:28                                     ` Avi Kivity
2009-10-25 15:44                                       ` Luiz Capitulino
2009-10-26 13:45                                       ` Anthony Liguori
2009-10-26 14:13                                         ` Avi Kivity
2009-10-26 15:04                                           ` Anthony Liguori
2009-10-26 15:07                                             ` Avi Kivity
2009-10-26 15:49                                               ` Anthony Liguori
2009-10-26 16:08                                                 ` Avi Kivity
2009-10-26 16:17                                                   ` Anthony Liguori
2009-10-27  9:11                                                   ` Gerd Hoffmann
2009-10-27  9:28                                                     ` Avi Kivity
2009-10-21 16:55           ` [Qemu-devel] " Anthony Liguori
2009-10-21 17:01             ` Mulyadi Santosa
2009-10-21 17:04             ` Glauber Costa
2009-10-21 18:08               ` Anthony Liguori
2009-10-22  7:58                 ` Kevin Wolf

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=20091022124036.5df991f3@doriath \
    --to=lcapitulino@redhat.com \
    --cc=glommer@gmail.com \
    --cc=jamie@shareable.org \
    --cc=kwolf@redhat.com \
    --cc=mulyadi.santosa@gmail.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).