summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2009-11-02 12:47:06 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2009-11-12 11:23:56 -0600
commit6b1325029d80455b9da7cd7bd84a88cb915b867c (patch)
tree869ec237bbb21573aef59f736202d9e889f2d449
parenta00b2335282cad10ecc3e9c50030fb631f1c7d11 (diff)
downloadqemu-6b1325029d80455b9da7cd7bd84a88cb915b867c.tar.gz
vnc: improve capslock handling.
When capslock is toggled while the vnc window hasn't the focus qemu will miss the state change. Add sanity checks for the capslock state and toggle it if needed, so hosts and guests idea of capslock state stay in sync. Simliar logic for numlock is present in qemu already. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--vnc.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/vnc.c b/vnc.c
index 01e8e93489..2bb802469c 100644
--- a/vnc.c
+++ b/vnc.c
@@ -1377,6 +1377,27 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
}
}
+ if ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z')) {
+ /* If the capslock state needs to change then simulate an additional
+ keypress before sending this one. This will happen if the user
+ toggles capslock away from the VNC window.
+ */
+ int uppercase = !!(sym >= 'A' && sym <= 'Z');
+ int shift = !!(vs->modifiers_state[0x2a] | vs->modifiers_state[0x36]);
+ int capslock = !!(vs->modifiers_state[0x3a]);
+ if (capslock) {
+ if (uppercase == shift) {
+ vs->modifiers_state[0x3a] = 0;
+ press_key(vs, 0xffe5);
+ }
+ } else {
+ if (uppercase != shift) {
+ vs->modifiers_state[0x3a] = 1;
+ press_key(vs, 0xffe5);
+ }
+ }
+ }
+
if (is_graphic_console()) {
if (keycode & 0x80)
kbd_put_keycode(0xe0);