ui: highres logo for sdl and gtk, bugfixes for vnc and egl.

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABAgAGBQJcRdMbAAoJEEy22O7T6HE4wLwQAMncybVlGwPi+1+8qyzOKFJU
 pKWpqVj0lt5Pfl/7ChwOeZ9TieMs0M+A/8Bw98QYTWrjXUiEAbi+p2NjF9EHdZqI
 FfU6q1dGQGrfdOBRu+ep5WT3um0vQ4F+D0bCttlq0bIAjLi5cj3dfbHViiHLtjMD
 yRSoCwy899kAFusCPKXsreXjygvdUFN/7IFVMj4r1Sr2p23hgZ62d7jxUrK1pdez
 450kaXmiZZysv9zJiXZ0dRQQ0cr5jYvUqqWgkS1DuSMBju21LASWfRvD9TWWt2/X
 O7B8pXSpuTMcFoAzXznVv472fh3Ftb8bTXjtJBXE9XslxIGG6xSZ8Qq5ID6w2ofw
 Ki8vRxVg8lrDh/Glky3Vvvb94AnsII2SLs05O3M8KKDOtn6tB0aZCHDpJnHlFJuY
 xAYUvkKTyZdjfwwkQy2VLTkXTz73ZaHeIy29raqTUzAoh+ioj96OaOCY5nmf81Tq
 q+bETkp0EqwF4fslHt/vzHKWp+lXfkWL88VY/Z4TETqd8fqypPkkysBV0XeFZMga
 HjJ33LRaITqTSQl/qQ8i/s5yX9RVyWTcVZsuqOCAYtNLCV8Pc/AHsCUda9SMu7Ub
 WnSrq4OMkixZ2ez+ZH0uDt+TZk20cC0RlhC33nJED5ZsRWX9c0ben39BaAHqn6S8
 1giOMF4NG5feJKxeUeEL
 =spwT
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kraxel/tags/ui-20190121-pull-request' into staging

ui: highres logo for sdl and gtk, bugfixes for vnc and egl.

# gpg: Signature made Mon 21 Jan 2019 14:11:39 GMT
# gpg:                using RSA key 4CB6D8EED3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"
# Primary key fingerprint: A032 8CFF B93A 17A7 9901  FE7D 4CB6 D8EE D3E8 7138

* remotes/kraxel/tags/ui-20190121-pull-request:
  egl-helpers.h: do not depend on X11 Window type, use EGLNativeWindowType
  vnc: detect and optimize pageflips
  sdl: add support for high resolution window icon
  ui: fix icon display for GTK frontend under GNOME Shell with Wayland
  ui: install logo icons to $prefix/share/icons

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
master
Peter Maydell 2019-01-23 17:57:47 +00:00
commit f6b06fccee
22 changed files with 131 additions and 30 deletions

View File

