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>
This commit is contained in:
Gerd Hoffmann 2009-11-02 12:47:06 +01:00 committed by Anthony Liguori
parent a00b233528
commit 6b1325029d

21
vnc.c
View File

@ -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 (is_graphic_console()) {
if (keycode & 0x80) if (keycode & 0x80)
kbd_put_keycode(0xe0); kbd_put_keycode(0xe0);