From e37f20245080b4fa77aa312b01853dab42be85a9 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 26 Sep 2014 10:02:16 +0200 Subject: input: fix send-key monitor command release event ordering commit 2e377f1730d06deafb3e3ef6cf88792de4a6f4df changed the ordering of the release events as side effect. Some guests are not happy with that and don't recognise ctrl-alt-del any more. This patch restores the old last-pressed first-released behavior. Cc: Amos Kong Signed-off-by: Gerd Hoffmann --- ui/input-legacy.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'ui') diff --git a/ui/input-legacy.c b/ui/input-legacy.c index 3025f50f49..a698a342bc 100644 --- a/ui/input-legacy.c +++ b/ui/input-legacy.c @@ -85,6 +85,8 @@ void qmp_send_key(KeyValueList *keys, bool has_hold_time, int64_t hold_time, Error **errp) { KeyValueList *p; + KeyValue **up = NULL; + int count = 0; if (!has_hold_time) { hold_time = 0; /* use default */ @@ -93,11 +95,16 @@ void qmp_send_key(KeyValueList *keys, bool has_hold_time, int64_t hold_time, for (p = keys; p != NULL; p = p->next) { qemu_input_event_send_key(NULL, copy_key_value(p->value), true); qemu_input_event_send_key_delay(hold_time); + up = g_realloc(up, sizeof(*up) * (count+1)); + up[count] = copy_key_value(p->value); + count++; } - for (p = keys; p != NULL; p = p->next) { - qemu_input_event_send_key(NULL, copy_key_value(p->value), false); + while (count) { + count--; + qemu_input_event_send_key(NULL, up[count], false); qemu_input_event_send_key_delay(hold_time); } + g_free(up); } static void legacy_kbd_event(DeviceState *dev, QemuConsole *src, -- cgit v1.2.3 From 50c6617fcbef649674b59f686b12dccfc455ffa3 Mon Sep 17 00:00:00 2001 From: Marcelo Tosatti Date: Tue, 30 Sep 2014 18:10:17 -0300 Subject: add input-send-event command Which allows specification of absolute/relative, up/down and console parameters. Suggested by Gerd Hoffman. Signed-off-by: Marcelo Tosatti Reviewed-by: Eric Blake Signed-off-by: Gerd Hoffmann --- ui/input.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'ui') diff --git a/ui/input.c b/ui/input.c index 89d9db78c0..002831ee72 100644 --- a/ui/input.c +++ b/ui/input.c @@ -122,6 +122,43 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con) return NULL; } +void qmp_input_send_event(int64_t console, InputEventList *events, + Error **errp) +{ + InputEventList *e; + QemuConsole *con; + + con = qemu_console_lookup_by_index(console); + if (!con) { + error_setg(errp, "console %" PRId64 " not found", console); + return; + } + + if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) { + error_setg(errp, "VM not running"); + return; + } + + for (e = events; e != NULL; e = e->next) { + InputEvent *event = e->value; + + if (!qemu_input_find_handler(1 << event->kind, con)) { + error_setg(errp, "Input handler not found for " + "event type %s", + InputEventKind_lookup[event->kind]); + return; + } + } + + for (e = events; e != NULL; e = e->next) { + InputEvent *event = e->value; + + qemu_input_event_send(con, event); + } + + qemu_input_event_sync(); +} + static void qemu_input_transform_abs_rotate(InputEvent *evt) { switch (graphic_rotate) { -- cgit v1.2.3