On Wed, Jun 04, 2014 at 09:44:06AM +0200, Gerd Hoffmann wrote: > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > --- > ui/input-legacy.c | 45 ++++++--------------------------------------- > 1 file changed, 6 insertions(+), 39 deletions(-) > > diff --git a/ui/input-legacy.c b/ui/input-legacy.c > index 2a53860..3025f50 100644 > --- a/ui/input-legacy.c > +++ b/ui/input-legacy.c > @@ -74,27 +74,6 @@ int index_from_key(const char *key) > return i; > } > > -static KeyValue **keyvalues; > -static int keyvalues_size; > -static QEMUTimer *key_timer; > - > -static void free_keyvalues(void) > -{ > - g_free(keyvalues); > - keyvalues = NULL; > - keyvalues_size = 0; > -} > - > -static void release_keys(void *opaque) > -{ > - while (keyvalues_size > 0) { > - qemu_input_event_send_key(NULL, keyvalues[--keyvalues_size], > - false); > - } > - > - free_keyvalues(); > -} > - > static KeyValue *copy_key_value(KeyValue *src) > { > KeyValue *dst = g_new(KeyValue, 1); > @@ -107,30 +86,18 @@ void qmp_send_key(KeyValueList *keys, bool > has_hold_time, int64_t hold_time, > { > KeyValueList *p; > > - if (!key_timer) { > - key_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, release_keys, NULL); > - } > - > - if (keyvalues != NULL) { > - timer_del(key_timer); > - release_keys(NULL); > - } > - > if (!has_hold_time) { > - hold_time = 100; > + hold_time = 0; /* use default */ > } > > for (p = keys; p != NULL; p = p->next) { > qemu_input_event_send_key(NULL, copy_key_value(p->value), true); > - > - keyvalues = g_realloc(keyvalues, sizeof(KeyValue *) * > - (keyvalues_size + 1)); > - keyvalues[keyvalues_size++] = copy_key_value(p->value); > + qemu_input_event_send_key_delay(hold_time); > + } > + for (p = keys; p != NULL; p = p->next) {
Hi Gerd, This patch caused a regression, it changed the releasing order When we send a serial keys together, the right order should be: press key1 press key2 press key3 release key3 release key2 release key1 We can check the events by shokey command in Linux. This regression will caused "sendkey Alt-Ctrl-Delete" doesn't work on some guests. Thanks, Amos > + qemu_input_event_send_key(NULL, copy_key_value(p->value), false); > + qemu_input_event_send_key_delay(hold_time); > } > - > - /* delayed key up events */ > - timer_mod(key_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + > - muldiv64(get_ticks_per_sec(), hold_time, 1000)); > } > > static void legacy_kbd_event(DeviceState *dev, QemuConsole *src, > -- > 1.8.3.1 > -- Amos.