@ -669,7 +669,6 @@ pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \ efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom \
efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \ efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom \
efi-e1000e.rom efi-vmxnet3.rom \ efi-e1000e.rom efi-vmxnet3.rom \
qemu-icon.bmp qemu_logo_no_text.svg \
bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \ bamboo.dtb canyonlands.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \ multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
s390-ccw.img s390-netboot.img \ s390-ccw.img s390-netboot.img \
@ -722,6 +721,7 @@ ifneq (,$(findstring qemu-ga,$(TOOLS)))
endif endif
endif endif
ICON_SIZES=16x16 24x24 32x32 48x48 64x64 128x128 256x256 512x512
install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir install: all $(if $(BUILD_DOCS),install-doc) install-datadir install-localstatedir
ifneq ($(TOOLS),) ifneq ($(TOOLS),)
@ -743,6 +743,20 @@ ifneq ($(BLOBS),)
$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \ $(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
done done
endif endif
for s in $(ICON_SIZES); do \
mkdir -p "$(DESTDIR)/$(qemu_icondir)/hicolor/$${s}/apps"; \
$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_$${s}.png \
"$(DESTDIR)/$(qemu_icondir)/hicolor/$${s}/apps/qemu.png"; \
done; \
mkdir -p "$(DESTDIR)/$(qemu_icondir)/hicolor/32x32/apps"; \
$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu_32x32.bmp \
"$(DESTDIR)/$(qemu_icondir)/hicolor/32x32/apps/qemu.bmp"; \
mkdir -p "$(DESTDIR)/$(qemu_icondir)/hicolor/scalable/apps"; \
$(INSTALL_DATA) $(SRC_PATH)/ui/icons/qemu.svg \
"$(DESTDIR)/$(qemu_icondir)/hicolor/scalable/apps/qemu.svg"
mkdir -p "$(DESTDIR)/$(qemu_desktopdir)"
$(INSTALL_DATA) $(SRC_PATH)/ui/qemu.desktop \
"$(DESTDIR)/$(qemu_desktopdir)/qemu.desktop"
ifdef CONFIG_GTK ifdef CONFIG_GTK
$(MAKE) -C po $@ $(MAKE) -C po $@
endif endif

47
configure vendored
View File

@ -349,6 +349,7 @@ fdt=""
netmap="no" netmap="no"
sdl="" sdl=""
sdlabi="" sdlabi=""
sdl_image=""
virtfs="" virtfs=""
mpath="" mpath=""
vnc="yes" vnc="yes"
@ -1045,6 +1046,10 @@ for opt do
;; ;;
--with-sdlabi=*) sdlabi="$optarg" --with-sdlabi=*) sdlabi="$optarg"
;; ;;
--disable-sdl-image) sdl_image="no"
;;
--enable-sdl-image) sdl_image="yes"
;;
--disable-qom-cast-debug) qom_cast_debug="no" --disable-qom-cast-debug) qom_cast_debug="no"
;; ;;
--enable-qom-cast-debug) qom_cast_debug="yes" --enable-qom-cast-debug) qom_cast_debug="yes"
@ -1707,6 +1712,7 @@ disabled with --disable-FEATURE, default is enabled if available:
gcrypt libgcrypt cryptography support gcrypt libgcrypt cryptography support
sdl SDL UI sdl SDL UI
--with-sdlabi select preferred SDL ABI 1.2 or 2.0 --with-sdlabi select preferred SDL ABI 1.2 or 2.0
sdl_image SDL Image support for icons
gtk gtk UI gtk gtk UI
vte vte support for the gtk UI vte vte support for the gtk UI
curses curses UI curses curses UI
@ -3008,10 +3014,43 @@ EOF
fi # sdl compile test fi # sdl compile test
} }
sdl_image_probe ()
{
if test "$sdl_image" != "no" ; then
if $pkg_config SDL2_image --exists; then
if test "$static" = "yes"; then
sdl_image_libs=$($pkg_config SDL2_image --libs --static 2>/dev/null)
else
sdl_image_libs=$($pkg_config SDL2_image --libs 2>/dev/null)
fi
sdl_image_cflags=$($pkg_config SDL2_image --cflags 2>/dev/null)
sdl_image=yes
sdl_cflags="$sdl_cflags $sdl_image_cflags"
sdl_libs="$sdl_libs $sdl_image_libs"
else
if test "$sdl_image" = "yes" ; then
feature_not_found "sdl_image" "Install SDL Image devel"
else
sdl_image=no
fi
fi
fi
}
if test "$sdl" != "no" ; then if test "$sdl" != "no" ; then
sdl_probe sdl_probe
fi fi
if test "$sdl" = "yes" ; then
sdl_image_probe
else
if test "$sdl_image" = "yes"; then
echo "warning: SDL Image requested, but SDL is not available, disabling"
fi
sdl_image=no
fi
if test "$sdl" = "yes" ; then if test "$sdl" = "yes" ; then
cat > $TMPC <<EOF cat > $TMPC <<EOF
#include <SDL.h> #include <SDL.h>
@ -5751,6 +5790,8 @@ qemu_confdir=$sysconfdir$confsuffix
qemu_moddir=$libdir$confsuffix qemu_moddir=$libdir$confsuffix
qemu_datadir=$datadir$confsuffix qemu_datadir=$datadir$confsuffix
qemu_localedir="$datadir/locale" qemu_localedir="$datadir/locale"
qemu_icondir="$datadir/icons"
qemu_desktopdir="$datadir/applications"
# We can only support ivshmem if we have eventfd # We can only support ivshmem if we have eventfd
if [ "$eventfd" = "yes" ]; then if [ "$eventfd" = "yes" ]; then
@ -6037,6 +6078,7 @@ if test "$darwin" = "yes" ; then
echo "Cocoa support $cocoa" echo "Cocoa support $cocoa"
fi fi
echo "SDL support $sdl $(echo_version $sdl $sdlversion)" echo "SDL support $sdl $(echo_version $sdl $sdlversion)"
echo "SDL image support $sdl_image"
echo "GTK support $gtk $(echo_version $gtk $gtk_version)" echo "GTK support $gtk $(echo_version $gtk $gtk_version)"
echo "GTK GL support $gtk_gl" echo "GTK GL support $gtk_gl"
echo "VTE support $vte $(echo_version $vte $vteversion)" echo "VTE support $vte $(echo_version $vte $vteversion)"
@ -6220,6 +6262,8 @@ if test "$mingw32" = "no" ; then
fi fi
echo "qemu_helperdir=$libexecdir" >> $config_host_mak echo "qemu_helperdir=$libexecdir" >> $config_host_mak
echo "qemu_localedir=$qemu_localedir" >> $config_host_mak echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
echo "qemu_icondir=$qemu_icondir" >> $config_host_mak
echo "qemu_desktopdir=$qemu_desktopdir" >> $config_host_mak
echo "libs_softmmu=$libs_softmmu" >> $config_host_mak echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
echo "GIT=$git" >> $config_host_mak echo "GIT=$git" >> $config_host_mak
echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
@ -6374,6 +6418,9 @@ if test "$sdl" = "yes" ; then
echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak echo "CONFIG_SDLABI=$sdlabi" >> $config_host_mak
echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
echo "SDL_LIBS=$sdl_libs" >> $config_host_mak echo "SDL_LIBS=$sdl_libs" >> $config_host_mak
if test "$sdl_image" = "yes" ; then
echo "CONFIG_SDL_IMAGE=y" >> $config_host_mak
fi
fi fi
if test "$cocoa" = "yes" ; then if test "$cocoa" = "yes" ; then
echo "CONFIG_COCOA=y" >> $config_host_mak echo "CONFIG_COCOA=y" >> $config_host_mak

