Send keys in vmx]
PATCH 1/1 Send keys in vmx]
keir,
this patch is borrowed from qemu and can send any key combination to vmx guest, which is useful when logging windows with "ctrl-alt-del".
could you pls. have a look?
thanks,
Quoted 8 lines · Dan D
After you change to the monitor in vmx using ctrl-alt-2, you can send /keys/ to the emulator. Use - to press several keys simultaneously. Example:
sendkey ctrl-alt-f1
This patch is useful to send keys that your graphical user interface intercepts at low level, such as ctrl-alt-f1 in X Window.
Quoted 6 lines
Signed-off-by Dan Xu <[email protected]>Signed-off-by Zhai, Edwin <[email protected]>Signed-off-by Xiaofeng Ling <[email protected]>
tools/ioemu/monitor.c +157 -0
@@ -232,6 +232,161 @@exit (0 ); } +typedef struct { +int keycode; +const char *name; +}KeyDef ; + +static const KeyDef key_defs[] = { + {0x2a ,"shift" }, + {0x36 ,"shift_r" }, + + {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" }, + {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" }, + + {0x56 ,"<" }, + + {0x57 ,"f11" }, + {0x58 ,"f12" }, + + {0xb7 ,"print" }, + + {0xc7 ,"home" }, + {0xc9 ,"pgup" }, + {0xd1 ,"pgdn" }, + {0xcf ,"end" }, + + {0xcb ,"left" }, + {0xc8 ,"up" }, + {0xd0 ,"down" }, + {0xcd ,"right" }, + + {0xd2 ,"insert" }, + {0xd3 ,"delete" }, + {0 ,NULL }, +}; + +static int get_keycode (const char *key) +{ +const KeyDef *p; + +for (p = key_defs; p->name !=NULL ; p++) { +if (!strcmp (key, p->name)) +return p->keycode; + } +return -1 ; +} + +static void do_send_key (const char *string) +{ +char keybuf[16 ], *q; +uint8_t keycodes[16 ]; +const char *p; +int nb_keycodes, keycode, i; + + nb_keycodes =0 ; + p = string; +while (*p !='\0' ) { + q = keybuf; +while (*p !='\0' && *p !='-' ) { +if ((q - keybuf) <sizeof (keybuf) -1 ) { + *q++ = *p; + } + p++; + } + *q ='\0' ; + keycode =get_keycode (keybuf); +if (keycode <0 ) { +term_printf ("unknown key: '%s'\n" , keybuf); +return ; + } + keycodes[nb_keycodes++] = keycode; +if (*p =='\0' ) +break ; + p++; + } +/* key down events */ +for (i =0 ; i < nb_keycodes; i++) { + keycode = keycodes[i]; +if (keycode &0x80 ) +kbd_put_keycode (0xe0 ); +kbd_put_keycode (keycode &0x7f ); + } +/* key up events */ +for (i = nb_keycodes -1 ; i >=0 ; i--) { + keycode = keycodes[i]; +if (keycode &0x80 ) +kbd_put_keycode (0xe0 ); +kbd_put_keycode (keycode |0x80 ); + } +} + +static int eject_device (BlockDriverState *bs,int force) {if (bdrv_is_inserted (bs)) {
@@ -331,6 +486,8 @@ "item1[,...]", "activate logging of the specified items to '/tmp/qemu.log'" }, {"q|quit" ,"" , do_quit, "", "quit the emulator" }, + { "sendkey", "s", do_send_key, + "keys", "send keys to the VM (e.g. 'sendkey ctrl-alt-f1')" }, { NULL, NULL, }, };
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel