From 673584473c7cb1ada8317a93cd26151888c47d63 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:11 +0100 Subject: [PATCH 01/12] vl: deprecate -no-frame Signed-off-by: Gerd Hoffmann Message-id: 20180202111022.19269-2-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- qemu-doc.texi | 7 +++++++ vl.c | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/qemu-doc.texi b/qemu-doc.texi index 56388b5b33..8e3556976b 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -2741,6 +2741,13 @@ filesystem test suite. Also it requires the CAP_DAC_READ_SEARCH capability, which is not the recommended way to run QEMU. This backend should not be used and it will be removed with no replacement. +@subsection -no-frame (since 2.12.0) + +The ``-no-frame'' argument works with SDL 1.2 only. SDL 2.0 lacks +support for frameless windows, and the other user interfaces never +implemented this in the first place. So this will be removed together +with SDL 1.2 support. + @section qemu-img command line arguments @subsection convert -s (since 2.0.0) diff --git a/vl.c b/vl.c index 81724f5f17..c1f763f3e1 100644 --- a/vl.c +++ b/vl.c @@ -2105,6 +2105,8 @@ static DisplayType select_display(const char *p) 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; @@ -3639,6 +3641,8 @@ int main(int argc, char **argv, char **envp) full_screen = 1; 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: From be045e6bb8c63ea4d7b4d7775febe18ccdf8dd24 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:13 +0100 Subject: [PATCH 02/12] vl: rename DisplayType to LegacyDisplayType qapi DisplayType will replace the current enum. For the transition both will coexist though, so rename it so we don't have a name clash. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-4-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- vl.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vl.c b/vl.c index c1f763f3e1..746e2c169c 100644 --- a/vl.c +++ b/vl.c @@ -2083,7 +2083,7 @@ static void select_vgahw(const char *p) } } -typedef enum DisplayType { +typedef enum LegacyDisplayType { DT_DEFAULT, DT_CURSES, DT_SDL, @@ -2091,12 +2091,12 @@ typedef enum DisplayType { DT_GTK, DT_EGL, DT_NONE, -} DisplayType; +} LegacyDisplayType; -static DisplayType select_display(const char *p) +static LegacyDisplayType select_display(const char *p) { const char *opts; - DisplayType display = DT_DEFAULT; + LegacyDisplayType display = DT_DEFAULT; if (strstart(p, "sdl", &opts)) { #ifdef CONFIG_SDL @@ -3051,7 +3051,7 @@ int main(int argc, char **argv, char **envp) const char *incoming = NULL; bool userconfig = true; bool nographic = false; - DisplayType display_type = DT_DEFAULT; + LegacyDisplayType display_type = DT_DEFAULT; int display_remote = 0; const char *log_mask = NULL; const char *log_file = NULL; From 0c8d7065325d84cb2521c0b52f383561d2541415 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:14 +0100 Subject: [PATCH 03/12] gtk: add and use DisplayOptions + DisplayGTK Add QAPI DisplayType enum, DisplayOptions union and DisplayGTK struct. Switch gtk configuration to use the qapi type. Some bookkeeping (fullscreen for example) is done twice now, this is temporary until more/all UIs are switched over to qapi configuration. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-5-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 9 +++---- qapi/ui.json | 58 ++++++++++++++++++++++++++++++++++++++++++++ ui/gtk.c | 32 +++++++++++++----------- vl.c | 23 ++++++++++++++---- 4 files changed, 98 insertions(+), 24 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 12fef80923..82cb000e3b 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -486,18 +486,17 @@ int index_from_key(const char *key, size_t key_length); /* gtk.c */ #ifdef CONFIG_GTK -void early_gtk_display_init(int opengl); -void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover); +void early_gtk_display_init(DisplayOptions *opts); +void gtk_display_init(DisplayState *ds, DisplayOptions *opts); #else -static inline void gtk_display_init(DisplayState *ds, bool full_screen, - bool grab_on_hover) +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(int opengl) +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"); diff --git a/qapi/ui.json b/qapi/ui.json index d6679aa8f5..878a3bd2a6 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -985,3 +985,61 @@ 'data': { '*device': 'str', '*head' : 'int', 'events' : [ 'InputEvent' ] } } + + +## +# @DisplayNoOpts: +# +# Empty struct for displays without config options. +# +# Since: 2.12 +# +## +{ 'struct' : 'DisplayNoOpts', + 'data' : { } } + +## +# @DisplayGTK: +# +# GTK display options. +# +# @grab-on-hover: Grab keyboard input on mouse hover. +# +# Since: 2.12 +# +## +{ 'struct' : 'DisplayGTK', + 'data' : { '*grab-on-hover' : 'bool' } } + +## +# @DisplayType: +# +# Display (user interface) type. +# +# Since: 2.12 +# +## +{ 'enum' : 'DisplayType', + 'data' : [ 'none', 'gtk' ] } + +## +# @DisplayOptions: +# +# Display (user interface) options. +# +# @type: Which DisplayType qemu should use. +# @full-screen: Start user interface in fullscreen mode (default: off). +# @window-close: Allow to quit qemu with window close button (default: on). +# @gl: Enable OpenGL support (default: off). +# +# Since: 2.12 +# +## +{ 'union' : 'DisplayOptions', + 'base' : { 'type' : 'DisplayType', + '*full-screen' : 'bool', + '*window-close' : 'bool', + '*gl' : 'bool' }, + 'discriminator' : 'type', + 'data' : { 'none' : 'DisplayNoOpts', + 'gtk' : 'DisplayGTK' } } diff --git a/ui/gtk.c b/ui/gtk.c index 1537751afa..ad4910c70d 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -230,6 +230,8 @@ struct GtkDisplayState { bool modifier_pressed[ARRAY_SIZE(modifier_keycode)]; bool ignore_keys; + + DisplayOptions *opts; }; typedef struct VCChardev { @@ -778,9 +780,14 @@ static gboolean gd_window_close(GtkWidget *widget, GdkEvent *event, void *opaque) { GtkDisplayState *s = opaque; + bool allow_close = true; int i; - if (!no_quit) { + if (s->opts->has_window_close && !s->opts->window_close) { + allow_close = false; + } + + if (allow_close) { for (i = 0; i < s->nb_vcs; i++) { if (s->vc[i].type != GD_VC_GFX) { continue; @@ -2290,7 +2297,7 @@ static void gd_create_menus(GtkDisplayState *s) static gboolean gtkinit; -void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) +void gtk_display_init(DisplayState *ds, DisplayOptions *opts) { VirtualConsole *vc; @@ -2302,6 +2309,8 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) fprintf(stderr, "gtk initialization failed\n"); exit(1); } + assert(opts->type == DISPLAY_TYPE_GTK); + s->opts = opts; #if !GTK_CHECK_VERSION(3, 0, 0) g_printerr("Running QEMU with GTK 2.x is deprecated, and will be removed\n" @@ -2388,15 +2397,17 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) vc && vc->type == GD_VC_VTE); #endif - if (full_screen) { + if (opts->has_full_screen && + opts->full_screen) { gtk_menu_item_activate(GTK_MENU_ITEM(s->full_screen_item)); } - if (grab_on_hover) { + if (opts->u.gtk.has_grab_on_hover && + opts->u.gtk.grab_on_hover) { gtk_menu_item_activate(GTK_MENU_ITEM(s->grab_on_hover_item)); } } -void early_gtk_display_init(int opengl) +void early_gtk_display_init(DisplayOptions *opts) { /* The QEMU code relies on the assumption that it's always run in * the C locale. Therefore it is not prepared to deal with @@ -2422,11 +2433,8 @@ void early_gtk_display_init(int opengl) return; } - switch (opengl) { - case -1: /* default */ - case 0: /* off */ - break; - case 1: /* on */ + assert(opts->type == DISPLAY_TYPE_GTK); + if (opts->has_gl && opts->gl) { #if defined(CONFIG_OPENGL) #if defined(CONFIG_GTK_GL) gtk_gl_area_init(); @@ -2434,10 +2442,6 @@ void early_gtk_display_init(int opengl) gtk_egl_init(); #endif #endif - break; - default: - g_assert_not_reached(); - break; } keycode_map = gd_get_keymap(&keycode_maplen); diff --git a/vl.c b/vl.c index 746e2c169c..a82b7cf16f 100644 --- a/vl.c +++ b/vl.c @@ -151,9 +151,9 @@ 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]; @@ -2188,24 +2188,29 @@ static LegacyDisplayType select_display(const char *p) } 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; } @@ -2222,6 +2227,7 @@ static LegacyDisplayType select_display(const char *p) #endif } else if (strstart(p, "none", &opts)) { display = DT_NONE; + dpy.type = DISPLAY_TYPE_NONE; } else { error_report("unknown display type"); exit(1); @@ -3252,6 +3258,7 @@ int main(int argc, char **argv, char **envp) 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 @@ -3639,6 +3646,8 @@ int main(int argc, char **argv, char **envp) 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" @@ -3653,6 +3662,8 @@ int main(int argc, char **argv, char **envp) 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 @@ -4320,6 +4331,7 @@ int main(int argc, char **argv, char **envp) if (display_type == DT_DEFAULT && !display_remote) { #if defined(CONFIG_GTK) display_type = DT_GTK; + dpy.type = DISPLAY_TYPE_GTK; #elif defined(CONFIG_SDL) display_type = DT_SDL; #elif defined(CONFIG_COCOA) @@ -4328,6 +4340,7 @@ int main(int argc, char **argv, char **envp) vnc_parse("localhost:0,to=99,id=default", &error_abort); #else display_type = DT_NONE; + dpy.type = DISPLAY_TYPE_NONE; #endif } @@ -4341,7 +4354,7 @@ int main(int argc, char **argv, char **envp) } if (display_type == DT_GTK) { - early_gtk_display_init(request_opengl); + early_gtk_display_init(&dpy); } if (display_type == DT_SDL) { @@ -4686,7 +4699,7 @@ int main(int argc, char **argv, char **envp) cocoa_display_init(ds, full_screen); break; case DT_GTK: - gtk_display_init(ds, full_screen, grab_on_hover); + gtk_display_init(ds, &dpy); break; default: break; From fe91f36aa5bd846cea816cf0a9b7a13dd76559c1 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:15 +0100 Subject: [PATCH 04/12] sdl: use DisplayOptions Switch sdl ui to use qapi DisplayOptions for configuration. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-6-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 8 ++++---- qapi/ui.json | 5 +++-- ui/sdl.c | 19 +++++++++++++------ ui/sdl2.c | 33 +++++++++++++++++++-------------- vl.c | 13 +++++++++++-- 5 files changed, 50 insertions(+), 28 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 82cb000e3b..4e4d027936 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -431,16 +431,16 @@ void surface_gl_setup_viewport(QemuGLShader *gls, /* sdl.c */ #ifdef CONFIG_SDL -void sdl_display_early_init(int opengl); -void sdl_display_init(DisplayState *ds, int full_screen); +void sdl_display_early_init(DisplayOptions *opts); +void sdl_display_init(DisplayState *ds, DisplayOptions *opts); #else -static inline void sdl_display_early_init(int opengl) +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, int full_screen) +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"); diff --git a/qapi/ui.json b/qapi/ui.json index 878a3bd2a6..2efe9675b7 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1020,7 +1020,7 @@ # ## { 'enum' : 'DisplayType', - 'data' : [ 'none', 'gtk' ] } + 'data' : [ 'none', 'gtk', 'sdl' ] } ## # @DisplayOptions: @@ -1042,4 +1042,5 @@ '*gl' : 'bool' }, 'discriminator' : 'type', 'data' : { 'none' : 'DisplayNoOpts', - 'gtk' : 'DisplayGTK' } } + 'gtk' : 'DisplayGTK', + 'sdl' : 'DisplayNoOpts' } } diff --git a/ui/sdl.c b/ui/sdl.c index a6bff301eb..963cdf77a7 100644 --- a/ui/sdl.c +++ b/ui/sdl.c @@ -41,6 +41,7 @@ static DisplayChangeListener *dcl; static DisplaySurface *surface; +static DisplayOptions *opts; static SDL_Surface *real_screen; static SDL_Surface *guest_screen = NULL; static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ @@ -769,6 +770,7 @@ static void handle_activation(SDL_Event *ev) static void sdl_refresh(DisplayChangeListener *dcl) { SDL_Event ev1, *ev = &ev1; + bool allow_close = true; int idle = 1; if (last_vm_running != runstate_is_running()) { @@ -793,7 +795,10 @@ static void sdl_refresh(DisplayChangeListener *dcl) handle_keyup(ev); break; case SDL_QUIT: - if (!no_quit) { + if (opts->has_window_close && !opts->window_close) { + allow_close = false; + } + if (allow_close) { no_shutdown = 0; qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_UI); } @@ -892,9 +897,9 @@ static const DisplayChangeListenerOps dcl_ops = { .dpy_cursor_define = sdl_mouse_define, }; -void sdl_display_early_init(int opengl) +void sdl_display_early_init(DisplayOptions *opts) { - if (opengl == 1 /* on */) { + if (opts->has_gl && opts->gl) { fprintf(stderr, "SDL1 display code has no opengl support.\n" "Please recompile qemu with SDL2, using\n" @@ -902,7 +907,7 @@ void sdl_display_early_init(int opengl) } } -void sdl_display_init(DisplayState *ds, int full_screen) +void sdl_display_init(DisplayState *ds, DisplayOptions *o) { int flags; uint8_t data = 0; @@ -910,6 +915,8 @@ void sdl_display_init(DisplayState *ds, int full_screen) SDL_SysWMinfo info; char *filename; + assert(o->type == DISPLAY_TYPE_SDL); + opts = o; #if defined(__APPLE__) /* always use generic keymaps */ if (!keyboard_layout) @@ -924,7 +931,7 @@ void sdl_display_init(DisplayState *ds, int full_screen) g_printerr("Running QEMU with SDL 1.2 is deprecated, and will be removed\n" "in a future release. Please switch to SDL 2.0 instead\n"); - if (!full_screen) { + if (opts->has_full_screen && opts->full_screen) { setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 0); } #ifdef __linux__ @@ -967,7 +974,7 @@ void sdl_display_init(DisplayState *ds, int full_screen) g_free(filename); } - if (full_screen) { + if (opts->has_full_screen && opts->full_screen) { gui_fullscreen = 1; sdl_grab_start(); } diff --git a/ui/sdl2.c b/ui/sdl2.c index 858e04d7c0..6e96a4a24c 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -32,6 +32,7 @@ static int sdl2_num_outputs; static struct sdl2_console *sdl2_console; +static DisplayOptions *opts; static SDL_Surface *guest_sprite_surface; static int gui_grab; /* if true, all keyboard/mouse events are grabbed */ @@ -526,6 +527,7 @@ static void handle_mousewheel(SDL_Event *ev) static void handle_windowevent(SDL_Event *ev) { struct sdl2_console *scon = get_scon_from_window(ev->window.windowID); + bool allow_close = true; if (!scon) { return; @@ -572,7 +574,10 @@ static void handle_windowevent(SDL_Event *ev) break; case SDL_WINDOWEVENT_CLOSE: if (qemu_console_is_graphic(scon->dcl.con)) { - if (!no_quit) { + if (opts->has_window_close && !opts->window_close) { + allow_close = false; + } + if (allow_close) { no_shutdown = 0; qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_UI); } @@ -593,6 +598,7 @@ static void handle_windowevent(SDL_Event *ev) void sdl2_poll_events(struct sdl2_console *scon) { SDL_Event ev1, *ev = &ev1; + bool allow_close = true; int idle = 1; if (scon->last_vm_running != runstate_is_running()) { @@ -615,7 +621,10 @@ void sdl2_poll_events(struct sdl2_console *scon) handle_textinput(ev); break; case SDL_QUIT: - if (!no_quit) { + if (opts->has_window_close && !opts->window_close) { + allow_close = false; + } + if (allow_close) { no_shutdown = 0; qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_UI); } @@ -750,24 +759,17 @@ static const DisplayChangeListenerOps dcl_gl_ops = { }; #endif -void sdl_display_early_init(int opengl) +void sdl_display_early_init(DisplayOptions *o) { - switch (opengl) { - case -1: /* default */ - case 0: /* off */ - break; - case 1: /* on */ + assert(o->type == DISPLAY_TYPE_SDL); + if (o->has_gl && o->gl) { #ifdef CONFIG_OPENGL display_opengl = 1; #endif - break; - default: - g_assert_not_reached(); - break; } } -void sdl_display_init(DisplayState *ds, int full_screen) +void sdl_display_init(DisplayState *ds, DisplayOptions *o) { int flags; uint8_t data = 0; @@ -775,6 +777,9 @@ void sdl_display_init(DisplayState *ds, int full_screen) int i; SDL_SysWMinfo info; + assert(o->type == DISPLAY_TYPE_SDL); + opts = o; + #ifdef __linux__ /* on Linux, SDL may use fbcon|directfb|svgalib when run without * accessible $DISPLAY to open X11 window. This is often the case @@ -849,7 +854,7 @@ void sdl_display_init(DisplayState *ds, int full_screen) g_free(filename); } - if (full_screen) { + if (opts->has_full_screen && opts->full_screen) { gui_fullscreen = 1; sdl_grab_start(0); } diff --git a/vl.c b/vl.c index a82b7cf16f..61b72758a8 100644 --- a/vl.c +++ b/vl.c @@ -2101,6 +2101,7 @@ static LegacyDisplayType select_display(const char *p) if (strstart(p, "sdl", &opts)) { #ifdef CONFIG_SDL display = DT_SDL; + dpy.type = DISPLAY_TYPE_SDL; while (*opts) { const char *nextopt; @@ -2135,19 +2136,25 @@ static LegacyDisplayType 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; } @@ -3668,6 +3675,7 @@ int main(int argc, char **argv, char **envp) case QEMU_OPTION_sdl: #ifdef CONFIG_SDL display_type = DT_SDL; + dpy.type = DISPLAY_TYPE_SDL; break; #else error_report("SDL support is disabled"); @@ -4334,6 +4342,7 @@ int main(int argc, char **argv, char **envp) 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; #elif defined(CONFIG_VNC) @@ -4358,7 +4367,7 @@ int main(int argc, char **argv, char **envp) } if (display_type == DT_SDL) { - sdl_display_early_init(request_opengl); + sdl_display_early_init(&dpy); } qemu_console_early_init(); @@ -4693,7 +4702,7 @@ int main(int argc, char **argv, char **envp) curses_display_init(ds, full_screen); break; case DT_SDL: - sdl_display_init(ds, full_screen); + sdl_display_init(ds, &dpy); break; case DT_COCOA: cocoa_display_init(ds, full_screen); From 78782712a62d56b4bfdd2a3a641eb40e255b5371 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:16 +0100 Subject: [PATCH 05/12] vl: drop no_quit variable Not used any more, delete it. Signed-off-by: Gerd Hoffmann Message-id: 20180202111022.19269-7-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- vl.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/vl.c b/vl.c index 61b72758a8..f52bc3b879 100644 --- a/vl.c +++ b/vl.c @@ -153,7 +153,6 @@ int vga_interface_type = VGA_NONE; static int full_screen = 0; static DisplayOptions dpy; int no_frame; -int no_quit = 0; Chardev *serial_hds[MAX_SERIAL_PORTS]; Chardev *parallel_hds[MAX_PARALLEL_PORTS]; Chardev *virtcon_hds[MAX_VIRTIO_CONSOLES]; @@ -2138,10 +2137,8 @@ static LegacyDisplayType select_display(const char *p) 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; @@ -3668,7 +3665,6 @@ 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; @@ -4357,7 +4353,8 @@ int main(int argc, char **argv, char **envp) 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 && + (display_type != DT_GTK && display_type != DT_SDL)) { error_report("-no-quit is only valid for GTK and SDL, " "ignoring option"); } From 0d2dd9f0096327831121e2e4b75249b551f8d8ef Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:17 +0100 Subject: [PATCH 06/12] egl-headless: use DisplayOptions Switch egl-headless ui to use qapi DisplayOptions for configuration. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-8-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 2 +- qapi/ui.json | 5 +++-- ui/egl-headless.c | 2 +- vl.c | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 4e4d027936..183d9f2913 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -505,6 +505,6 @@ static inline void early_gtk_display_init(DisplayOptions *opts) #endif /* egl-headless.c */ -void egl_headless_init(void); +void egl_headless_init(DisplayOptions *opts); #endif diff --git a/qapi/ui.json b/qapi/ui.json index 2efe9675b7..43de75fa27 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1020,7 +1020,7 @@ # ## { 'enum' : 'DisplayType', - 'data' : [ 'none', 'gtk', 'sdl' ] } + 'data' : [ 'none', 'gtk', 'sdl', 'egl-headless' ] } ## # @DisplayOptions: @@ -1043,4 +1043,5 @@ 'discriminator' : 'type', 'data' : { 'none' : 'DisplayNoOpts', 'gtk' : 'DisplayGTK', - 'sdl' : 'DisplayNoOpts' } } + 'sdl' : 'DisplayNoOpts', + 'egl-headless' : 'DisplayNoOpts' } } diff --git a/ui/egl-headless.c b/ui/egl-headless.c index 5d50226869..38b3766548 100644 --- a/ui/egl-headless.c +++ b/ui/egl-headless.c @@ -154,7 +154,7 @@ static const DisplayChangeListenerOps egl_ops = { .dpy_gl_update = egl_scanout_flush, }; -void egl_headless_init(void) +void egl_headless_init(DisplayOptions *opts) { QemuConsole *con; egl_dpy *edpy; diff --git a/vl.c b/vl.c index f52bc3b879..38c18ef2e6 100644 --- a/vl.c +++ b/vl.c @@ -2178,6 +2178,7 @@ static LegacyDisplayType select_display(const char *p) request_opengl = 1; display_opengl = 1; display = DT_EGL; + dpy.type = DISPLAY_TYPE_EGL_HEADLESS; #else error_report("egl support is disabled"); exit(1); @@ -4726,7 +4727,7 @@ int main(int argc, char **argv, char **envp) #ifdef CONFIG_OPENGL_DMABUF if (display_type == DT_EGL) { - egl_headless_init(); + egl_headless_init(&dpy); } #endif From 14f130fad872f7accef77925288d730ecadded5d Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:18 +0100 Subject: [PATCH 07/12] curses: use DisplayOptions Switch curses ui to use qapi DisplayOptions for configuration. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-9-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 4 ++-- qapi/ui.json | 5 +++-- ui/curses.c | 2 +- vl.c | 4 +++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 183d9f2913..65ed6ddca6 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -471,9 +471,9 @@ int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp); /* curses.c */ #ifdef CONFIG_CURSES -void curses_display_init(DisplayState *ds, int full_screen); +void curses_display_init(DisplayState *ds, DisplayOptions *opts); #else -static inline void curses_display_init(DisplayState *ds, int full_screen) +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"); diff --git a/qapi/ui.json b/qapi/ui.json index 43de75fa27..11aad8b496 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1020,7 +1020,7 @@ # ## { 'enum' : 'DisplayType', - 'data' : [ 'none', 'gtk', 'sdl', 'egl-headless' ] } + 'data' : [ 'none', 'gtk', 'sdl', 'egl-headless', 'curses' ] } ## # @DisplayOptions: @@ -1044,4 +1044,5 @@ 'data' : { 'none' : 'DisplayNoOpts', 'gtk' : 'DisplayGTK', 'sdl' : 'DisplayNoOpts', - 'egl-headless' : 'DisplayNoOpts' } } + 'egl-headless' : 'DisplayNoOpts', + 'curses' : 'DisplayNoOpts' } } diff --git a/ui/curses.c b/ui/curses.c index 85503876c0..479b77bd03 100644 --- a/ui/curses.c +++ b/ui/curses.c @@ -434,7 +434,7 @@ static const DisplayChangeListenerOps dcl_ops = { .dpy_text_cursor = curses_cursor_position, }; -void curses_display_init(DisplayState *ds, int full_screen) +void curses_display_init(DisplayState *ds, DisplayOptions *opts) { #ifndef _WIN32 if (!isatty(1)) { diff --git a/vl.c b/vl.c index 38c18ef2e6..3752ebec49 100644 --- a/vl.c +++ b/vl.c @@ -2186,6 +2186,7 @@ static LegacyDisplayType select_display(const char *p) } 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); @@ -3268,6 +3269,7 @@ int main(int argc, char **argv, char **envp) 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); @@ -4697,7 +4699,7 @@ int main(int argc, char **argv, char **envp) /* init local displays */ switch (display_type) { case DT_CURSES: - curses_display_init(ds, full_screen); + curses_display_init(ds, &dpy); break; case DT_SDL: sdl_display_init(ds, &dpy); From 767f9bf3b5621acfe97e53d3a3a7bddf66c39ff6 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:19 +0100 Subject: [PATCH 08/12] cocoa: use DisplayOptions Switch cocoa ui to use qapi DisplayOptions for configuration. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-10-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- include/ui/console.h | 4 ++-- qapi/ui.json | 6 ++++-- ui/cocoa.m | 4 ++-- vl.c | 3 ++- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index 65ed6ddca6..e6b1227bef 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -450,9 +450,9 @@ static inline void sdl_display_init(DisplayState *ds, DisplayOptions *opts) /* cocoa.m */ #ifdef CONFIG_COCOA -void cocoa_display_init(DisplayState *ds, int full_screen); +void cocoa_display_init(DisplayState *ds, DisplayOptions *opts); #else -static inline void cocoa_display_init(DisplayState *ds, int full_screen) +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"); diff --git a/qapi/ui.json b/qapi/ui.json index 11aad8b496..398baa9698 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1020,7 +1020,8 @@ # ## { 'enum' : 'DisplayType', - 'data' : [ 'none', 'gtk', 'sdl', 'egl-headless', 'curses' ] } + 'data' : [ 'none', 'gtk', 'sdl', + 'egl-headless', 'curses', 'cocoa' ] } ## # @DisplayOptions: @@ -1045,4 +1046,5 @@ 'gtk' : 'DisplayGTK', 'sdl' : 'DisplayNoOpts', 'egl-headless' : 'DisplayNoOpts', - 'curses' : 'DisplayNoOpts' } } + 'curses' : 'DisplayNoOpts', + 'cocoa' : 'DisplayNoOpts' } } diff --git a/ui/cocoa.m b/ui/cocoa.m index 51db47cd71..90d9aa57ea 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -1683,12 +1683,12 @@ static void addRemovableDevicesMenuItems(void) qapi_free_BlockInfoList(pointerToFree); } -void cocoa_display_init(DisplayState *ds, int full_screen) +void cocoa_display_init(DisplayState *ds, DisplayOptions *opts) { COCOA_DEBUG("qemu_cocoa: cocoa_display_init\n"); /* if fullscreen mode is to be used */ - if (full_screen == true) { + if (opts->has_full_screen && opts->full_screen) { [NSApp activateIgnoringOtherApps: YES]; [(QemuCocoaAppController *)[[NSApplication sharedApplication] delegate] toggleFullScreen: nil]; } diff --git a/vl.c b/vl.c index 3752ebec49..2dd00e00d9 100644 --- a/vl.c +++ b/vl.c @@ -4344,6 +4344,7 @@ int main(int argc, char **argv, char **envp) 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 @@ -4705,7 +4706,7 @@ int main(int argc, char **argv, char **envp) sdl_display_init(ds, &dpy); break; case DT_COCOA: - cocoa_display_init(ds, full_screen); + cocoa_display_init(ds, &dpy); break; case DT_GTK: gtk_display_init(ds, &dpy); From 6815515ede8056d5d5526e504dc32658f27fd927 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:20 +0100 Subject: [PATCH 09/12] vl: drop full_screen variable Not used any more, delete it. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-11-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- vl.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/vl.c b/vl.c index 2dd00e00d9..6271ad0634 100644 --- a/vl.c +++ b/vl.c @@ -150,7 +150,6 @@ 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; Chardev *serial_hds[MAX_SERIAL_PORTS]; @@ -3652,7 +3651,6 @@ 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; From 9b9b46c71c4cbec4559ed2edd51d88ac96efa480 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:21 +0100 Subject: [PATCH 10/12] vl: drop request_opengl variable Switch over the one leftover user to qapi DisplayType. The delete the unused request_opengl variable. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-12-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- vl.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/vl.c b/vl.c index 6271ad0634..11dc98eba2 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; @@ -2146,10 +2145,8 @@ static LegacyDisplayType select_display(const char *p) 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; @@ -2174,7 +2171,6 @@ static LegacyDisplayType 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; @@ -2211,10 +2207,8 @@ static LegacyDisplayType select_display(const char *p) 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; @@ -4371,7 +4365,7 @@ int main(int argc, char **argv, char **envp) 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 From e3af9f9a4075e81a0854017721de1799795d0a15 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Fri, 2 Feb 2018 12:10:22 +0100 Subject: [PATCH 11/12] vl: drop display_type variable Switch over all leftover users to qapi DisplayType. Then delete the unused display_type variable. Add 'default' DisplayType, which isn't an actual display type but a placeholder for "user didn't specify a display". It will be replaced by the DisplayType actually used, which in turn depends on the DisplayTypes availabel in the particular build. Signed-off-by: Gerd Hoffmann Reviewed-by: Eric Blake Message-id: 20180202111022.19269-13-kraxel@redhat.com Signed-off-by: Gerd Hoffmann --- qapi/ui.json | 5 +++-- vl.c | 54 ++++++++++++++-------------------------------------- 2 files changed, 17 insertions(+), 42 deletions(-) diff --git a/qapi/ui.json b/qapi/ui.json index 398baa9698..3e82f25ac5 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1020,7 +1020,7 @@ # ## { 'enum' : 'DisplayType', - 'data' : [ 'none', 'gtk', 'sdl', + 'data' : [ 'default', 'none', 'gtk', 'sdl', 'egl-headless', 'curses', 'cocoa' ] } ## @@ -1042,7 +1042,8 @@ '*window-close' : 'bool', '*gl' : 'bool' }, 'discriminator' : 'type', - 'data' : { 'none' : 'DisplayNoOpts', + 'data' : { 'default' : 'DisplayNoOpts', + 'none' : 'DisplayNoOpts', 'gtk' : 'DisplayGTK', 'sdl' : 'DisplayNoOpts', 'egl-headless' : 'DisplayNoOpts', diff --git a/vl.c b/vl.c index 11dc98eba2..9e7235df6d 100644 --- a/vl.c +++ b/vl.c @@ -2080,24 +2080,12 @@ static void select_vgahw(const char *p) } } -typedef enum LegacyDisplayType { - DT_DEFAULT, - DT_CURSES, - DT_SDL, - DT_COCOA, - DT_GTK, - DT_EGL, - DT_NONE, -} LegacyDisplayType; - -static LegacyDisplayType select_display(const char *p) +static void parse_display(const char *p) { const char *opts; - LegacyDisplayType display = DT_DEFAULT; if (strstart(p, "sdl", &opts)) { #ifdef CONFIG_SDL - display = DT_SDL; dpy.type = DISPLAY_TYPE_SDL; while (*opts) { const char *nextopt; @@ -2172,7 +2160,6 @@ static LegacyDisplayType select_display(const char *p) } else if (strstart(p, "egl-headless", &opts)) { #ifdef CONFIG_OPENGL_DMABUF display_opengl = 1; - display = DT_EGL; dpy.type = DISPLAY_TYPE_EGL_HEADLESS; #else error_report("egl support is disabled"); @@ -2180,7 +2167,6 @@ static LegacyDisplayType select_display(const char *p) #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"); @@ -2188,7 +2174,6 @@ static LegacyDisplayType select_display(const char *p) #endif } else if (strstart(p, "gtk", &opts)) { #ifdef CONFIG_GTK - display = DT_GTK; dpy.type = DISPLAY_TYPE_GTK; while (*opts) { const char *nextopt; @@ -2225,14 +2210,11 @@ static LegacyDisplayType 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) @@ -3056,7 +3038,6 @@ int main(int argc, char **argv, char **envp) const char *incoming = NULL; bool userconfig = true; bool nographic = false; - LegacyDisplayType display_type = DT_DEFAULT; int display_remote = 0; const char *log_mask = NULL; const char *log_file = NULL; @@ -3250,18 +3231,16 @@ 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"); @@ -3665,7 +3644,6 @@ int main(int argc, char **argv, char **envp) break; case QEMU_OPTION_sdl: #ifdef CONFIG_SDL - display_type = DT_SDL; dpy.type = DISPLAY_TYPE_SDL; break; #else @@ -4281,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); } @@ -4327,39 +4305,35 @@ 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 (dpy.has_window_close && - (display_type != DT_GTK && display_type != DT_SDL)) { + (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) { + if (dpy.type == DISPLAY_TYPE_GTK) { early_gtk_display_init(&dpy); } - if (display_type == DT_SDL) { + if (dpy.type == DISPLAY_TYPE_SDL) { sdl_display_early_init(&dpy); } @@ -4690,17 +4664,17 @@ int main(int argc, char **argv, char **envp) ds = init_displaystate(); /* init local displays */ - switch (display_type) { - case DT_CURSES: + switch (dpy.type) { + case DISPLAY_TYPE_CURSES: curses_display_init(ds, &dpy); break; - case DT_SDL: + case DISPLAY_TYPE_SDL: sdl_display_init(ds, &dpy); break; - case DT_COCOA: + case DISPLAY_TYPE_COCOA: cocoa_display_init(ds, &dpy); break; - case DT_GTK: + case DISPLAY_TYPE_GTK: gtk_display_init(ds, &dpy); break; default: @@ -4721,7 +4695,7 @@ int main(int argc, char **argv, char **envp) } #ifdef CONFIG_OPENGL_DMABUF - if (display_type == DT_EGL) { + if (dpy.type == DISPLAY_TYPE_EGL_HEADLESS) { egl_headless_init(&dpy); } #endif From 63ad932567df012ff4bf820a9ed0e2affd9dc5af Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Sat, 17 Feb 2018 12:26:49 +0100 Subject: [PATCH 12/12] ui: Reorder vte terminal packing to avoid gtk3 warnings Fill the terminal box from right to left to avoid Gtk-WARNING **: Allocating size to GtkScrollbar 0x55f6d54b0200 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate? Signed-off-by: Jan Kiszka Message-id: 902aaef8-d20e-0530-dea2-cdfe3db33ff3@web.de Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index ad4910c70d..ab646b70e1 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1952,8 +1952,8 @@ static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, scrollbar = gtk_vscrollbar_new(vadjustment); #endif - gtk_box_pack_start(GTK_BOX(box), vc->vte.terminal, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(box), scrollbar, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(box), scrollbar, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(box), vc->vte.terminal, TRUE, TRUE, 0); vc->vte.box = box; vc->vte.scrollbar = scrollbar;