Commit c5ce8333 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

vnc: add configurable keyboard delay



Limits the rate kbd events from the vnc server are forwarded to the
guest, so input devices which are typically low-bandwidth can keep
up even on bulky input.

v2: update documentation too.
v3: spell fixes.

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Tested-by: default avatarYang Hongyang <hongyang.yang@easystack.cn>
Message-id: 1464762150-25817-1-git-send-email-kraxel@redhat.com
parent 8efa5f29
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1410,6 +1410,14 @@ everybody else. 'ignore' completely ignores the shared flag and
allows everybody connect unconditionally.  Doesn't conform to the rfb
spec but is traditional QEMU behavior.

@item key-delay-ms

Set keyboard delay, for key down and key up events, in milliseconds.
Default is 1.  Keyboards are low-bandwidth devices, so this slowdown
can help the device and guest to keep up and not lose events in case
events are arriving in bulk.  Possible causes for the latter are flaky
network connections, or scripts for automated testing.

@end table
ETEXI

+11 −2
Original line number Diff line number Diff line
@@ -1629,6 +1629,7 @@ static void reset_keys(VncState *vs)
    for(i = 0; i < 256; i++) {
        if (vs->modifiers_state[i]) {
            qemu_input_event_send_key_number(vs->vd->dcl.con, i, false);
            qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
            vs->modifiers_state[i] = 0;
        }
    }
@@ -1638,9 +1639,9 @@ static void press_key(VncState *vs, int keysym)
{
    int keycode = keysym2scancode(vs->vd->kbd_layout, keysym) & SCANCODE_KEYMASK;
    qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, true);
    qemu_input_event_send_key_delay(0);
    qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
    qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
    qemu_input_event_send_key_delay(0);
    qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
}

static int current_led_state(VncState *vs)
@@ -1792,6 +1793,7 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)

    if (qemu_console_is_graphic(NULL)) {
        qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, down);
        qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
    } else {
        bool numlock = vs->modifiers_state[0x45];
        bool control = (vs->modifiers_state[0x1d] ||
@@ -1913,6 +1915,7 @@ static void vnc_release_modifiers(VncState *vs)
            continue;
        }
        qemu_input_event_send_key_number(vs->vd->dcl.con, keycode, false);
        qemu_input_event_send_key_delay(vs->vd->key_delay_ms);
    }
}

@@ -3277,6 +3280,9 @@ static QemuOptsList qemu_vnc_opts = {
        },{
            .name = "lock-key-sync",
            .type = QEMU_OPT_BOOL,
        },{
            .name = "key-delay-ms",
            .type = QEMU_OPT_NUMBER,
        },{
            .name = "sasl",
            .type = QEMU_OPT_BOOL,
@@ -3515,6 +3521,7 @@ void vnc_display_open(const char *id, Error **errp)
#endif
    int acl = 0;
    int lock_key_sync = 1;
    int key_delay_ms;

    if (!vs) {
        error_setg(errp, "VNC display not active");
@@ -3633,6 +3640,7 @@ void vnc_display_open(const char *id, Error **errp)

    reverse = qemu_opt_get_bool(opts, "reverse", false);
    lock_key_sync = qemu_opt_get_bool(opts, "lock-key-sync", true);
    key_delay_ms = qemu_opt_get_number(opts, "key-delay-ms", 1);
    sasl = qemu_opt_get_bool(opts, "sasl", false);
#ifndef CONFIG_VNC_SASL
    if (sasl) {
@@ -3764,6 +3772,7 @@ void vnc_display_open(const char *id, Error **errp)
    }
#endif
    vs->lock_key_sync = lock_key_sync;
    vs->key_delay_ms = key_delay_ms;

    device_id = qemu_opt_get(opts, "display");
    if (device_id) {
+1 −0
Original line number Diff line number Diff line
@@ -155,6 +155,7 @@ struct VncDisplay
    DisplayChangeListener dcl;
    kbd_layout_t *kbd_layout;
    int lock_key_sync;
    int key_delay_ms;
    QemuMutex mutex;

    QEMUCursor *cursor;