aboutsummaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki@daynix.com>2024-03-19 12:08:40 +0900
committerMarc-André Lureau <marcandre.lureau@redhat.com>2024-03-20 10:27:54 +0400
commitd4c199566f6fa5de4afa344712462cfd322de9d0 (patch)
treead3c22a1aedc08ddfbd901f2b01e90d215b39855 /ui
parent271a197425528f4448b3d351be25995abe901374 (diff)
ui/vnc: Do not use console_select()
console_select() is shared by other displays and a console_select() call from one of them triggers console switching also in ui/curses, circumventing key state reinitialization that needs to be performed in preparation and resulting in stuck keys. Use its internal state to track the current active console to prevent such a surprise console switch. Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20240319-console-v2-2-3fd6feef321a@daynix.com>
Diffstat (limited to 'ui')
-rw-r--r--ui/console.c12
-rw-r--r--ui/kbd-state.c6
-rw-r--r--ui/vnc.c14
3 files changed, 27 insertions, 5 deletions
diff --git a/ui/console.c b/ui/console.c
index 832055675c..fbc1b9b8b5 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1325,6 +1325,18 @@ void graphic_console_close(QemuConsole *con)
dpy_gfx_replace_surface(con, surface);
}
+QemuConsole *qemu_console_lookup_default(void)
+{
+ QemuConsole *con;
+
+ QTAILQ_FOREACH(con, &consoles, next) {
+ if (QEMU_IS_GRAPHIC_CONSOLE(con)) {
+ return con;
+ }
+ }
+ return QTAILQ_FIRST(&consoles);
+}
+
QemuConsole *qemu_console_lookup_by_index(unsigned int index)
{
QemuConsole *con;
diff --git a/ui/kbd-state.c b/ui/kbd-state.c
index 62d42a7a22..52ed28b8a8 100644
--- a/ui/kbd-state.c
+++ b/ui/kbd-state.c
@@ -117,6 +117,12 @@ void qkbd_state_lift_all_keys(QKbdState *kbd)
}
}
+void qkbd_state_switch_console(QKbdState *kbd, QemuConsole *con)
+{
+ qkbd_state_lift_all_keys(kbd);
+ kbd->con = con;
+}
+
void qkbd_state_set_delay(QKbdState *kbd, int delay_ms)
{
kbd->key_delay_ms = delay_ms;
diff --git a/ui/vnc.c b/ui/vnc.c
index fc12b343e2..b3fd78022b 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -1872,12 +1872,16 @@ static void do_key_event(VncState *vs, int down, int keycode, int sym)
/* QEMU console switch */
switch (qcode) {
case Q_KEY_CODE_1 ... Q_KEY_CODE_9: /* '1' to '9' keys */
- if (vs->vd->dcl.con == NULL && down &&
+ if (down &&
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_CTRL) &&
qkbd_state_modifier_get(vs->vd->kbd, QKBD_MOD_ALT)) {
- /* Reset the modifiers sent to the current console */
- qkbd_state_lift_all_keys(vs->vd->kbd);
- console_select(qcode - Q_KEY_CODE_1);
+ QemuConsole *con = qemu_console_lookup_by_index(qcode - Q_KEY_CODE_1);
+ if (con) {
+ unregister_displaychangelistener(&vs->vd->dcl);
+ qkbd_state_switch_console(vs->vd->kbd, con);
+ vs->vd->dcl.con = con;
+ register_displaychangelistener(&vs->vd->dcl);
+ }
return;
}
default:
@@ -4206,7 +4210,7 @@ void vnc_display_open(const char *id, Error **errp)
goto fail;
}
} else {
- con = NULL;
+ con = qemu_console_lookup_default();
}
if (con != vd->dcl.con) {