View File

@ -43,7 +43,7 @@ void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf);
#endif #endif
EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win); EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, EGLNativeWindowType win);
int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, DisplayGLMode mode); int qemu_egl_init_dpy_x11(EGLNativeDisplayType dpy, DisplayGLMode mode);
int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, DisplayGLMode mode); int qemu_egl_init_dpy_mesa(EGLNativeDisplayType dpy, DisplayGLMode mode);

View File

@ -6,6 +6,9 @@
#include <SDL.h> #include <SDL.h>
#include <SDL_syswm.h> #include <SDL_syswm.h>
#ifdef CONFIG_SDL_IMAGE
# include <SDL_image.h>
#endif
#ifdef CONFIG_OPENGL #ifdef CONFIG_OPENGL
# include "ui/egl-helpers.h" # include "ui/egl-helpers.h"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 B

View File

@ -273,14 +273,14 @@ void egl_dmabuf_release_texture(QemuDmaBuf *dmabuf)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, Window win) EGLSurface qemu_egl_init_surface_x11(EGLContext ectx, EGLNativeWindowType win)
{ {
EGLSurface esurface; EGLSurface esurface;
EGLBoolean b; EGLBoolean b;
esurface = eglCreateWindowSurface(qemu_egl_display, esurface = eglCreateWindowSurface(qemu_egl_display,
qemu_egl_config, qemu_egl_config,
(EGLNativeWindowType)win, NULL); win, NULL);
if (esurface == EGL_NO_SURFACE) { if (esurface == EGL_NO_SURFACE) {
error_report("egl: eglCreateWindowSurface failed"); error_report("egl: eglCreateWindowSurface failed");
return NULL; return NULL;

View File

@ -54,7 +54,8 @@ void gd_egl_init(VirtualConsole *vc)
} }
vc->gfx.ectx = qemu_egl_init_ctx(); vc->gfx.ectx = qemu_egl_init_ctx();
vc->gfx.esurface = qemu_egl_init_surface_x11(vc->gfx.ectx, x11_window); vc->gfx.esurface = qemu_egl_init_surface_x11
(vc->gfx.ectx, (EGLNativeWindowType)x11_window);
assert(vc->gfx.esurface); assert(vc->gfx.esurface);
} }

