Skip to content

Commit

Permalink
vnc: add no-lock-key-sync option
Browse files Browse the repository at this point in the history
Add an option to disable the heuristics which try to keep
capslock and numlock state for guest and host in sync.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
  • Loading branch information
kraxel authored and Anthony Liguori committed Mar 17, 2010
1 parent af82117 commit 3a0558b
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 4 deletions.
16 changes: 12 additions & 4 deletions vnc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1110,7 +1110,8 @@ static void vnc_disconnect_finish(VncState *vs)
}

vnc_remove_timer(vs->vd);
qemu_remove_led_event_handler(vs->led);
if (vs->vd->lock_key_sync)
qemu_remove_led_event_handler(vs->led);
qemu_free(vs);
}

Expand Down Expand Up @@ -1549,7 +1550,8 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
break;
}

if (keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
if (vs->vd->lock_key_sync &&
keycode_is_keypad(vs->vd->kbd_layout, keycode)) {
/* If the numlock state needs to change then simulate an additional
keypress before sending this one. This will happen if the user
toggles numlock away from the VNC window.
Expand All @@ -1567,7 +1569,8 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
}
}

if ((sym >= 'A' && sym <= 'Z') || (sym >= 'a' && sym <= 'z')) {
if (vs->vd->lock_key_sync &&
((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.
Expand Down Expand Up @@ -2430,7 +2433,8 @@ static void vnc_connect(VncDisplay *vd, int csock)
vnc_flush(vs);
vnc_read_when(vs, protocol_version, 12);
reset_keys(vs);
vs->led = qemu_add_led_event_handler(kbd_leds, vs);
if (vs->vd->lock_key_sync)
vs->led = qemu_add_led_event_handler(kbd_leds, vs);

vnc_init_timer(vd);

Expand Down Expand Up @@ -2551,6 +2555,7 @@ int vnc_display_open(DisplayState *ds, const char *display)
int saslErr;
#endif
int acl = 0;
int lock_key_sync = 1;

if (!vnc_display)
return -1;
Expand All @@ -2568,6 +2573,8 @@ int vnc_display_open(DisplayState *ds, const char *display)
password = 1; /* Require password auth */
} else if (strncmp(options, "reverse", 7) == 0) {
reverse = 1;
} else if (strncmp(options, "no-lock-key-sync", 9) == 0) {
lock_key_sync = 0;
#ifdef CONFIG_VNC_SASL
} else if (strncmp(options, "sasl", 4) == 0) {
sasl = 1; /* Require SASL auth */
Expand Down Expand Up @@ -2713,6 +2720,7 @@ int vnc_display_open(DisplayState *ds, const char *display)
return -1;
}
#endif
vs->lock_key_sync = lock_key_sync;

if (reverse) {
/* connect to viewer */
Expand Down
1 change: 1 addition & 0 deletions vnc.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ struct VncDisplay
int lsock;
DisplayState *ds;
kbd_layout_t *kbd_layout;
int lock_key_sync;

struct VncSurface guest; /* guest visible surface (aka ds->surface) */
DisplaySurface *server; /* vnc server surface */
Expand Down

0 comments on commit 3a0558b

Please sign in to comment.