Commit 41b8327a authored by Simon McVittie's avatar Simon McVittie

Update upstream source from tag 'upstream/3.34.0'

Update to upstream version '3.34.0'
with Debian dir 1492e216055d2a6f0529c543cde6d2ae793688d5
parents 2f5714f1 d09846c3
This diff is collapsed.
......@@ -31,7 +31,7 @@ A simple GNOME 3 application to access remote or virtual systems.
# Runtime Dependencies
* mcopy (usually provided by mtools package)
* genisoimage (usually provided by genisoimage package)
# Reporting Bugs
......@@ -54,6 +54,20 @@ include
The determination of what is useful is your task. If you forget about
something important, someone will probably ask.
# Contributing
## Finding Bugs
Bugs labelled as "Newcomers" for the project can be found here:
[Newcomers Bugs](https://gitlab.gnome.org/GNOME/gnome-boxes/issues?label_name%5B%5D=4.+Newcomers)
## Building the Project
Instructions for building the project can be found here:
[Build the Project](https://wiki.gnome.org/Newcomers/BuildProject)
# Appendix
## Backtracing
......
--- gnome-boxes-5/src/spice-display.vala~ 2017-07-20 19:01:57.817177298 +0100
+++ gnome-boxes-5/src/spice-display.vala 2017-07-20 19:24:55.686539194 +0100
@@ -1,7 +1,7 @@
// This file is part of GNOME Boxes. License: LGPLv2+
using Gtk;
using Spice;
-using LibUSB;
+//using LibUSB;
private class Boxes.SpiceDisplay: Boxes.Display {
public override string protocol { get { return "SPICE"; } }
@@ -54,6 +54,7 @@
gtk_session = GtkSession.get (session);
Spice.set_session_option (session);
+#if 0
try {
var manager = UsbDeviceManager.get (session);
@@ -65,6 +66,7 @@
});
} catch (GLib.Error error) {
}
+#endif
}
private Spice.MainChannel? _main_channel;
@@ -173,14 +175,16 @@
}
public override bool should_keep_alive () {
+#if 0
try {
var manager = UsbDeviceManager.get (session);
var devs = get_usb_devices (manager);
return (!closed && (devs.length > 0));
} catch (GLib.Error error) {
+#endif
return false;
- }
+// }
}
public override void set_enable_audio (bool enable) {
@@ -207,6 +211,7 @@
builder.append_printf ("Agent: %s\n", main_channel.agent_connected ? "connected" : "disconnected");
}
+#if 0
try {
var manager = UsbDeviceManager.get (session);
var devs = manager.get_devices ();
@@ -217,6 +222,7 @@
}
} catch (GLib.Error error) {
}
+#endif
}
public override void connect_it (owned Display.OpenFDFunc? open_fd = null) {
@@ -338,6 +344,7 @@
if (!connected)
break;
+#if 0
try {
var manager = UsbDeviceManager.get (session);
var devs = get_usb_devices (manager);
@@ -407,6 +414,7 @@
});
} catch (GLib.Error error) {
}
+#endif
break;
}
@@ -420,6 +428,7 @@
display.send_keys (keyvals, DisplayKeyEvent.CLICK);
}
+#if 0
private GLib.GenericArray<UsbDevice> get_usb_devices (UsbDeviceManager manager) {
GLib.GenericArray<UsbDevice> ret = new GLib.GenericArray<UsbDevice> ();
var devs = manager.get_devices ();
@@ -492,6 +501,7 @@
return ret;
}
+#endif
}
private class Boxes.SpiceChannelHandler : GLib.Object {
--- libvirt/bootstrap.conf~ 2017-06-06 14:08:56.365460561 +0100
+++ libvirt/bootstrap.conf 2017-06-06 14:09:30.721724034 +0100
@@ -203,7 +203,7 @@
autoconf 2.59
automake 1.9.6
autopoint -
-gettext 0.17
+xgettext 0.17
git 1.5.5
gzip -
libtool -
diff --git a/src/loader/pci_id_driver_map.c b/src/loader/pci_id_driver_map.c
index 8b2079e4354..c06c2ce8561 100644
--- a/src/loader/pci_id_driver_map.c
+++ b/src/loader/pci_id_driver_map.c
@@ -27,7 +27,14 @@ int is_nouveau_vieux(int fd);
#include <stdlib.h>
#include <xf86drm.h>
-#include <nouveau_drm.h>
+/* #include <nouveau_drm.h> */
+#define NOUVEAU_GETPARAM_CHIPSET_ID 11
+#define DRM_NOUVEAU_GETPARAM 0x00
+
+struct drm_nouveau_getparam {
+ uint64_t param;
+ uint64_t value;
+};
static int
nouveau_chipset(int fd)
diff --git a/src/gbm/main/backend.c b/src/gbm/main/backend.c
index 37ec9c16f40..b4e1a08bc1a 100644
--- a/src/gbm/main/backend.c
+++ b/src/gbm/main/backend.c
@@ -43,7 +43,7 @@ struct backend_desc {
};
static const struct backend_desc backends[] = {
- { "gbm_dri.so", &gbm_dri_backend },
+/* { "gbm_dri.so", &gbm_dri_backend }, */
};
static const void *
This diff is collapsed.
From 1306f978cadedcfcca674faf86b8fc47b2791be3 Mon Sep 17 00:00:00 2001
From: Felipe Borges <felipeborges@gnome.org>
Date: Fri, 2 Aug 2019 15:36:25 +0200
Subject: [PATCH] linux-user: fix to handle variably sized SIOCGSTAMP with new
kernels
Based/backported from commit 6d5d5dde9adb5acb32e6b8e3dfbf47fff0f308d2
---
linux-user/ioctls.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index ae8951625f..74476c99e4 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -1,3 +1,5 @@
+#include <linux/sockios.h>
+
/* emulated ioctl list */
IOCTL(TCGETS, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
--
2.21.0
From 0f01f30361cf22e2543c437e32efa12c782889a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= <berrange@redhat.com>
Date: Wed, 20 Mar 2019 16:18:42 +0000
Subject: [PATCH] linux-user: rename gettid() to sys_gettid() to avoid clash
with glibc
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The glibc-2.29.9000-6.fc31.x86_64 package finally includes the gettid()
function as part of unistd.h when __USE_GNU is defined. This clashes
with linux-user code which unconditionally defines this function name
itself.
/home/berrange/src/virt/qemu/linux-user/syscall.c:253:16: error: static declaration of ‘gettid’ follows non-static declaration
253 | _syscall0(int, gettid)
| ^~~~~~
/home/berrange/src/virt/qemu/linux-user/syscall.c:184:13: note: in definition of macro ‘_syscall0’
184 | static type name (void) \
| ^~~~
In file included from /usr/include/unistd.h:1170,
from /home/berrange/src/virt/qemu/include/qemu/osdep.h:107,
from /home/berrange/src/virt/qemu/linux-user/syscall.c:20:
/usr/include/bits/unistd_ext.h:34:16: note: previous declaration of ‘gettid’ was here
34 | extern __pid_t gettid (void) __THROW;
| ^~~~~~
CC aarch64-linux-user/linux-user/signal.o
make[1]: *** [/home/berrange/src/virt/qemu/rules.mak:69: linux-user/syscall.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:449: subdir-aarch64-linux-user] Error 2
While we could make our definition conditional and rely on glibc's impl,
this patch simply renames our definition to sys_gettid() which is a
common pattern in this file.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20190320161842.13908-3-berrange@redhat.com>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---
linux-user/syscall.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 280137da8c..5145816e9f 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -250,7 +250,8 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
#endif
#ifdef __NR_gettid
-_syscall0(int, gettid)
+#define __NR_sys_gettid __NR_gettid
+_syscall0(int, sys_gettid)
#else
/* This is a replacement for the host gettid() and must return a host
errno. */
@@ -5384,7 +5385,7 @@ static void *clone_func(void *arg)
cpu = ENV_GET_CPU(env);
thread_cpu = cpu;
ts = (TaskState *)cpu->opaque;
- info->tid = gettid();
+ info->tid = sys_gettid();
task_settid(ts);
if (info->child_tidptr)
put_user_u32(info->tid, info->child_tidptr);
@@ -5529,9 +5530,9 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
mapping. We can't repeat the spinlock hack used above because
the child process gets its own copy of the lock. */
if (flags & CLONE_CHILD_SETTID)
- put_user_u32(gettid(), child_tidptr);
+ put_user_u32(sys_gettid(), child_tidptr);
if (flags & CLONE_PARENT_SETTID)
- put_user_u32(gettid(), parent_tidptr);
+ put_user_u32(sys_gettid(), parent_tidptr);
ts = (TaskState *)cpu->opaque;
if (flags & CLONE_SETTLS)
cpu_set_tls (env, newtls);
@@ -10515,7 +10516,7 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
return TARGET_PAGE_SIZE;
#endif
case TARGET_NR_gettid:
- return get_errno(gettid());
+ return get_errno(sys_gettid());
#ifdef TARGET_NR_readahead
case TARGET_NR_readahead:
#if TARGET_ABI_BITS == 32
--
2.21.0
From e1bf254f60d78d6a4e7b0664d344b6bfcb70f2ae Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 1 Feb 2019 14:35:39 +0100
Subject: [PATCH] spice-widget: Ungrab mouse on leave event on Wayland
The Spice Gtk widget relies on pointer grabs to receive all pointer
events even after the pointer has left the window.
While that works on X11, on Wayland there is no active pointer grab,
so once the pointer has left the SPICE widget on Wayland, the events
are routed to the window with the pointer focus instead of ours.
To avoid the problem, on Wayland, we simply ungrab the pointer once it
leaves the window.
Thanks-to: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
https://gitlab.freedesktop.org/spice/spice-gtk/issues/83
Acked-by: Victor Toso <victortoso@redhat.com>
---
src/spice-widget.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/spice-widget.c b/src/spice-widget.c
index fd0c935..d924731 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -1854,8 +1854,21 @@ static gboolean leave_event(GtkWidget *widget, GdkEventCrossing *crossing G_GNUC
DISPLAY_DEBUG(display, "%s", __FUNCTION__);
- if (d->mouse_grab_active)
+ if (d->mouse_grab_active) {
+#ifdef GDK_WINDOWING_WAYLAND
+ /* On Wayland, there is no active pointer grab, so once the pointer
+ * has left the window, the events are routed to the window with
+ * pointer focus instead of ours, in which case we should just
+ * ungrab to avoid nasty side effects. */
+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
+ GdkWindow *window = gtk_widget_get_window(widget);
+
+ if (window == crossing->window)
+ try_mouse_ungrab(display);
+ }
+#endif
return true;
+ }
d->mouse_have_pointer = false;
spice_gtk_session_set_mouse_has_pointer(d->gtk_session, false);
--
2.20.1
From ae3a8e1b2d952385646046e33f12d8540407f0a5 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed, 6 Feb 2019 15:42:53 +0100
Subject: [PATCH] spice-widget: Use GdkSeat API on Wayland
Using different GDK APIs to grab and ungrab devices leads to
undetermined behavior and can cause the cursor to remain hidden on
ungrab on Wayland because GDK Wayland backend keeps a reference of
the GdkSeat cursor.
On Wayland, use the GdkSeat API only even for ungrab, by ungrabbing the
seat and immediately re-grabbing the remaining keyboard or pointer if
the grab is to be retained.
Thanks-to: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Fixes: https://gitlab.freedesktop.org/spice/spice-gtk/issues/83
See-also: https://gitlab.gnome.org/GNOME/gtk/issues/787
Acked-by: Victor Toso <victortoso@redhat.com>
---
src/spice-widget.c | 82 +++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 78 insertions(+), 4 deletions(-)
diff --git a/src/spice-widget.c b/src/spice-widget.c
index 8adcc38..fd0c935 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -32,6 +32,9 @@
#include <va/va_x11.h>
#endif
#endif
+#ifdef GDK_WINDOWING_WAYLAND
+#include <gdk/gdkwayland.h>
+#endif
#ifdef G_OS_WIN32
#include <windows.h>
#include <dinput.h>
@@ -887,12 +890,46 @@ static void try_keyboard_grab(SpiceDisplay *display)
}
}
-static void ungrab_keyboard(G_GNUC_UNUSED SpiceDisplay *display)
+static void ungrab_keyboard(SpiceDisplay *display)
{
+ GdkSeat *seat = spice_display_get_default_seat(display);
+ GdkDevice *keyboard = gdk_seat_get_keyboard(seat);
+
+#ifdef GDK_WINDOWING_WAYLAND
+ /* On Wayland, use the GdkSeat API alone.
+ * We simply issue a gdk_seat_ungrab() followed immediately by another
+ * gdk_seat_grab() on the pointer if the pointer grab is to be kept.
+ */
+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
+ SpiceDisplayPrivate *d = display->priv;
+
+ gdk_seat_ungrab(seat);
+
+ if (d->mouse_grab_active) {
+ GdkGrabStatus status;
+ GdkCursor *blank = spice_display_get_blank_cursor(display);
+
+ status = gdk_seat_grab(seat,
+ gtk_widget_get_window(GTK_WIDGET(display)),
+ GDK_SEAT_CAPABILITY_ALL_POINTING,
+ TRUE,
+ blank,
+ NULL,
+ NULL,
+ NULL);
+ if (status != GDK_GRAB_SUCCESS) {
+ g_warning("pointer grab failed %u", status);
+ d->mouse_grab_active = false;
+ }
+ }
+
+ return;
+ }
+#endif
+
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
/* we want to ungrab just the keyboard - it is not possible using gdk_seat_ungrab().
See also https://bugzilla.gnome.org/show_bug.cgi?id=780133 */
- GdkDevice *keyboard = gdk_seat_get_keyboard(spice_display_get_default_seat(display));
gdk_device_ungrab(keyboard, GDK_CURRENT_TIME);
G_GNUC_END_IGNORE_DEPRECATIONS
}
@@ -1148,12 +1185,49 @@ static void mouse_wrap(SpiceDisplay *display, GdkEventMotion *motion)
}
-static void ungrab_pointer(G_GNUC_UNUSED SpiceDisplay *display)
+static void ungrab_pointer(SpiceDisplay *display)
{
+ GdkSeat *seat = spice_display_get_default_seat(display);
+ GdkDevice *pointer = gdk_seat_get_pointer(seat);
+
+#ifdef GDK_WINDOWING_WAYLAND
+ /* On Wayland, mixing the GdkSeat and the GdkDevice APIs leave the
+ * cursor unchanged because the GDK Wayland backend keeps a reference
+ * of the cursor set previously using gdk_seat_grab() attached to the
+ * GdkSeat.
+ * To avoid that issue, we simply issue a gdk_seat_ungrab() followed
+ * immediately by another gdk_seat_grab() on the keyboard if the
+ * keyboard grab is to be kept.
+ */
+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
+ SpiceDisplayPrivate *d = display->priv;
+
+ gdk_seat_ungrab(seat);
+
+ if (d->keyboard_grab_active) {
+ GdkGrabStatus status;
+
+ status = gdk_seat_grab(seat,
+ gtk_widget_get_window(GTK_WIDGET(display)),
+ GDK_SEAT_CAPABILITY_KEYBOARD,
+ FALSE,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ if (status != GDK_GRAB_SUCCESS) {
+ g_warning("keyboard grab failed %u", status);
+ d->keyboard_grab_active = false;
+ }
+ }
+
+ return;
+ }
+#endif
+
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
/* we want to ungrab just the pointer - it is not possible using gdk_seat_ungrab().
See also https://bugzilla.gnome.org/show_bug.cgi?id=780133 */
- GdkDevice *pointer = gdk_seat_get_pointer(spice_display_get_default_seat(display));
gdk_device_ungrab(pointer, GDK_CURRENT_TIME);
G_GNUC_END_IGNORE_DEPRECATIONS
}
--
2.20.1
From dff435479c61b08be58a70ac00ea86f8d2235dd2 Mon Sep 17 00:00:00 2001
From: Alexander Kanavin <alex.kanavin@gmail.com>
Date: Tue, 12 Feb 2019 12:04:52 +0100
Subject: [PATCH] Makefile.am: explicitly link with libdrm
Otherwise, a failure happens with gold linker:
../src/.libs/libvirglrenderer.so: error: undefined reference to 'drmPrimeHandleToFD'
https://errors.yoctoproject.org/Errors/Details/222046/
Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
---
src/Makefile.am | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Makefile.am b/src/Makefile.am
index 9a0a44e..9b668c8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,6 @@
SUBDIRS := gallium/auxiliary
AM_LDFLAGS = -lm \
+ $(LIBDRM_LIBS) \
$(GBM_LIBS) \
$(EPOXY_LIBS) \
$(X11_LIBS) \
--
2.21.0
From 9b91cc380fdd5bf993f64a9cd452dbc4c98872fa Mon Sep 17 00:00:00 2001
From: Dave Airlie <airlied@redhat.com>
Date: Wed, 19 Sep 2018 10:36:17 +1000
Subject: [PATCH] update u_format_parse from mesa to handle python3
---
src/gallium/auxiliary/util/u_format_parse.py | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_format_parse.py b/src/gallium/auxiliary/util/u_format_parse.py
index 929017a..48cc012 100755
--- a/src/gallium/auxiliary/util/u_format_parse.py
+++ b/src/gallium/auxiliary/util/u_format_parse.py
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
'''
/**************************************************************************
@@ -30,6 +29,9 @@
'''
+from __future__ import division
+
+
VOID, UNSIGNED, SIGNED, FIXED, FLOAT = range(5)
SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W, SWIZZLE_0, SWIZZLE_1, SWIZZLE_NONE, = range(7)
@@ -70,14 +72,20 @@ def __str__(self):
return s
def __eq__(self, other):
+ if other is None:
+ return False
+
return self.type == other.type and self.norm == other.norm and self.pure == other.pure and self.size == other.size
+ def __ne__(self, other):
+ return not self == other
+
def max(self):
'''Maximum representable number.'''
if self.type == FLOAT:
return VERY_LARGE
if self.type == FIXED:
- return (1 << (self.size/2)) - 1
+ return (1 << (self.size // 2)) - 1
if self.norm:
return 1
if self.type == UNSIGNED:
@@ -91,7 +99,7 @@ def min(self):
if self.type == FLOAT:
return -VERY_LARGE
if self.type == FIXED:
- return -(1 << (self.size/2))
+ return -(1 << (self.size // 2))
if self.type == UNSIGNED:
return 0
if self.norm:
@@ -313,7 +321,7 @@ def _parse_channels(fields, layout, colorspace, swizzles):
return channels
def parse(filename):
- '''Parse the format descrition in CSV format in terms of the
+ '''Parse the format description in CSV format in terms of the
Channel and Format classes above.'''
stream = open(filename)
......@@ -47,5 +47,6 @@
<file preprocess="xml-stripblanks">ui/wizard-toolbar.ui</file>
<file preprocess="xml-stripblanks">ui/wizard-web-view.ui</file>
<file preprocess="xml-stripblanks">ui/wizard-window.ui</file>
<file preprocess="xml-stripblanks">ui/assistant/remote-connection.ui</file>
</gresource>
</gresources>
......@@ -111,3 +111,8 @@
animation-duration: 150ms;
animation-iteration-count: 1;
}
.overlay-box {
padding: 25px;
border-radius: 5px;
}
......@@ -81,7 +81,7 @@ if appstream_util.found()
test(
'validate-appdata', appstream_util,
args: [
'validate-relax', appdata_file.full_path()
'validate-relax', '--nonet', appdata_file.full_path()
]
)
endif
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2019 Red Hat, Inc -->
<component type="desktop">
<id>org.gnome.Boxes</id>
<id>org.gnome.Boxes.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>LGPL-2.1+</project_license>
<name>GNOME Boxes</name>
......@@ -21,22 +22,39 @@
</p>
</description>
<screenshots>
<screenshot height="485" width="800" type="default">
<image>http://people.gnome.org/~zeeshanak/screenshots/gnome-boxes-wizard-menu.png</image>
<screenshot height="1600" width="900" type="default">
<image>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/screenshots/01-icon-view.png</image>
</screenshot>
<screenshot height="485" width="800">
<image>http://people.gnome.org/~zeeshanak/screenshots/gnome-boxes-wizard-setup.png</image>
<screenshot height="1600" width="900">
<image>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/screenshots/02-download-an-os.png</image>
</screenshot>
<screenshot height="485" width="800">
<image>http://people.gnome.org/~zeeshanak/screenshots/gnome-boxes-winxp-display.png</image>
<screenshot height="1600" width="900">
<image>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/screenshots/03-windows-vm.png</image>
</screenshot>
<screenshot height="485" width="800">
<image>http://people.gnome.org/~zeeshanak/screenshots/gnome-boxes-collection.png</image>
<screenshot height="1600" width="900">
<image>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/screenshots/04-express-install.png</image>
</screenshot>
<screenshot height="485" width="800">
<image>http://people.gnome.org/~zeeshanak/screenshots/gnome-boxes-selection.png</image>
<screenshot height="1600" width="900">
<image>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/screenshots/05-shared-folders.png</image>
</screenshot>
</screenshots>
<releases>
<release version="3.34.0" date="2019-09-09">
<description>
<p>Boxes 3.34 is the latest stable version of GNOME Boxes, and it
contains all the features introduced since our 3.32 release.
</p>
<ul>
<li>Add 3D Acceleration option to the VM's Properties</li>
<li>Introduce the "Remote Connections" assistant</li>
<li>Various improvements in express installations of Windows guests</li>
<li>Allow to boot existing VMs from CDROM</li>
<li>Offer a free download of Red Hat Enterprise Linux 8</li>
<li>Updated translations</li>
</ul>
</description>>
</release>
</releases>
<kudos>
<kudo>AppMenu</kudo>
<kudo>HiDpiIcon</kudo>
......
<libosinfo version="0.0.1">
<!-- Please read README.logos for any questions about usage of product logos in Boxes. !-->
<os id="http://centos.org/centos/6.0">
<logo>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/logos/centos.svg</logo>
</os>
</libosinfo>
<libosinfo version="0.0.1">
<!-- Please read README.logos for any questions about usage of product logos in Boxes. !-->
<os id="http://centos.org/centos/7.0">
<logo>https://gitlab.gnome.org/GNOME/gnome-boxes-logos/raw/master/logos/centos.svg</logo>