View File

@ -2214,8 +2214,8 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
VirtualConsole *vc; VirtualConsole *vc;
GtkDisplayState *s = g_malloc0(sizeof(*s)); GtkDisplayState *s = g_malloc0(sizeof(*s));
char *filename;
GdkDisplay *window_display; GdkDisplay *window_display;
GtkIconTheme *theme;
if (!gtkinit) { if (!gtkinit) {
fprintf(stderr, "gtk initialization failed\n"); fprintf(stderr, "gtk initialization failed\n");
@ -2224,6 +2224,10 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
assert(opts->type == DISPLAY_TYPE_GTK); assert(opts->type == DISPLAY_TYPE_GTK);
s->opts = opts; s->opts = opts;
theme = gtk_icon_theme_get_default();
gtk_icon_theme_prepend_search_path(theme, CONFIG_QEMU_ICONDIR);
g_set_prgname("qemu");
s->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); s->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
s->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); s->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
s->notebook = gtk_notebook_new(); s->notebook = gtk_notebook_new();
@ -2248,17 +2252,7 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
qemu_add_mouse_mode_change_notifier(&s->mouse_mode_notifier); qemu_add_mouse_mode_change_notifier(&s->mouse_mode_notifier);
qemu_add_vm_change_state_handler(gd_change_runstate, s); qemu_add_vm_change_state_handler(gd_change_runstate, s);
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "qemu_logo_no_text.svg"); gtk_window_set_icon_name(GTK_WINDOW(s->window), "qemu");
if (filename) {
GError *error = NULL;
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, &error);
if (pixbuf) {
gtk_window_set_icon(GTK_WINDOW(s->window), pixbuf);
} else {
g_error_free(error);
}
g_free(filename);
}
gd_create_menus(s); gd_create_menus(s);

13
ui/icons/Makefile Normal file
View File

@ -0,0 +1,13 @@
# Regenerate bitmaps from the SVG using inkscape CLI export
# and ImageMagick. Don't use ImageMagick for the initial
# SVG conversion, since it merely calls inkscape, but uses
# 96 DPI res resulting in poor quality output.
regenerate:
for s in 16 24 32 48 64 128 256 512; \
do \
inkscape --without-gui --export-png=qemu_$${s}x$${s}.png \
--export-width=$$s --export-height=$$s qemu.svg ; \
done
convert qemu_32x32.png qemu_32x32.bmp

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

BIN
ui/icons/qemu_128x128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
ui/icons/qemu_16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

BIN
ui/icons/qemu_24x24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
ui/icons/qemu_256x256.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
ui/icons/qemu_32x32.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
ui/icons/qemu_32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
ui/icons/qemu_48x48.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
ui/icons/qemu_512x512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
ui/icons/qemu_64x64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

8
ui/qemu.desktop Normal file
View File

@ -0,0 +1,8 @@
[Desktop Entry]
Version=1.0
Name=QEMU
Icon=qemu
Type=Application
Terminal=false
Keywords=Emulators;Virtualization;KVM;
NoDisplay=true

