From db71589fd9428156a5b366e348d895d445f77449 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:35 +0100 Subject: console: add qemu display registry, add gtk Add a registry for user interfaces. Add qemu_display_init and qemu_display_early_init helper functions for display initialization. Hook up gtk ui as first user. Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-2-kraxel@redhat.com --- include/ui/console.h | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index f29bacd625..817f9b9bcc 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -432,6 +432,18 @@ void surface_gl_setup_viewport(QemuGLShader *gls, int ww, int wh); #endif +typedef struct QemuDisplay QemuDisplay; + +struct QemuDisplay { + DisplayType type; + void (*early_init)(DisplayOptions *opts); + void (*init)(DisplayState *ds, DisplayOptions *opts); +}; + +void qemu_display_register(QemuDisplay *ui); +void qemu_display_early_init(DisplayOptions *opts); +void qemu_display_init(DisplayState *ds, DisplayOptions *opts); + /* sdl.c */ #ifdef CONFIG_SDL void sdl_display_early_init(DisplayOptions *opts); @@ -487,26 +499,6 @@ static inline void curses_display_init(DisplayState *ds, DisplayOptions *opts) /* input.c */ int index_from_key(const char *key, size_t key_length); -/* gtk.c */ -#ifdef CONFIG_GTK -void early_gtk_display_init(DisplayOptions *opts); -void gtk_display_init(DisplayState *ds, DisplayOptions *opts); -#else -static inline void gtk_display_init(DisplayState *ds, DisplayOptions *opts) -{ - /* This must never be called if CONFIG_GTK is disabled */ - error_report("GTK support is disabled"); - abort(); -} - -static inline void early_gtk_display_init(DisplayOptions *opts) -{ - /* This must never be called if CONFIG_GTK is disabled */ - error_report("GTK support is disabled"); - abort(); -} -#endif - /* egl-headless.c */ void egl_headless_init(DisplayOptions *opts); -- cgit v1.2.3-55-g7522 From 5ee1718f92bd82e0e581191b6326384d291199d3 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:36 +0100 Subject: sdl: switch over to new display registry Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-3-kraxel@redhat.com --- include/ui/console.h | 19 ------------------- ui/sdl.c | 24 +++++++++++++----------- ui/sdl2.c | 17 +++++++++++++++-- vl.c | 15 +-------------- 4 files changed, 29 insertions(+), 46 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index 817f9b9bcc..cb86e6a0dd 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -444,25 +444,6 @@ void qemu_display_register(QemuDisplay *ui); void qemu_display_early_init(DisplayOptions *opts); void qemu_display_init(DisplayState *ds, DisplayOptions *opts); -/* sdl.c */ -#ifdef CONFIG_SDL -void sdl_display_early_init(DisplayOptions *opts); -void sdl_display_init(DisplayState *ds, DisplayOptions *opts); -#else -static inline void sdl_display_early_init(DisplayOptions *opts) -{ - /* This must never be called if CONFIG_SDL is disabled */ - error_report("SDL support is disabled"); - abort(); -} -static inline void sdl_display_init(DisplayState *ds, DisplayOptions *opts) -{ - /* This must never be called if CONFIG_SDL is disabled */ - error_report("SDL support is disabled"); - abort(); -} -#endif - /* cocoa.m */ #ifdef CONFIG_COCOA void cocoa_display_init(DisplayState *ds, DisplayOptions *opts); diff --git a/ui/sdl.c b/ui/sdl.c index c4ae7ab05d..a5fd503c25 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -901,17 +901,7 @@ static const DisplayChangeListenerOps dcl_ops = { .dpy_cursor_define = sdl_mouse_define, }; -void sdl_display_early_init(DisplayOptions *opts) -{ - if (opts->has_gl && opts->gl) { - fprintf(stderr, - "SDL1 display code has no opengl support.\n" - "Please recompile qemu with SDL2, using\n" - "./configure --enable-sdl --with-sdlabi=2.0\n"); - } -} - -void sdl_display_init(DisplayState *ds, DisplayOptions *o) +static void sdl1_display_init(DisplayState *ds, DisplayOptions *o) { int flags; uint8_t data = 0; @@ -1023,3 +1013,15 @@ void sdl_display_init(DisplayState *ds, DisplayOptions *o) atexit(sdl_cleanup); } + +static QemuDisplay qemu_display_sdl1 = { + .type = DISPLAY_TYPE_SDL, + .init = sdl1_display_init, +}; + +static void register_sdl1(void) +{ + qemu_display_register(&qemu_display_sdl1); +} + +type_init(register_sdl1); diff --git a/ui/sdl2.c b/ui/sdl2.c index b5a0fa1d13..83b917fa37 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -751,7 +751,7 @@ static const DisplayChangeListenerOps dcl_gl_ops = { }; #endif -void sdl_display_early_init(DisplayOptions *o) +static void sdl2_display_early_init(DisplayOptions *o) { assert(o->type == DISPLAY_TYPE_SDL); if (o->has_gl && o->gl) { @@ -761,7 +761,7 @@ void sdl_display_early_init(DisplayOptions *o) } } -void sdl_display_init(DisplayState *ds, DisplayOptions *o) +static void sdl2_display_init(DisplayState *ds, DisplayOptions *o) { int flags; uint8_t data = 0; @@ -861,3 +861,16 @@ void sdl_display_init(DisplayState *ds, DisplayOptions *o) atexit(sdl_cleanup); } + +static QemuDisplay qemu_display_sdl2 = { + .type = DISPLAY_TYPE_SDL, + .early_init = sdl2_display_early_init, + .init = sdl2_display_init, +}; + +static void register_sdl1(void) +{ + qemu_display_register(&qemu_display_sdl2); +} + +type_init(register_sdl1); diff --git a/vl.c b/vl.c index a84b1372b8..5b2410d564 100644 --- a/vl.c +++ b/vl.c @@ -2092,7 +2092,6 @@ static void parse_display(const char *p) const char *opts; if (strstart(p, "sdl", &opts)) { -#ifdef CONFIG_SDL dpy.type = DISPLAY_TYPE_SDL; while (*opts) { const char *nextopt; @@ -2153,10 +2152,6 @@ static void parse_display(const char *p) } opts = nextopt; } -#else - error_report("SDL support is disabled"); - exit(1); -#endif } else if (strstart(p, "vnc", &opts)) { if (*opts == '=') { vnc_parse(opts + 1, &error_fatal); @@ -4340,12 +4335,7 @@ int main(int argc, char **argv, char **envp) "ignoring option"); } - if (dpy.type == DISPLAY_TYPE_SDL) { - sdl_display_early_init(&dpy); - } else { - qemu_display_early_init(&dpy); - } - + qemu_display_early_init(&dpy); qemu_console_early_init(); if (dpy.has_gl && dpy.gl && display_opengl == 0) { @@ -4677,9 +4667,6 @@ int main(int argc, char **argv, char **envp) case DISPLAY_TYPE_CURSES: curses_display_init(ds, &dpy); break; - case DISPLAY_TYPE_SDL: - sdl_display_init(ds, &dpy); - break; case DISPLAY_TYPE_COCOA: cocoa_display_init(ds, &dpy); break; -- cgit v1.2.3-55-g7522 From 5013b9e46a72c96999fab1523f722ab58152c59a Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:37 +0100 Subject: cocoa: switch over to new display registry Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-4-kraxel@redhat.com --- include/ui/console.h | 12 ------------ ui/cocoa.m | 14 +++++++++++++- vl.c | 3 --- 3 files changed, 13 insertions(+), 16 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index cb86e6a0dd..f8c462106a 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -444,18 +444,6 @@ void qemu_display_register(QemuDisplay *ui); void qemu_display_early_init(DisplayOptions *opts); void qemu_display_init(DisplayState *ds, DisplayOptions *opts); -/* cocoa.m */ -#ifdef CONFIG_COCOA -void cocoa_display_init(DisplayState *ds, DisplayOptions *opts); -#else -static inline void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) -{ - /* This must never be called if CONFIG_COCOA is disabled */ - error_report("Cocoa support is disabled"); - abort(); -} -#endif - /* vnc.c */ void vnc_display_init(const char *id); void vnc_display_open(const char *id, Error **errp); diff --git a/ui/cocoa.m b/ui/cocoa.m index 90d9aa57ea..8b0dce90cb 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -1683,7 +1683,7 @@ static void addRemovableDevicesMenuItems(void) qapi_free_BlockInfoList(pointerToFree); } -void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) +static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) { COCOA_DEBUG("qemu_cocoa: cocoa_display_init\n"); @@ -1713,3 +1713,15 @@ void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) */ addRemovableDevicesMenuItems(); } + +static QemuDisplay qemu_display_cocoa = { + .type = DISPLAY_TYPE_COCOA, + .init = cocoa_display_init, +}; + +static void register_cocoa(void) +{ + qemu_display_register(&qemu_display_cocoa); +} + +type_init(register_cocoa); diff --git a/vl.c b/vl.c index 5b2410d564..377140ebd9 100644 --- a/vl.c +++ b/vl.c @@ -4667,9 +4667,6 @@ int main(int argc, char **argv, char **envp) case DISPLAY_TYPE_CURSES: curses_display_init(ds, &dpy); break; - case DISPLAY_TYPE_COCOA: - cocoa_display_init(ds, &dpy); - break; default: qemu_display_init(ds, &dpy); break; -- cgit v1.2.3-55-g7522 From b0766612d16da185a822636cf54214123e8038cf Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:38 +0100 Subject: curses: switch over to new display registry Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-5-kraxel@redhat.com --- include/ui/console.h | 12 ------------ ui/curses.c | 14 +++++++++++++- vl.c | 17 ++--------------- 3 files changed, 15 insertions(+), 28 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index f8c462106a..3ea6cf0870 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -453,18 +453,6 @@ int vnc_display_pw_expire(const char *id, time_t expires); QemuOpts *vnc_parse(const char *str, Error **errp); int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp); -/* curses.c */ -#ifdef CONFIG_CURSES -void curses_display_init(DisplayState *ds, DisplayOptions *opts); -#else -static inline void curses_display_init(DisplayState *ds, DisplayOptions *opts) -{ - /* This must never be called if CONFIG_CURSES is disabled */ - error_report("curses support is disabled"); - abort(); -} -#endif - /* input.c */ int index_from_key(const char *key, size_t key_length); diff --git a/ui/curses.c b/ui/curses.c index 597e47fd4a..59d819fd4d 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -435,7 +435,7 @@ static const DisplayChangeListenerOps dcl_ops = { .dpy_text_cursor = curses_cursor_position, }; -void curses_display_init(DisplayState *ds, DisplayOptions *opts) +static void curses_display_init(DisplayState *ds, DisplayOptions *opts) { #ifndef _WIN32 if (!isatty(1)) { @@ -456,3 +456,15 @@ void curses_display_init(DisplayState *ds, DisplayOptions *opts) invalidate = 1; } + +static QemuDisplay qemu_display_curses = { + .type = DISPLAY_TYPE_CURSES, + .init = curses_display_init, +}; + +static void register_curses(void) +{ + qemu_display_register(&qemu_display_curses); +} + +type_init(register_curses); diff --git a/vl.c b/vl.c index 377140ebd9..5b2fca8bd3 100644 --- a/vl.c +++ b/vl.c @@ -2168,12 +2168,7 @@ static void parse_display(const char *p) exit(1); #endif } else if (strstart(p, "curses", &opts)) { -#ifdef CONFIG_CURSES dpy.type = DISPLAY_TYPE_CURSES; -#else - error_report("curses support is disabled"); - exit(1); -#endif } else if (strstart(p, "gtk", &opts)) { dpy.type = DISPLAY_TYPE_GTK; while (*opts) { @@ -4660,17 +4655,9 @@ int main(int argc, char **argv, char **envp) qemu_register_reset(restore_boot_order, g_strdup(boot_order)); } - ds = init_displaystate(); - /* init local displays */ - switch (dpy.type) { - case DISPLAY_TYPE_CURSES: - curses_display_init(ds, &dpy); - break; - default: - qemu_display_init(ds, &dpy); - break; - } + ds = init_displaystate(); + qemu_display_init(ds, &dpy); /* must be after terminal init, SDL library changes signal handlers */ os_setup_signal_handling(); -- cgit v1.2.3-55-g7522 From 16ab0a74e44300add9a7966e6f4f95ed4c0e833e Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:39 +0100 Subject: egl-headless: switch over to new display registry Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-6-kraxel@redhat.com --- include/ui/console.h | 3 --- ui/egl-headless.c | 20 +++++++++++++++++++- vl.c | 12 ------------ 3 files changed, 19 insertions(+), 16 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index 3ea6cf0870..94726cf190 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -456,7 +456,4 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp); /* input.c */ int index_from_key(const char *key, size_t key_length); -/* egl-headless.c */ -void egl_headless_init(DisplayOptions *opts); - #endif diff --git a/ui/egl-headless.c b/ui/egl-headless.c index b33e0b21fd..7c877122d3 100644 --- a/ui/egl-headless.c +++ b/ui/egl-headless.c @@ -164,7 +164,12 @@ static const DisplayChangeListenerOps egl_ops = { .dpy_gl_update = egl_scanout_flush, }; -void egl_headless_init(DisplayOptions *opts) +static void early_egl_headless_init(DisplayOptions *opts) +{ + display_opengl = 1; +} + +static void egl_headless_init(DisplayState *ds, DisplayOptions *opts) { QemuConsole *con; egl_dpy *edpy; @@ -188,3 +193,16 @@ void egl_headless_init(DisplayOptions *opts) register_displaychangelistener(&edpy->dcl); } } + +static QemuDisplay qemu_display_egl = { + .type = DISPLAY_TYPE_EGL_HEADLESS, + .early_init = early_egl_headless_init, + .init = egl_headless_init, +}; + +static void register_egl(void) +{ + qemu_display_register(&qemu_display_egl); +} + +type_init(register_egl); diff --git a/vl.c b/vl.c index 5b2fca8bd3..93fc841e7c 100644 --- a/vl.c +++ b/vl.c @@ -2160,13 +2160,7 @@ static void parse_display(const char *p) exit(1); } } else if (strstart(p, "egl-headless", &opts)) { -#ifdef CONFIG_OPENGL_DMABUF - display_opengl = 1; dpy.type = DISPLAY_TYPE_EGL_HEADLESS; -#else - error_report("egl support is disabled"); - exit(1); -#endif } else if (strstart(p, "curses", &opts)) { dpy.type = DISPLAY_TYPE_CURSES; } else if (strstart(p, "gtk", &opts)) { @@ -4672,12 +4666,6 @@ int main(int argc, char **argv, char **envp) qemu_spice_display_init(); } -#ifdef CONFIG_OPENGL_DMABUF - if (dpy.type == DISPLAY_TYPE_EGL_HEADLESS) { - egl_headless_init(&dpy); - } -#endif - if (foreach_device_config(DEV_GDB, gdbserver_start) < 0) { exit(1); } -- cgit v1.2.3-55-g7522 From 898f9d41d02d577ac863069772f0708268d2f926 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Thu, 1 Mar 2018 11:05:40 +0100 Subject: console: add and use qemu_display_find_default Using the new display registry instead of #ifdefs in vl.c. Signed-off-by: Gerd Hoffmann Message-id: 20180301100547.18962-7-kraxel@redhat.com --- include/ui/console.h | 1 + ui/console.c | 19 +++++++++++++++++++ vl.c | 15 +++++---------- 3 files changed, 25 insertions(+), 10 deletions(-) (limited to 'include/ui') diff --git a/include/ui/console.h b/include/ui/console.h index 94726cf190..3a53db9360 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -441,6 +441,7 @@ struct QemuDisplay { }; void qemu_display_register(QemuDisplay *ui); +bool qemu_display_find_default(DisplayOptions *opts); void qemu_display_early_init(DisplayOptions *opts); void qemu_display_init(DisplayState *ds, DisplayOptions *opts); diff --git a/ui/console.c b/ui/console.c index a11b120fc8..25d342cdcb 100644 --- a/ui/console.c +++ b/ui/console.c @@ -2188,6 +2188,25 @@ void qemu_display_register(QemuDisplay *ui) dpys[ui->type] = ui; } +bool qemu_display_find_default(DisplayOptions *opts) +{ + static DisplayType prio[] = { + DISPLAY_TYPE_GTK, + DISPLAY_TYPE_SDL, + DISPLAY_TYPE_COCOA + }; + int i; + + for (i = 0; i < ARRAY_SIZE(prio); i++) { + if (dpys[prio[i]] == NULL) { + continue; + } + opts->type = prio[i]; + return true; + } + return false; +} + void qemu_display_early_init(DisplayOptions *opts) { assert(opts->type < DISPLAY_TYPE__MAX); diff --git a/vl.c b/vl.c index 93fc841e7c..e5f6de1843 100644 --- a/vl.c +++ b/vl.c @@ -4298,17 +4298,12 @@ int main(int argc, char **argv, char **envp) } #endif if (dpy.type == DISPLAY_TYPE_DEFAULT && !display_remote) { -#if defined(CONFIG_GTK) - dpy.type = DISPLAY_TYPE_GTK; -#elif defined(CONFIG_SDL) - dpy.type = DISPLAY_TYPE_SDL; -#elif defined(CONFIG_COCOA) - dpy.type = DISPLAY_TYPE_COCOA; -#elif defined(CONFIG_VNC) - vnc_parse("localhost:0,to=99,id=default", &error_abort); -#else - dpy.type = DISPLAY_TYPE_NONE; + if (!qemu_display_find_default(&dpy)) { + dpy.type = DISPLAY_TYPE_NONE; +#if defined(CONFIG_VNC) + vnc_parse("localhost:0,to=99,id=default", &error_abort); #endif + } } if (dpy.type == DISPLAY_TYPE_DEFAULT) { dpy.type = DISPLAY_TYPE_NONE; -- cgit v1.2.3-55-g7522