diff -r 7826e5482d42 tools/ioemu/vnc.c --- a/tools/ioemu/vnc.c Tue Nov 28 14:27:13 2006 +0000 +++ b/tools/ioemu/vnc.c Tue Nov 28 17:51:08 2006 -0500 @@ -114,6 +114,7 @@ struct VncState int visible_h; int ctl_keys; /* Ctrl+Alt starts calibration */ + int shift_keys; /* Shift / CapsLock keys */ }; #define DIRTY_PIXEL_BITS 64 @@ -442,7 +443,6 @@ static void vnc_copy(DisplayState *ds, i } else framebuffer_set_updated(vs, dst_x, dst_y, w, h); } - static int find_update_height(VncState *vs, int y, int maxy, int last_x, int x) { int h; @@ -870,9 +870,15 @@ static void do_key_event(VncState *vs, i } else if (down) { int qemu_keysym = 0; - if (sym <= 128) /* normal ascii */ - qemu_keysym = sym; - else { + if (sym <= 128) { /* normal ascii */ + int shifted = vs->shift_keys == 1 || vs->shift_keys == 2; + if (sym >= 'a' && sym <= 'z' && shifted) + qemu_keysym = sym + ('A' - 'a'); + else if (sym >= 'A' && sym <= 'Z' && !shifted) + qemu_keysym = sym - ('A' - 'a'); + else + qemu_keysym = sym; + } else { switch (sym) { case XK_Up: qemu_keysym = QEMU_KEY_UP; break; case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break; @@ -903,6 +909,10 @@ static void do_key_event(VncState *vs, i vs->ctl_keys |= 2; break; + case XK_Shift_L: + vs->shift_keys |= 1; + break; + default: break; } @@ -914,6 +924,17 @@ static void do_key_event(VncState *vs, i case XK_Alt_L: vs->ctl_keys &= ~2; + break; + + case XK_Shift_L: + vs->shift_keys &= ~1; + break; + + case XK_Caps_Lock: + if (vs->shift_keys & 2) + vs->shift_keys &= ~2; + else + vs->shift_keys |= 2; break; case XK_1 ... XK_9: