* [Qemu-devel] [PATCH] qemu monitor keyboard functionality
@ 2007-12-31 17:02 Noam Taich
2007-12-31 17:45 ` Samuel Thibault
0 siblings, 1 reply; 3+ messages in thread
From: Noam Taich @ 2007-12-31 17:02 UTC (permalink / raw)
To: qemu-devel
[-- Attachment #1.1: Type: text/plain, Size: 211 bytes --]
Qemu monitor had many missing keys that could not be (easily) sent,
And there was no mechanism for sending strings properly.
This patch fixes the problem and enhances the monitor's functionality.
[-- Attachment #1.2: Type: text/html, Size: 2006 bytes --]
[-- Attachment #2: qemu-monitor-key-patch.diff --]
[-- Type: application/octet-stream, Size: 7959 bytes --]
--- qemu-snapshot-2007-12-31_05/monitor.c 2007-12-31 05:11:10.000000000 +0200
+++ qemu/monitor.c 2007-12-31 18:24:14.000000000 +0200
@@ -763,119 +763,189 @@
typedef struct {
int keycode;
const char *name;
+ int need_shift;
} KeyDef;
static const KeyDef key_defs[] = {
- { 0x2a, "shift" },
- { 0x36, "shift_r" },
+ { 0x2a, "shift", 0 },
+ { 0x36, "shift_r", 0 },
- { 0x38, "alt" },
- { 0xb8, "alt_r" },
- { 0x1d, "ctrl" },
- { 0x9d, "ctrl_r" },
-
- { 0xdd, "menu" },
-
- { 0x01, "esc" },
-
- { 0x02, "1" },
- { 0x03, "2" },
- { 0x04, "3" },
- { 0x05, "4" },
- { 0x06, "5" },
- { 0x07, "6" },
- { 0x08, "7" },
- { 0x09, "8" },
- { 0x0a, "9" },
- { 0x0b, "0" },
- { 0x0c, "minus" },
- { 0x0d, "equal" },
- { 0x0e, "backspace" },
-
- { 0x0f, "tab" },
- { 0x10, "q" },
- { 0x11, "w" },
- { 0x12, "e" },
- { 0x13, "r" },
- { 0x14, "t" },
- { 0x15, "y" },
- { 0x16, "u" },
- { 0x17, "i" },
- { 0x18, "o" },
- { 0x19, "p" },
-
- { 0x1c, "ret" },
-
- { 0x1e, "a" },
- { 0x1f, "s" },
- { 0x20, "d" },
- { 0x21, "f" },
- { 0x22, "g" },
- { 0x23, "h" },
- { 0x24, "j" },
- { 0x25, "k" },
- { 0x26, "l" },
-
- { 0x2c, "z" },
- { 0x2d, "x" },
- { 0x2e, "c" },
- { 0x2f, "v" },
- { 0x30, "b" },
- { 0x31, "n" },
- { 0x32, "m" },
-
- { 0x39, "spc" },
- { 0x3a, "caps_lock" },
- { 0x3b, "f1" },
- { 0x3c, "f2" },
- { 0x3d, "f3" },
- { 0x3e, "f4" },
- { 0x3f, "f5" },
- { 0x40, "f6" },
- { 0x41, "f7" },
- { 0x42, "f8" },
- { 0x43, "f9" },
- { 0x44, "f10" },
- { 0x45, "num_lock" },
- { 0x46, "scroll_lock" },
-
- { 0xb5, "kp_divide" },
- { 0x37, "kp_multiply" },
- { 0x4a, "kp_subtract" },
- { 0x4e, "kp_add" },
- { 0x9c, "kp_enter" },
- { 0x53, "kp_decimal" },
-
- { 0x52, "kp_0" },
- { 0x4f, "kp_1" },
- { 0x50, "kp_2" },
- { 0x51, "kp_3" },
- { 0x4b, "kp_4" },
- { 0x4c, "kp_5" },
- { 0x4d, "kp_6" },
- { 0x47, "kp_7" },
- { 0x48, "kp_8" },
- { 0x49, "kp_9" },
-
- { 0x56, "<" },
-
- { 0x57, "f11" },
- { 0x58, "f12" },
-
- { 0xb7, "print" },
-
- { 0xc7, "home" },
- { 0xc9, "pgup" },
- { 0xd1, "pgdn" },
- { 0xcf, "end" },
-
- { 0xcb, "left" },
- { 0xc8, "up" },
- { 0xd0, "down" },
- { 0xcd, "right" },
+ { 0x38, "alt", 0 },
+ { 0xb8, "alt_r", 0 },
+ { 0x1d, "ctrl", 0 },
+ { 0x9d, "ctrl_r", 0 },
+
+ { 0xdd, "menu", 0 },
+
+ { 0x01, "esc", 0 },
+
+ { 0x02, "1", 0 },
+ { 0x03, "2", 0 },
+ { 0x04, "3", 0 },
+ { 0x05, "4", 0 },
+ { 0x06, "5", 0 },
+ { 0x07, "6", 0 },
+ { 0x08, "7", 0 },
+ { 0x09, "8", 0 },
+ { 0x0a, "9", 0 },
+ { 0x0b, "0", 0 },
+
+ { 0x02, "!", 1 },
+ { 0x03, "@", 1 },
+ { 0x04, "#", 1 },
+ { 0x05, "$", 1 },
+ { 0x06, "%", 1 },
+ { 0x07, "^", 1 },
+ { 0x08, "&", 1 },
+ { 0x09, "*", 1 },
+ { 0x0a, "(", 1 },
+ { 0x0b, ")", 1 },
+
+ { 0x0c, "minus", 0 },
+ { 0x0d, "equal", 0 },
+ { 0x0d, "=", 0 },
+ { 0x0e, "backspace", 0 },
+
+ { 0x0c, "_", 1 },
+
+ { 0x0f, "tab", 0 },
+ { 0x10, "q", 0 },
+ { 0x11, "w", 0 },
+ { 0x12, "e", 0 },
+ { 0x13, "r", 0 },
+ { 0x14, "t", 0 },
+ { 0x15, "y", 0 },
+ { 0x16, "u", 0 },
+ { 0x17, "i", 0 },
+ { 0x18, "o", 0 },
+ { 0x19, "p", 0 },
+
+ { 0x1c, "ret", 0 },
+
+ { 0x1e, "a", 0 },
+ { 0x1f, "s", 0 },
+ { 0x20, "d", 0 },
+ { 0x21, "f", 0 },
+ { 0x22, "g", 0 },
+ { 0x23, "h", 0 },
+ { 0x24, "j", 0 },
+ { 0x25, "k", 0 },
+ { 0x26, "l", 0 },
+
+ { 0x2c, "z", 0 },
+ { 0x2d, "x", 0 },
+ { 0x2e, "c", 0 },
+ { 0x2f, "v", 0 },
+ { 0x30, "b", 0 },
+ { 0x31, "n", 0 },
+ { 0x32, "m", 0 },
+
+ { 0x10, "Q", 1 },
+ { 0x11, "W", 1 },
+ { 0x12, "E", 1 },
+ { 0x13, "R", 1 },
+ { 0x14, "T", 1 },
+ { 0x15, "Y", 1 },
+ { 0x16, "U", 1 },
+ { 0x17, "I", 1 },
+ { 0x18, "O", 1 },
+ { 0x19, "P", 1 },
+
+ { 0x1e, "A", 1 },
+ { 0x1f, "S", 1 },
+ { 0x20, "D", 1 },
+ { 0x21, "F", 1 },
+ { 0x22, "G", 1 },
+ { 0x23, "H", 1 },
+ { 0x24, "J", 1 },
+ { 0x25, "K", 1 },
+ { 0x26, "L", 1 },
+
+ { 0x2c, "Z", 1 },
+ { 0x2d, "X", 1 },
+ { 0x2e, "C", 1 },
+ { 0x2f, "V", 1 },
+ { 0x30, "B", 1 },
+ { 0x31, "N", 1 },
+ { 0x32, "M", 1 },
+
+
+ { 0x1a, "[", 0 },
+ { 0x1b, "]", 0 },
+ { 0x1a, "{", 1 },
+ { 0x1b, "}", 1 },
+
+ { 0x27, ";", 0 },
+ { 0x28, "'", 0 },
+ { 0x29, "`", 0 },
+ { 0x2b, "\\", 0 },
+
+ { 0x27, ":", 1 },
+ { 0x28, "\"", 1 },
+ { 0x29, "~", 1 },
+ { 0x2b, "|", 1 },
+
+ { 0x33, ",", 0 },
+ { 0x34, ".", 0 },
+ { 0x35, "/", 0 },
+ { 0x33, "<", 1 },
+ { 0x34, ">", 1 },
+ { 0x35, "?", 1 },
+
+ { 0x39, "spc", 0 },
+ { 0x39, " ", 0 },
+ { 0x3a, "caps_lock", 0 },
+ { 0x3b, "f1", 0 },
+ { 0x3c, "f2", 0 },
+ { 0x3d, "f3", 0 },
+ { 0x3e, "f4", 0 },
+ { 0x3f, "f5", 0 },
+ { 0x40, "f6", 0 },
+ { 0x41, "f7", 0 },
+ { 0x42, "f8", 0 },
+ { 0x43, "f9", 0 },
+ { 0x44, "f10", 0 },
+ { 0x45, "num_lock", 0 },
+ { 0x46, "scroll_lock", 0 },
+
+ { 0x4a, "-", 0},
+ { 0x4e, "+", 0},
+
+ { 0xb5, "kp_divide", 0 },
+ { 0x37, "kp_multiply", 0 },
+ { 0x4a, "kp_subtract", 0 },
+ { 0x4e, "kp_add", 0 },
+ { 0x9c, "kp_enter", 0 },
+ { 0x53, "kp_decimal", 0 },
+
+ { 0x52, "kp_0", 0 },
+ { 0x4f, "kp_1", 0 },
+ { 0x50, "kp_2", 0 },
+ { 0x51, "kp_3", 0 },
+ { 0x4b, "kp_4", 0 },
+ { 0x4c, "kp_5", 0 },
+ { 0x4d, "kp_6", 0 },
+ { 0x47, "kp_7", 0 },
+ { 0x48, "kp_8", 0 },
+ { 0x49, "kp_9", 0 },
+
+ { 0x57, "f11", 0 },
+ { 0x58, "f12", 0 },
+
+ { 0xb7, "print", 0 },
+
+ { 0xc7, "home", 0 },
+ { 0xc9, "pgup", 0 },
+ { 0xd1, "pgdn", 0 },
+ { 0xcf, "end", 0 },
+
+ { 0xcb, "left", 0 },
+ { 0xc8, "up", 0 },
+ { 0xd0, "down", 0 },
+ { 0xcd, "right", 0 },
- { 0xd2, "insert" },
- { 0xd3, "delete" },
+ { 0xd2, "insert", 0 },
+ { 0xd3, "delete", 0 },
{ 0, NULL },
};
@@ -897,6 +967,17 @@
return -1;
}
+static int is_shift_needed(const char *key)
+{
+ const KeyDef *p;
+
+ for(p = key_defs; p->name != NULL; p++) {
+ if (!strcmp(key, p->name))
+ return p->need_shift;
+ }
+ return -1;
+}
+
static void do_send_key(const char *string)
{
char keybuf[16], *q;
@@ -941,6 +1022,50 @@
}
}
+static void do_send_string(const char *str)
+{
+ char keybuf[2];
+ const char *p = str;
+ int keycode;
+
+ keybuf[0] = '\0';
+ keybuf[1] = '\0';
+
+ while (*p != '\0') {
+ keybuf[0] = *p;
+ keycode = get_keycode(keybuf);
+ int shift_needed = is_shift_needed(keybuf);
+ if (keycode < 0) {
+ term_printf("unknown key: '%s'\n", keybuf);
+ return;
+ }
+
+ // Press shift if needed
+ if (shift_needed)
+ {
+ kbd_put_keycode(0x2a & 0x7f);
+ }
+
+ // Key down event
+ if (keycode & 0x80)
+ kbd_put_keycode(0xe0);
+ kbd_put_keycode(keycode & 0x7f);
+
+ // Key up event
+ if (keycode & 0x80)
+ kbd_put_keycode(0xe0);
+ kbd_put_keycode(keycode | 0x80);
+
+ // Release shift if needed
+ if (shift_needed)
+ {
+ kbd_put_keycode(0x2a | 0x80);
+ }
+
+ p++;
+ }
+}
+
static int mouse_button_state;
static void do_mouse_move(const char *dx_str, const char *dy_str,
@@ -1299,6 +1424,8 @@
{ "sendkey", "s", do_send_key,
"keys", "send keys to the VM (e.g. 'sendkey ctrl-alt-f1')" },
+ { "sendstring", "s", do_send_string,
+ "string", "send strings to the VM (e.g. 'sendstring abc')" },
{ "system_reset", "", do_system_reset,
"", "reset the system" },
{ "system_powerdown", "", do_system_powerdown,
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH] qemu monitor keyboard functionality
2007-12-31 17:02 [Qemu-devel] [PATCH] qemu monitor keyboard functionality Noam Taich
@ 2007-12-31 17:45 ` Samuel Thibault
2007-12-31 18:08 ` Noam Taich
0 siblings, 1 reply; 3+ messages in thread
From: Samuel Thibault @ 2007-12-31 17:45 UTC (permalink / raw)
To: qemu-devel
Noam Taich, le Mon 31 Dec 2007 09:02:08 -0800, a écrit :
> Qemu monitor had many missing keys that could not be (easily) sent,
>
> And there was no mechanism for sending strings properly.
>
> This patch fixes the problem and enhances the monitor's functionality.
Mmm, isn't there a keyboard layout issue? Far from all keyboards are US
qwerty...
Samuel
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [Qemu-devel] [PATCH] qemu monitor keyboard functionality
2007-12-31 17:45 ` Samuel Thibault
@ 2007-12-31 18:08 ` Noam Taich
0 siblings, 0 replies; 3+ messages in thread
From: Noam Taich @ 2007-12-31 18:08 UTC (permalink / raw)
To: qemu-devel
That would only mean that the monitor was suffering from the same problem before the patch, since the keys that were supported before were already layout-specific.
The patch does not intend to change the way the monitor works and improve its localization and internationalization support, just to extend existing functionalities.
More keys were added to the monitor using the layout that the existing keys were using.
Indeed, in the future it would be nice to have multiple keyboard layout support, which is indeed lacking right now, but for now, the monitor does not supply support for this, and was simply lacking many keys in what it does support, which is a much bigger problem.
So this patch is a step in the right direction.
This is as far as specific keys are concerned,
The "sendstring" addition seems to be just an important thing to have, and it is a bit useless with that many keys missing anyway.
-----Original Message-----
From: qemu-devel-bounces+noam.taich=qumranet.com@nongnu.org [mailto:qemu-devel-bounces+noam.taich=qumranet.com@nongnu.org] On Behalf Of Samuel Thibault
Sent: Monday, December 31, 2007 7:45 PM
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] qemu monitor keyboard functionality
Noam Taich, le Mon 31 Dec 2007 09:02:08 -0800, a écrit :
> Qemu monitor had many missing keys that could not be (easily) sent,
>
> And there was no mechanism for sending strings properly.
>
> This patch fixes the problem and enhances the monitor's functionality.
Mmm, isn't there a keyboard layout issue? Far from all keyboards are US
qwerty...
Samuel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-12-31 18:07 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-31 17:02 [Qemu-devel] [PATCH] qemu monitor keyboard functionality Noam Taich
2007-12-31 17:45 ` Samuel Thibault
2007-12-31 18:08 ` Noam Taich
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.