ui/console: move console compatibility check to dcl_display_console()
The current checks are done at registration time only. However, if a DCL has no specific console specified, it may be switched dynamically with console_select() later on. Let's move the checks when displaychangelistener_display_console() is called, which includes registration time and remains fatal if the specified console is incompatible. Note: we may want to display the compatibility error to the DCL, this is left for a future improvement. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
417a231947
commit
4b7b661d8f
19
ui/console.c
19
ui/console.c
@ -148,6 +148,8 @@ static DisplayState *get_alloc_displaystate(void);
|
||||
static void text_console_update_cursor_timer(void);
|
||||
static void text_console_update_cursor(void *opaque);
|
||||
static bool displaychangelistener_has_dmabuf(DisplayChangeListener *dcl);
|
||||
static bool console_compatible_with(QemuConsole *con,
|
||||
DisplayChangeListener *dcl, Error **errp);
|
||||
|
||||
static void gui_update(void *opaque)
|
||||
{
|
||||
@ -1057,13 +1059,14 @@ static void console_putchar(QemuConsole *s, int ch)
|
||||
}
|
||||
|
||||
static void displaychangelistener_display_console(DisplayChangeListener *dcl,
|
||||
QemuConsole *con)
|
||||
QemuConsole *con,
|
||||
Error **errp)
|
||||
{
|
||||
static const char nodev[] =
|
||||
"This VM has no graphic display device.";
|
||||
static DisplaySurface *dummy;
|
||||
|
||||
if (!con) {
|
||||
if (!con || !console_compatible_with(con, dcl, errp)) {
|
||||
if (!dcl->ops->dpy_gfx_switch) {
|
||||
return;
|
||||
}
|
||||
@ -1114,7 +1117,7 @@ void console_select(unsigned int index)
|
||||
if (dcl->con != NULL) {
|
||||
continue;
|
||||
}
|
||||
displaychangelistener_display_console(dcl, s);
|
||||
displaychangelistener_display_console(dcl, s, NULL);
|
||||
}
|
||||
}
|
||||
if (ds->have_text) {
|
||||
@ -1475,8 +1478,8 @@ static bool displaychangelistener_has_dmabuf(DisplayChangeListener *dcl)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool dpy_compatible_with(QemuConsole *con,
|
||||
DisplayChangeListener *dcl, Error **errp)
|
||||
static bool console_compatible_with(QemuConsole *con,
|
||||
DisplayChangeListener *dcl, Error **errp)
|
||||
{
|
||||
int flags;
|
||||
|
||||
@ -1522,10 +1525,6 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
|
||||
|
||||
assert(!dcl->ds);
|
||||
|
||||
if (dcl->con) {
|
||||
dpy_compatible_with(dcl->con, dcl, &error_fatal);
|
||||
}
|
||||
|
||||
trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);
|
||||
dcl->ds = get_alloc_displaystate();
|
||||
QLIST_INSERT_HEAD(&dcl->ds->listeners, dcl, next);
|
||||
@ -1536,7 +1535,7 @@ void register_displaychangelistener(DisplayChangeListener *dcl)
|
||||
} else {
|
||||
con = active_console;
|
||||
}
|
||||
displaychangelistener_display_console(dcl, con);
|
||||
displaychangelistener_display_console(dcl, con, dcl->con ? &error_fatal : NULL);
|
||||
text_console_update_cursor(NULL);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user