ui: Make the DisplayType enum entries conditional
Libvirt's "domcapabilities" command has a way to state whether certain graphic frontends are available in QEMU or not. Originally, libvirt looked at the "--help" output of the QEMU binary to determine whether SDL was available or not (by looking for the "-sdl" parameter in the help text), but since libvirt stopped doing this analysis of the help text, the detection of SDL is currently broken, see: https://bugzilla.redhat.com/show_bug.cgi?id=1790902 QEMU should provide a way via the QMP interface instead. A simple way, without introducing additional commands, is to make the DisplayType enum entries conditional, so that the enum only contains the entries if the corresponding CONFIG_xxx switches have been set. This of course only gives an indication which possibilities have been enabled during compile-time of QEMU (and does not take into account whether modules are later available or not for example - for this we'd need a separate command), but anyway, this should already be good enough for the above bug ticket, and it's a good idea anyway to make the QMP interface conditional here, so let's simply do it. Signed-off-by: Thomas Huth <thuth@redhat.com> Message-Id: <20210615090439.70926-1-thuth@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
ddc717581c
commit
66c2207fd2
23
qapi/ui.json
23
qapi/ui.json
@ -1130,9 +1130,16 @@
|
||||
#
|
||||
##
|
||||
{ 'enum' : 'DisplayType',
|
||||
'data' : [ 'default', 'none', 'gtk', 'sdl',
|
||||
'egl-headless', 'curses', 'cocoa',
|
||||
'spice-app'] }
|
||||
'data' : [
|
||||
{ 'name': 'default' },
|
||||
{ 'name': 'none' },
|
||||
{ 'name': 'gtk', 'if': 'defined(CONFIG_GTK)' },
|
||||
{ 'name': 'sdl', 'if': 'defined(CONFIG_SDL)' },
|
||||
{ 'name': 'egl-headless',
|
||||
'if': 'defined(CONFIG_OPENGL) && defined(CONFIG_GBM)' },
|
||||
{ 'name': 'curses', 'if': 'defined(CONFIG_CURSES)' },
|
||||
{ 'name': 'cocoa', 'if': 'defined(CONFIG_COCOA)' },
|
||||
{ 'name': 'spice-app', 'if': 'defined(CONFIG_SPICE)'} ] }
|
||||
|
||||
##
|
||||
# @DisplayOptions:
|
||||
@ -1156,9 +1163,13 @@
|
||||
'*show-cursor' : 'bool',
|
||||
'*gl' : 'DisplayGLMode' },
|
||||
'discriminator' : 'type',
|
||||
'data' : { 'gtk' : 'DisplayGTK',
|
||||
'curses' : 'DisplayCurses',
|
||||
'egl-headless' : 'DisplayEGLHeadless'} }
|
||||
'data' : {
|
||||
'gtk': { 'type': 'DisplayGTK', 'if': 'defined(CONFIG_GTK)' },
|
||||
'curses': { 'type': 'DisplayCurses', 'if': 'defined(CONFIG_CURSES)' },
|
||||
'egl-headless': { 'type': 'DisplayEGLHeadless',
|
||||
'if': 'defined(CONFIG_OPENGL) && defined(CONFIG_GBM)' }
|
||||
}
|
||||
}
|
||||
|
||||
##
|
||||
# @query-display-options:
|
||||
|
20
softmmu/vl.c
20
softmmu/vl.c
@ -1068,6 +1068,7 @@ static void parse_display(const char *p)
|
||||
* Not clear yet what happens to them long-term. Should
|
||||
* replaced by something better or deprecated and dropped.
|
||||
*/
|
||||
#if defined(CONFIG_SDL)
|
||||
dpy.type = DISPLAY_TYPE_SDL;
|
||||
while (*opts) {
|
||||
const char *nextopt;
|
||||
@ -1131,6 +1132,10 @@ static void parse_display(const char *p)
|
||||
}
|
||||
opts = nextopt;
|
||||
}
|
||||
#else
|
||||
error_report("SDL display supported is not available in this binary");
|
||||
exit(1);
|
||||
#endif
|
||||
} else if (strstart(p, "vnc", &opts)) {
|
||||
/*
|
||||
* vnc isn't a (local) DisplayType but a protocol for remote
|
||||
@ -1867,13 +1872,22 @@ static void qemu_apply_machine_options(void)
|
||||
static void qemu_create_early_backends(void)
|
||||
{
|
||||
MachineClass *machine_class = MACHINE_GET_CLASS(current_machine);
|
||||
#if defined(CONFIG_SDL)
|
||||
const bool use_sdl = (dpy.type == DISPLAY_TYPE_SDL);
|
||||
#else
|
||||
const bool use_sdl = false;
|
||||
#endif
|
||||
#if defined(CONFIG_GTK)
|
||||
const bool use_gtk = (dpy.type == DISPLAY_TYPE_GTK);
|
||||
#else
|
||||
const bool use_gtk = false;
|
||||
#endif
|
||||
|
||||
if ((alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) {
|
||||
if ((alt_grab || ctrl_grab) && !use_sdl) {
|
||||
error_report("-alt-grab and -ctrl-grab are only valid "
|
||||
"for SDL, ignoring option");
|
||||
}
|
||||
if (dpy.has_window_close &&
|
||||
(dpy.type != DISPLAY_TYPE_GTK && dpy.type != DISPLAY_TYPE_SDL)) {
|
||||
if (dpy.has_window_close && !use_gtk && !use_sdl) {
|
||||
error_report("-no-quit is only valid for GTK and SDL, "
|
||||
"ignoring option");
|
||||
}
|
||||
|
@ -2370,13 +2370,19 @@ void qemu_display_register(QemuDisplay *ui)
|
||||
bool qemu_display_find_default(DisplayOptions *opts)
|
||||
{
|
||||
static DisplayType prio[] = {
|
||||
#if defined(CONFIG_GTK)
|
||||
DISPLAY_TYPE_GTK,
|
||||
#endif
|
||||
#if defined(CONFIG_SDL)
|
||||
DISPLAY_TYPE_SDL,
|
||||
#endif
|
||||
#if defined(CONFIG_COCOA)
|
||||
DISPLAY_TYPE_COCOA
|
||||
#endif
|
||||
};
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(prio); i++) {
|
||||
for (i = 0; i < (int)ARRAY_SIZE(prio); i++) {
|
||||
if (dpys[prio[i]] == NULL) {
|
||||
ui_module_load_one(DisplayType_str(prio[i]));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user