All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] Slight monitor enhancements
@ 2005-12-23  0:32 andrzej zaborowski
  0 siblings, 0 replies; only message in thread
From: andrzej zaborowski @ 2005-12-23  0:32 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 781 bytes --]

Hello,
I'm attaching two patches:

One is for the monitor's "sendkey" command. It adds:
- a very basic <tab>-completion for the arguments of sendkey,
- the "plus" and "minus" keys so you can use ctrl-alt-plus and
ctrl-alt-minus while in X,
- posibility of giving keys as their scancode numbers, e.g. instead of
"sendkey a" you can issue "sendkey #30" or "sendkey #0x1e" or "sendkey
#036"

The second patch makes the readline save commands history to a file on
exit ("~/.qemu_history" by default) and load it from that file on init
(if the file exists).

I think the first patch is a useful and safe addition.
Regards,
Andrew
--
balrog 2oo5

Dear Outlook users: Please remove me from your address books
http://www.newsforge.com/article.pl?sid=03/08/21/143258

[-- Attachment #2: qemu-enhanced-sendkey.patch --]
[-- Type: application/octet-stream, Size: 1581 bytes --]

diff -Naur qemu/monitor.c qemu-keys/monitor.c
--- qemu/monitor.c	2005-12-05 20:31:52.000000000 +0000
+++ qemu-keys/monitor.c	2005-12-21 20:44:04.000000000 +0000
@@ -695,6 +695,8 @@
     { 0x31, "n" },
     { 0x32, "m" },
     
+    { 0x37, "asterisk" },
+
     { 0x39, "spc" },
     { 0x3a, "caps_lock" },
     { 0x3b, "f1" },
@@ -710,6 +712,9 @@
     { 0x45, "num_lock" },
     { 0x46, "scroll_lock" },
 
+    { 0x4a, "minus" },
+    { 0x4e, "plus" },
+
     { 0x56, "<" },
 
     { 0x57, "f11" },
@@ -735,11 +740,20 @@
 static int get_keycode(const char *key)
 {
     const KeyDef *p;
+    int ret;
+    char *endp;
 
     for(p = key_defs; p->name != NULL; p++) {
         if (!strcmp(key, p->name))
             return p->keycode;
     }
+
+    if (*key == '#') {
+        ret = strtoul(key + 1, &endp, 0);
+        if (ret > 0 && ret < 0x100 && *endp == 0)
+            return ret;
+    }
+
     return -1;
 }
 
@@ -2087,6 +2101,7 @@
     int nb_args, i, len;
     const char *ptype, *str;
     term_cmd_t *cmd;
+    const KeyDef *key;
 
     parse_cmdline(cmdline, &nb_args, args);
 #ifdef DEBUG_COMPLETION
@@ -2148,6 +2163,11 @@
                 for(cmd = info_cmds; cmd->name != NULL; cmd++) {
                     cmd_completion(str, cmd->name);
                 }
+            } else if (!strcmp(cmd->name, "sendkey")) {
+                completion_index = strlen(str);
+                for(key = key_defs; key->name != NULL; key++) {
+                    cmd_completion(str, key->name);
+                }
             }
             break;
         default:












[-- Attachment #3: qemu-history-save.patch --]
[-- Type: application/octet-stream, Size: 2893 bytes --]

diff -Naur qemu-keys/monitor.c qemu-history/monitor.c
--- qemu-keys/monitor.c	2005-12-21 20:44:04.000000000 +0000
+++ qemu-history/monitor.c	2005-12-22 23:03:50.000000000 +0000
@@ -2203,6 +2203,14 @@
     readline_start("(qemu) ", 0, monitor_handle_command1, NULL);
 }
 
+static void monitor_init_input(void)
+{
+    readline_history_restore();
+    atexit(readline_history_save);
+
+    monitor_start_input();
+}
+
 void monitor_init(CharDriverState *hd, int show_banner)
 {
     monitor_hd = hd;
@@ -2211,7 +2219,7 @@
                     QEMU_VERSION);
     }
     qemu_chr_add_read_handler(hd, term_can_read, term_read, NULL);
-    monitor_start_input();
+    monitor_init_input();
 }
 
 /* XXX: use threads ? */
diff -Naur qemu-keys/readline.c qemu-history/readline.c
--- qemu-keys/readline.c	2004-08-01 21:52:19.000000000 +0000
+++ qemu-history/readline.c	2005-12-22 22:52:51.000000000 +0000
@@ -26,6 +26,7 @@
 #define TERM_CMD_BUF_SIZE 4095
 #define TERM_MAX_CMDS 64
 #define NB_COMPLETIONS_MAX 256
+#define HISTORY_FILENAME ".qemu_history"
 
 #define IS_NORM 0
 #define IS_ESC  1
@@ -422,4 +423,65 @@
     return term_history[index];
 }
 
+static FILE *readline_open_historyfile(char *modes)
+{
+    char *filename, *home;
+    FILE *ret;
+
+    home = getenv("HOME");
+    if (!home)
+        return 0;
+
+    filename = qemu_malloc(strlen(home) + 1 + strlen(HISTORY_FILENAME) + 1);
+    if (!filename)
+        return 0;
+
+    sprintf(filename, "%s/" HISTORY_FILENAME, home);
+    ret = fopen(filename, modes);
+    qemu_free(filename);
 
+    return ret;
+}
+
+void readline_history_save(void)
+{
+    int idx;
+    FILE *fd;
+    const char *line;
+
+    fd = readline_open_historyfile("w");
+    if (!fd)
+        return;
+
+    idx = 0;
+    while ((line = readline_get_history(idx ++)))
+        fprintf(fd, "%s\n", line);
+
+    fclose(fd);
+}
+
+void readline_history_restore(void)
+{
+    int idx;
+    FILE *fd;
+    char line[TERM_CMD_BUF_SIZE + 1], *ret;
+
+    fd = readline_open_historyfile("r");
+    if (!fd)
+        return;
+
+    for (idx = 0; idx < TERM_MAX_CMDS; idx ++) {
+        ret = fgets(line, TERM_CMD_BUF_SIZE + 1, fd);
+        if (!ret || *line == 0 || *line == '\n')
+            break;
+
+        ret = strchr(line, '\n');
+        if (ret)
+            *ret = 0;
+
+        term_history[idx] = qemu_strdup(line);
+    }
+
+    fclose(fd);
+}
+/* vim: set ai ts=4 sw=4 et: */
diff -Naur qemu-keys/vl.h qemu-history/vl.h
--- qemu-keys/vl.h	2005-12-05 20:31:52.000000000 +0000
+++ qemu-history/vl.h	2005-12-22 22:53:41.000000000 +0000
@@ -967,6 +967,8 @@
 const char *readline_get_history(unsigned int index);
 void readline_start(const char *prompt, int is_password,
                     ReadLineFunc *readline_func, void *opaque);
+void readline_history_save(void);
+void readline_history_restore(void);
 
 void kqemu_record_dump(void);
 












^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-12-23  0:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-23  0:32 [Qemu-devel] [PATCH] Slight monitor enhancements andrzej zaborowski

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.