Patchwork vnc: improve capslock handling.

login
register
mail settings
Submitter Gerd Hoffmann
Date Nov. 2, 2009, 11:47 a.m.
Message ID <1257162426-10349-1-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/37413/
State New
Headers show

Comments

Gerd Hoffmann - Nov. 2, 2009, 11:47 a.m.
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>
---
 vnc.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)
Alexander Graf - Dec. 10, 2009, 2:05 p.m.
Gerd Hoffmann wrote:
> 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>
>   

This commit breaks the shift key in VNC for me.

Alex

Patch

diff --git a/vnc.c b/vnc.c
index 01e8e93..2bb8024 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);