diff options
Diffstat (limited to 'vl.c')
| -rw-r--r-- | vl.c | 119 |
1 files changed, 56 insertions, 63 deletions
diff --git a/vl.c b/vl.c index 81724f5f17..9e7235df6d 100644 --- a/vl.c +++ b/vl.c @@ -136,7 +136,6 @@ static const char *data_dir[16]; static int data_dir_idx; const char *bios_name = NULL; enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; -int request_opengl = -1; int display_opengl; const char* keyboard_layout = NULL; ram_addr_t ram_size; @@ -150,10 +149,8 @@ static int rtc_utc = 1; static int rtc_date_offset = -1; /* -1 means no change */ QEMUClockType rtc_clock; int vga_interface_type = VGA_NONE; -static int full_screen = 0; +static DisplayOptions dpy; int no_frame; -int no_quit = 0; -static bool grab_on_hover; Chardev *serial_hds[MAX_SERIAL_PORTS]; Chardev *parallel_hds[MAX_PARALLEL_PORTS]; Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES]; @@ -2083,28 +2080,19 @@ static void select_vgahw(const char *p) } } -typedef enum DisplayType { - DT_DEFAULT, - DT_CURSES, - DT_SDL, - DT_COCOA, - DT_GTK, - DT_EGL, - DT_NONE, -} DisplayType; - -static DisplayType select_display(const char *p) +static void parse_display(const char *p) { const char *opts; - DisplayType display = DT_DEFAULT; if (strstart(p, "sdl", &opts)) { #ifdef CONFIG_SDL - display = DT_SDL; + dpy.type = DISPLAY_TYPE_SDL; while (*opts) { const char *nextopt; if (strstart(opts, ",frame=", &nextopt)) { + g_printerr("The frame= sdl option is deprecated, and will be\n" + "removed in a future release.\n"); opts = nextopt; if (strstart(opts, "on", &nextopt)) { no_frame = 0; @@ -2133,19 +2121,21 @@ static DisplayType select_display(const char *p) } } else if (strstart(opts, ",window_close=", &nextopt)) { opts = nextopt; + dpy.has_window_close = true; if (strstart(opts, "on", &nextopt)) { - no_quit = 0; + dpy.window_close = true; } else if (strstart(opts, "off", &nextopt)) { - no_quit = 1; + dpy.window_close = false; } else { goto invalid_sdl_args; } } else if (strstart(opts, ",gl=", &nextopt)) { opts = nextopt; + dpy.has_gl = true; if (strstart(opts, "on", &nextopt)) { - request_opengl = 1; + dpy.gl = true; } else if (strstart(opts, "off", &nextopt)) { - request_opengl = 0; + dpy.gl = false; } else { goto invalid_sdl_args; } @@ -2169,41 +2159,42 @@ static DisplayType select_display(const char *p) } } else if (strstart(p, "egl-headless", &opts)) { #ifdef CONFIG_OPENGL_DMABUF - request_opengl = 1; display_opengl = 1; - display = DT_EGL; + dpy.type = DISPLAY_TYPE_EGL_HEADLESS; #else error_report("egl support is disabled"); exit(1); #endif } else if (strstart(p, "curses", &opts)) { #ifdef CONFIG_CURSES - display = DT_CURSES; + dpy.type = DISPLAY_TYPE_CURSES; #else error_report("curses support is disabled"); exit(1); #endif } else if (strstart(p, "gtk", &opts)) { #ifdef CONFIG_GTK - display = DT_GTK; + dpy.type = DISPLAY_TYPE_GTK; while (*opts) { const char *nextopt; if (strstart(opts, ",grab_on_hover=", &nextopt)) { opts = nextopt; + dpy.u.gtk.has_grab_on_hover = true; if (strstart(opts, "on", &nextopt)) { - grab_on_hover = true; + dpy.u.gtk.grab_on_hover = true; } else if (strstart(opts, "off", &nextopt)) { - grab_on_hover = false; + dpy.u.gtk.grab_on_hover = false; } else { goto invalid_gtk_args; } } else if (strstart(opts, ",gl=", &nextopt)) { opts = nextopt; + dpy.has_gl = true; if (strstart(opts, "on", &nextopt)) { - request_opengl = 1; + dpy.gl = true; } else if (strstart(opts, "off", &nextopt)) { - request_opengl = 0; + dpy.gl = false; } else { goto invalid_gtk_args; } @@ -2219,13 +2210,11 @@ static DisplayType select_display(const char *p) exit(1); #endif } else if (strstart(p, "none", &opts)) { - display = DT_NONE; + dpy.type = DISPLAY_TYPE_NONE; } else { error_report("unknown display type"); exit(1); } - - return display; } static int balloon_parse(const char *arg) @@ -3049,7 +3038,6 @@ int main(int argc, char **argv, char **envp) const char *incoming = NULL; bool userconfig = true; bool nographic = false; - DisplayType display_type = DT_DEFAULT; int display_remote = 0; const char *log_mask = NULL; const char *log_file = NULL; @@ -3243,17 +3231,17 @@ int main(int argc, char **argv, char **envp) } break; case QEMU_OPTION_display: - display_type = select_display(optarg); + parse_display(optarg); break; case QEMU_OPTION_nographic: olist = qemu_find_opts("machine"); qemu_opts_parse_noisily(olist, "graphics=off", false); nographic = true; - display_type = DT_NONE; + dpy.type = DISPLAY_TYPE_NONE; break; case QEMU_OPTION_curses: #ifdef CONFIG_CURSES - display_type = DT_CURSES; + dpy.type = DISPLAY_TYPE_CURSES; #else error_report("curses support is disabled"); exit(1); @@ -3636,9 +3624,12 @@ int main(int argc, char **argv, char **envp) loadvm = optarg; break; case QEMU_OPTION_full_screen: - full_screen = 1; + dpy.has_full_screen = true; + dpy.full_screen = true; break; case QEMU_OPTION_no_frame: + g_printerr("The -no-frame switch is deprecated, and will be\n" + "removed in a future release.\n"); no_frame = 1; break; case QEMU_OPTION_alt_grab: @@ -3648,11 +3639,12 @@ int main(int argc, char **argv, char **envp) ctrl_grab = 1; break; case QEMU_OPTION_no_quit: - no_quit = 1; + dpy.has_window_close = true; + dpy.window_close = false; break; case QEMU_OPTION_sdl: #ifdef CONFIG_SDL - display_type = DT_SDL; + dpy.type = DISPLAY_TYPE_SDL; break; #else error_report("SDL support is disabled"); @@ -4267,7 +4259,7 @@ int main(int argc, char **argv, char **envp) exit(1); } #ifdef CONFIG_CURSES - if (display_type == DT_CURSES) { + if (dpy.type == DISPLAY_TYPE_CURSES) { error_report("curses display cannot be used with -daemonize"); exit(1); } @@ -4313,40 +4305,41 @@ int main(int argc, char **argv, char **envp) display_remote++; } #endif - if (display_type == DT_DEFAULT && !display_remote) { + if (dpy.type == DISPLAY_TYPE_DEFAULT && !display_remote) { #if defined(CONFIG_GTK) - display_type = DT_GTK; + dpy.type = DISPLAY_TYPE_GTK; #elif defined(CONFIG_SDL) - display_type = DT_SDL; + dpy.type = DISPLAY_TYPE_SDL; #elif defined(CONFIG_COCOA) - display_type = DT_COCOA; + dpy.type = DISPLAY_TYPE_COCOA; #elif defined(CONFIG_VNC) vnc_parse("localhost:0,to=99,id=default", &error_abort); #else - display_type = DT_NONE; + dpy.type = DISPLAY_TYPE_NONE; #endif } - if ((no_frame || alt_grab || ctrl_grab) && display_type != DT_SDL) { + if ((no_frame || alt_grab || ctrl_grab) && dpy.type != DISPLAY_TYPE_SDL) { error_report("-no-frame, -alt-grab and -ctrl-grab are only valid " "for SDL, ignoring option"); } - if (no_quit && (display_type != DT_GTK && display_type != DT_SDL)) { + if (dpy.has_window_close && + (dpy.type != DISPLAY_TYPE_GTK && dpy.type != DISPLAY_TYPE_SDL)) { error_report("-no-quit is only valid for GTK and SDL, " "ignoring option"); } - if (display_type == DT_GTK) { - early_gtk_display_init(request_opengl); + if (dpy.type == DISPLAY_TYPE_GTK) { + early_gtk_display_init(&dpy); } - if (display_type == DT_SDL) { - sdl_display_early_init(request_opengl); + if (dpy.type == DISPLAY_TYPE_SDL) { + sdl_display_early_init(&dpy); } qemu_console_early_init(); - if (request_opengl == 1 && display_opengl == 0) { + if (dpy.has_gl && dpy.gl && display_opengl == 0) { #if defined(CONFIG_OPENGL) error_report("OpenGL is not supported by the display"); #else @@ -4671,18 +4664,18 @@ int main(int argc, char **argv, char **envp) ds = init_displaystate(); /* init local displays */ - switch (display_type) { - case DT_CURSES: - curses_display_init(ds, full_screen); + switch (dpy.type) { + case DISPLAY_TYPE_CURSES: + curses_display_init(ds, &dpy); break; - case DT_SDL: - sdl_display_init(ds, full_screen); + case DISPLAY_TYPE_SDL: + sdl_display_init(ds, &dpy); break; - case DT_COCOA: - cocoa_display_init(ds, full_screen); + case DISPLAY_TYPE_COCOA: + cocoa_display_init(ds, &dpy); break; - case DT_GTK: - gtk_display_init(ds, full_screen, grab_on_hover); + case DISPLAY_TYPE_GTK: + gtk_display_init(ds, &dpy); break; default: break; @@ -4702,8 +4695,8 @@ int main(int argc, char **argv, char **envp) } #ifdef CONFIG_OPENGL_DMABUF - if (display_type == DT_EGL) { - egl_headless_init(); + if (dpy.type == DISPLAY_TYPE_EGL_HEADLESS) { + egl_headless_init(&dpy); } #endif |