View File

@ -762,9 +762,9 @@ static void sdl2_display_early_init(DisplayOptions *o)
static void sdl2_display_init(DisplayState *ds, DisplayOptions *o) static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
{ {
uint8_t data = 0; uint8_t data = 0;
char *filename;
int i; int i;
SDL_SysWMinfo info; SDL_SysWMinfo info;
SDL_Surface *icon = NULL;
assert(o->type == DISPLAY_TYPE_SDL); assert(o->type == DISPLAY_TYPE_SDL);
@ -836,16 +836,18 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
#endif #endif
} }
#ifdef CONFIG_SDL_IMAGE
icon = IMG_Load(CONFIG_QEMU_ICONDIR "/hicolor/128x128/apps/qemu.png");
#else
/* Load a 32x32x4 image. White pixels are transparent. */ /* Load a 32x32x4 image. White pixels are transparent. */
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, "qemu-icon.bmp"); icon = SDL_LoadBMP(CONFIG_QEMU_ICONDIR "/hicolor/32x32/apps/qemu.bmp");
if (filename) { if (icon) {
SDL_Surface *image = SDL_LoadBMP(filename); uint32_t colorkey = SDL_MapRGB(icon->format, 255, 255, 255);
if (image) { SDL_SetColorKey(icon, SDL_TRUE, colorkey);
uint32_t colorkey = SDL_MapRGB(image->format, 255, 255, 255); }
SDL_SetColorKey(image, SDL_TRUE, colorkey); #endif
SDL_SetWindowIcon(sdl2_console[0].real_window, image); if (icon) {
} SDL_SetWindowIcon(sdl2_console[0].real_window, icon);
g_free(filename);
} }
gui_grab = 0; gui_grab = 0;

View File

@ -742,6 +742,17 @@ static void vnc_update_server_surface(VncDisplay *vd)
width, height); width, height);
} }
static bool vnc_check_pageflip(DisplaySurface *s1,
DisplaySurface *s2)
{
return (s1 != NULL &&
s2 != NULL &&
surface_width(s1) == surface_width(s2) &&
surface_height(s1) == surface_height(s2) &&
surface_format(s1) == surface_format(s2));
}
static void vnc_dpy_switch(DisplayChangeListener *dcl, static void vnc_dpy_switch(DisplayChangeListener *dcl,
DisplaySurface *surface) DisplaySurface *surface)
{ {
@ -749,6 +760,7 @@ static void vnc_dpy_switch(DisplayChangeListener *dcl,
"Display output is not active."; "Display output is not active.";
static DisplaySurface *placeholder; static DisplaySurface *placeholder;
VncDisplay *vd = container_of(dcl, VncDisplay, dcl); VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
bool pageflip = vnc_check_pageflip(vd->ds, surface);
VncState *vs; VncState *vs;
if (surface == NULL) { if (surface == NULL) {
@ -761,14 +773,21 @@ static void vnc_dpy_switch(DisplayChangeListener *dcl,
vnc_abort_display_jobs(vd); vnc_abort_display_jobs(vd);
vd->ds = surface; vd->ds = surface;
/* server surface */
vnc_update_server_surface(vd);
/* guest surface */ /* guest surface */
qemu_pixman_image_unref(vd->guest.fb); qemu_pixman_image_unref(vd->guest.fb);
vd->guest.fb = pixman_image_ref(surface->image); vd->guest.fb = pixman_image_ref(surface->image);
vd->guest.format = surface->format; vd->guest.format = surface->format;
if (pageflip) {
vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
surface_width(surface),
surface_height(surface));
return;
}
/* server surface */
vnc_update_server_surface(vd);
QTAILQ_FOREACH(vs, &vd->clients, next) { QTAILQ_FOREACH(vs, &vd->clients, next) {
vnc_colordepth(vs); vnc_colordepth(vs);
vnc_desktop_resize(vs); vnc_desktop_resize(vs);