diff --git a/.gitignore b/.gitignore
index f2ae9b2..d71c898 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/mutter-3.28.3.tar.xz
+SOURCES/mutter-3.32.2.tar.xz
diff --git a/.mutter.metadata b/.mutter.metadata
index 6b4e4ce..9e3c1a4 100644
--- a/.mutter.metadata
+++ b/.mutter.metadata
@@ -1 +1 @@
-a7a01f50c75dc6c1e0fe708656cfce1546624568 SOURCES/mutter-3.28.3.tar.xz
+5068f43514a6212e4b5b5f7f856b7713cbc3d420 SOURCES/mutter-3.32.2.tar.xz
diff --git a/SOURCES/0001-Add-remote-access-controller-API.patch b/SOURCES/0001-Add-remote-access-controller-API.patch
deleted file mode 100644
index b182a20..0000000
--- a/SOURCES/0001-Add-remote-access-controller-API.patch
+++ /dev/null
@@ -1,672 +0,0 @@
-From 9fb08133fd89bb09dc6d4f202d9b76d43b42905e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 20 Jul 2018 16:37:37 +0200
-Subject: [PATCH] Add remote access controller API
-
-Add API to let GNOME Shell have the ability to get notified about remote
-access sessions (remote desktop, remote control and screen cast), and
-with a way to close them.
-
-This is done by adding an abstraction above the remote desktop and
-screen cast session objects, to avoid exposing their objects to outside
-of mutter. Doing that would result in external parts holding references
-to the objects, complicating their lifetimes. By using separate wrapper
-objects, we avoid this issue all together.
----
- src/Makefile.am                               |   4 +
- src/backends/meta-backend.c                   |  23 ++++
- .../meta-remote-access-controller-private.h   |  31 +++++
- src/backends/meta-remote-access-controller.c  | 130 ++++++++++++++++++
- src/backends/meta-remote-desktop-session.c    |  80 +++++++++++
- src/backends/meta-remote-desktop-session.h    |   6 +
- src/backends/meta-screen-cast-session.c       |  80 +++++++++++
- src/backends/meta-screen-cast-session.h       |   7 +
- src/meta/meta-backend.h                       |   3 +
- src/meta/meta-remote-access-controller.h      |  47 +++++++
- 10 files changed, 411 insertions(+)
- create mode 100644 src/backends/meta-remote-access-controller-private.h
- create mode 100644 src/backends/meta-remote-access-controller.c
- create mode 100644 src/meta/meta-remote-access-controller.h
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 5bbac70e8d..aaf7c9c80d 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -161,6 +161,9 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\
- 	backends/meta-renderer.h		\
- 	backends/meta-renderer-view.c		\
- 	backends/meta-renderer-view.h		\
-+	backends/meta-remote-access-controller.c	\
-+	backends/meta-remote-access-controller-private.h	\
-+	meta/meta-remote-access-controller.h	\
- 	backends/edid-parse.c			\
- 	backends/edid.h				\
- 	backends/gsm-inhibitor-flag.h		\
-@@ -546,6 +549,7 @@ libmutterinclude_headers =			\
- 	meta/meta-idle-monitor.h		\
- 	meta/meta-plugin.h			\
- 	meta/meta-monitor-manager.h		\
-+	meta/meta-remote-access-controller.h	\
- 	meta/meta-settings.h			\
- 	meta/meta-shaped-texture.h		\
- 	meta/meta-shadow-factory.h		\
-diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
-index 9348aa1bbd..888e51cd98 100644
---- a/src/backends/meta-backend.c
-+++ b/src/backends/meta-backend.c
-@@ -39,6 +39,7 @@
- #ifdef HAVE_REMOTE_DESKTOP
- #include "backends/meta-dbus-session-watcher.h"
- #include "backends/meta-screen-cast.h"
-+#include "backends/meta-remote-access-controller-private.h"
- #include "backends/meta-remote-desktop.h"
- #endif
- 
-@@ -92,6 +93,7 @@ struct _MetaBackendPrivate
-   MetaEgl *egl;
-   MetaSettings *settings;
- #ifdef HAVE_REMOTE_DESKTOP
-+  MetaRemoteAccessController *remote_access_controller;
-   MetaDbusSessionWatcher *dbus_session_watcher;
-   MetaScreenCast *screen_cast;
-   MetaRemoteDesktop *remote_desktop;
-@@ -139,6 +141,7 @@ meta_backend_finalize (GObject *object)
-   g_clear_object (&priv->remote_desktop);
-   g_clear_object (&priv->screen_cast);
-   g_clear_object (&priv->dbus_session_watcher);
-+  g_clear_object (&priv->remote_access_controller);
- #endif
- 
-   g_object_unref (priv->up_client);
-@@ -450,6 +453,8 @@ meta_backend_real_post_init (MetaBackend *backend)
-   priv->input_settings = meta_backend_create_input_settings (backend);
- 
- #ifdef HAVE_REMOTE_DESKTOP
-+  priv->remote_access_controller =
-+    g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL);
-   priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL);
-   priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
-   priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
-@@ -777,6 +782,24 @@ meta_backend_get_remote_desktop (MetaBackend *backend)
- }
- #endif /* HAVE_REMOTE_DESKTOP */
- 
-+/**
-+ * meta_backend_get_remote_access_controller:
-+ * @backend: A #MetaBackend
-+ *
-+ * Return Value: (transfer none): The #MetaRemoteAccessController
-+ */
-+MetaRemoteAccessController *
-+meta_backend_get_remote_access_controller (MetaBackend *backend)
-+{
-+#ifdef HAVE_REMOTE_DESKTOP
-+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-+
-+  return priv->remote_access_controller;
-+#else
-+  return NULL;
-+#endif
-+}
-+
- /**
-  * meta_backend_grab_device: (skip)
-  */
-diff --git a/src/backends/meta-remote-access-controller-private.h b/src/backends/meta-remote-access-controller-private.h
-new file mode 100644
-index 0000000000..fce2082bfc
---- /dev/null
-+++ b/src/backends/meta-remote-access-controller-private.h
-@@ -0,0 +1,31 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef META_REMOTE_ACCESS_CONTROLLER_PRIVATE_H
-+#define META_REMOTE_ACCESS_CONTROLLER_PRIVATE_H
-+
-+#include "meta/meta-remote-access-controller.h"
-+
-+void meta_remote_access_controller_notify_new_handle (MetaRemoteAccessController *controller,
-+                                                      MetaRemoteAccessHandle     *handle);
-+
-+void meta_remote_access_handle_notify_stopped (MetaRemoteAccessHandle *handle);
-+
-+#endif /* META_REMOTE_ACCESS_CONTROLLER_PRIVATE_H */
-diff --git a/src/backends/meta-remote-access-controller.c b/src/backends/meta-remote-access-controller.c
-new file mode 100644
-index 0000000000..0e0ebe2bd8
---- /dev/null
-+++ b/src/backends/meta-remote-access-controller.c
-@@ -0,0 +1,130 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/meta-remote-access-controller-private.h"
-+
-+enum
-+{
-+  HANDLE_STOPPED,
-+
-+  N_HANDLE_SIGNALS
-+};
-+
-+static int handle_signals[N_HANDLE_SIGNALS];
-+
-+enum
-+{
-+  CONTROLLER_NEW_HANDLE,
-+
-+  N_CONTROLLER_SIGNALS
-+};
-+
-+static int controller_signals[N_CONTROLLER_SIGNALS];
-+
-+typedef struct _MetaRemoteAccessHandlePrivate
-+{
-+  gboolean has_stopped;
-+} MetaRemoteAccessHandlePrivate;
-+
-+G_DEFINE_TYPE_WITH_PRIVATE (MetaRemoteAccessHandle,
-+                            meta_remote_access_handle,
-+                            G_TYPE_OBJECT)
-+
-+struct _MetaRemoteAccessController
-+{
-+  GObject parent;
-+};
-+
-+G_DEFINE_TYPE (MetaRemoteAccessController,
-+               meta_remote_access_controller,
-+               G_TYPE_OBJECT)
-+
-+/**
-+ * meta_remote_access_handle_stop:
-+ * @handle: A #MetaRemoteAccessHandle
-+ *
-+ * Stop the associated remote access session.
-+ */
-+void
-+meta_remote_access_handle_stop (MetaRemoteAccessHandle *handle)
-+{
-+  MetaRemoteAccessHandlePrivate *priv =
-+    meta_remote_access_handle_get_instance_private (handle);
-+
-+  if (priv->has_stopped)
-+    return;
-+
-+  META_REMOTE_ACCESS_HANDLE_GET_CLASS (handle)->stop (handle);
-+}
-+
-+void
-+meta_remote_access_handle_notify_stopped (MetaRemoteAccessHandle *handle)
-+{
-+  MetaRemoteAccessHandlePrivate *priv =
-+    meta_remote_access_handle_get_instance_private (handle);
-+
-+  priv->has_stopped = TRUE;
-+  g_signal_emit (handle, handle_signals[HANDLE_STOPPED], 0);
-+}
-+
-+void
-+meta_remote_access_controller_notify_new_handle (MetaRemoteAccessController *controller,
-+                                                 MetaRemoteAccessHandle     *handle)
-+{
-+  g_signal_emit (controller, controller_signals[CONTROLLER_NEW_HANDLE], 0,
-+                 handle);
-+}
-+
-+static void
-+meta_remote_access_handle_init (MetaRemoteAccessHandle *handle)
-+{
-+}
-+
-+static void
-+meta_remote_access_handle_class_init (MetaRemoteAccessHandleClass *klass)
-+{
-+  handle_signals[HANDLE_STOPPED] =
-+    g_signal_new ("stopped",
-+                  G_TYPE_FROM_CLASS (klass),
-+                  G_SIGNAL_RUN_LAST,
-+                  0,
-+                  NULL, NULL, NULL,
-+                  G_TYPE_NONE, 0);
-+}
-+
-+static void
-+meta_remote_access_controller_init (MetaRemoteAccessController *controller)
-+{
-+}
-+
-+static void
-+meta_remote_access_controller_class_init (MetaRemoteAccessControllerClass *klass)
-+{
-+  controller_signals[CONTROLLER_NEW_HANDLE] =
-+    g_signal_new ("new-handle",
-+                  G_TYPE_FROM_CLASS (klass),
-+                  G_SIGNAL_RUN_LAST,
-+                  0,
-+                  NULL, NULL, NULL,
-+                  G_TYPE_NONE, 1,
-+                  META_TYPE_REMOTE_ACCESS_HANDLE);
-+}
-diff --git a/src/backends/meta-remote-desktop-session.c b/src/backends/meta-remote-desktop-session.c
-index 821b16724f..73bcf663be 100644
---- a/src/backends/meta-remote-desktop-session.c
-+++ b/src/backends/meta-remote-desktop-session.c
-@@ -30,6 +30,7 @@
- 
- #include "backends/meta-dbus-session-watcher.h"
- #include "backends/meta-screen-cast-session.h"
-+#include "backends/meta-remote-access-controller-private.h"
- #include "backends/native/meta-backend-native.h"
- #include "backends/x11/meta-backend-x11.h"
- #include "cogl/cogl.h"
-@@ -59,6 +60,8 @@ struct _MetaRemoteDesktopSession
-   ClutterVirtualInputDevice *virtual_pointer;
-   ClutterVirtualInputDevice *virtual_keyboard;
-   ClutterVirtualInputDevice *virtual_touchscreen;
-+
-+  MetaRemoteDesktopSessionHandle *handle;
- };
- 
- static void
-@@ -75,12 +78,41 @@ G_DEFINE_TYPE_WITH_CODE (MetaRemoteDesktopSession,
-                          G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION,
-                                                 meta_dbus_session_init_iface))
- 
-+struct _MetaRemoteDesktopSessionHandle
-+{
-+  MetaRemoteAccessHandle parent;
-+
-+  MetaRemoteDesktopSession *session;
-+};
-+
-+G_DEFINE_TYPE (MetaRemoteDesktopSessionHandle,
-+               meta_remote_desktop_session_handle,
-+               META_TYPE_REMOTE_ACCESS_HANDLE)
-+
-+static MetaRemoteDesktopSessionHandle *
-+meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession *session);
-+
- static gboolean
- meta_remote_desktop_session_is_running (MetaRemoteDesktopSession *session)
- {
-   return !!session->virtual_pointer;
- }
- 
-+static void
-+init_remote_access_handle (MetaRemoteDesktopSession *session)
-+{
-+  MetaBackend *backend = meta_get_backend ();
-+  MetaRemoteAccessController *remote_access_controller;
-+  MetaRemoteAccessHandle *remote_access_handle;
-+
-+  session->handle = meta_remote_desktop_session_handle_new (session);
-+
-+  remote_access_controller = meta_backend_get_remote_access_controller (backend);
-+  remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle);
-+  meta_remote_access_controller_notify_new_handle (remote_access_controller,
-+                                                   remote_access_handle);
-+}
-+
- static gboolean
- meta_remote_desktop_session_start (MetaRemoteDesktopSession *session,
-                                    GError                  **error)
-@@ -107,6 +139,8 @@ meta_remote_desktop_session_start (MetaRemoteDesktopSession *session,
-     clutter_device_manager_create_virtual_device (device_manager,
-                                                   CLUTTER_TOUCHSCREEN_DEVICE);
- 
-+  init_remote_access_handle (session);
-+
-   return TRUE;
- }
- 
-@@ -131,6 +165,14 @@ meta_remote_desktop_session_close (MetaRemoteDesktopSession *session)
-   meta_dbus_remote_desktop_session_emit_closed (skeleton);
-   g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (session));
- 
-+  if (session->handle)
-+    {
-+      MetaRemoteAccessHandle *remote_access_handle =
-+        META_REMOTE_ACCESS_HANDLE (session->handle);
-+
-+      meta_remote_access_handle_notify_stopped (remote_access_handle);
-+    }
-+
-   g_object_unref (session);
- }
- 
-@@ -729,6 +771,7 @@ meta_remote_desktop_session_finalize (GObject *object)
- 
-   g_assert (!meta_remote_desktop_session_is_running (session));
- 
-+  g_clear_object (&session->handle);
-   g_free (session->peer_name);
-   g_free (session->session_id);
-   g_free (session->object_path);
-@@ -763,3 +806,40 @@ meta_remote_desktop_session_class_init (MetaRemoteDesktopSessionClass *klass)
- 
-   object_class->finalize = meta_remote_desktop_session_finalize;
- }
-+
-+static MetaRemoteDesktopSessionHandle *
-+meta_remote_desktop_session_handle_new (MetaRemoteDesktopSession *session)
-+{
-+  MetaRemoteDesktopSessionHandle *handle;
-+
-+  handle = g_object_new (META_TYPE_REMOTE_DESKTOP_SESSION_HANDLE, NULL);
-+  handle->session = session;
-+
-+  return handle;
-+}
-+
-+static void
-+meta_remote_desktop_session_handle_stop (MetaRemoteAccessHandle *handle)
-+{
-+  MetaRemoteDesktopSession *session;
-+
-+  session = META_REMOTE_DESKTOP_SESSION_HANDLE (handle)->session;
-+  if (!session)
-+    return;
-+
-+  meta_remote_desktop_session_close (session);
-+}
-+
-+static void
-+meta_remote_desktop_session_handle_init (MetaRemoteDesktopSessionHandle *handle)
-+{
-+}
-+
-+static void
-+meta_remote_desktop_session_handle_class_init (MetaRemoteDesktopSessionHandleClass *klass)
-+{
-+  MetaRemoteAccessHandleClass *remote_access_handle_class =
-+    META_REMOTE_ACCESS_HANDLE_CLASS (klass);
-+
-+  remote_access_handle_class->stop = meta_remote_desktop_session_handle_stop;
-+}
-diff --git a/src/backends/meta-remote-desktop-session.h b/src/backends/meta-remote-desktop-session.h
-index 54dce41190..1edb3739b1 100644
---- a/src/backends/meta-remote-desktop-session.h
-+++ b/src/backends/meta-remote-desktop-session.h
-@@ -33,6 +33,12 @@ G_DECLARE_FINAL_TYPE (MetaRemoteDesktopSession, meta_remote_desktop_session,
-                       META, REMOTE_DESKTOP_SESSION,
-                       MetaDBusRemoteDesktopSessionSkeleton)
- 
-+#define META_TYPE_REMOTE_DESKTOP_SESSION_HANDLE (meta_remote_desktop_session_handle_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaRemoteDesktopSessionHandle,
-+                      meta_remote_desktop_session_handle,
-+                      META, REMOTE_DESKTOP_SESSION_HANDLE,
-+                      MetaRemoteAccessHandle)
-+
- char * meta_remote_desktop_session_get_object_path (MetaRemoteDesktopSession *session);
- 
- char * meta_remote_desktop_session_get_session_id (MetaRemoteDesktopSession *session);
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index b95ce514dc..e1b6393e8f 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -28,6 +28,7 @@
- #include "backends/meta-dbus-session-watcher.h"
- #include "backends/meta-screen-cast-monitor-stream.h"
- #include "backends/meta-screen-cast-stream.h"
-+#include "backends/meta-remote-access-controller-private.h"
- 
- #define META_SCREEN_CAST_SESSION_DBUS_PATH "/org/gnome/Mutter/ScreenCast/Session"
- 
-@@ -41,6 +42,8 @@ struct _MetaScreenCastSession
-   char *object_path;
- 
-   GList *streams;
-+
-+  MetaScreenCastSessionHandle *handle;
- };
- 
- static void
-@@ -57,6 +60,35 @@ G_DEFINE_TYPE_WITH_CODE (MetaScreenCastSession,
-                          G_IMPLEMENT_INTERFACE (META_TYPE_DBUS_SESSION,
-                                                 meta_dbus_session_init_iface))
- 
-+struct _MetaScreenCastSessionHandle
-+{
-+  MetaRemoteAccessHandle parent;
-+
-+  MetaScreenCastSession *session;
-+};
-+
-+G_DEFINE_TYPE (MetaScreenCastSessionHandle,
-+               meta_screen_cast_session_handle,
-+               META_TYPE_REMOTE_ACCESS_HANDLE)
-+
-+static MetaScreenCastSessionHandle *
-+meta_screen_cast_session_handle_new (MetaScreenCastSession *session);
-+
-+static void
-+init_remote_access_handle (MetaScreenCastSession *session)
-+{
-+  MetaBackend *backend = meta_get_backend ();
-+  MetaRemoteAccessController *remote_access_controller;
-+  MetaRemoteAccessHandle *remote_access_handle;
-+
-+  session->handle = meta_screen_cast_session_handle_new (session);
-+
-+  remote_access_controller = meta_backend_get_remote_access_controller (backend);
-+  remote_access_handle = META_REMOTE_ACCESS_HANDLE (session->handle);
-+  meta_remote_access_controller_notify_new_handle (remote_access_controller,
-+                                                   remote_access_handle);
-+}
-+
- gboolean
- meta_screen_cast_session_start (MetaScreenCastSession  *session,
-                                 GError                **error)
-@@ -71,6 +103,8 @@ meta_screen_cast_session_start (MetaScreenCastSession  *session,
-         return FALSE;
-     }
- 
-+  init_remote_access_handle (session);
-+
-   return TRUE;
- }
- 
-@@ -94,6 +128,14 @@ meta_screen_cast_session_close (MetaScreenCastSession *session)
- 
-   g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (session));
- 
-+  if (session->handle)
-+    {
-+      MetaRemoteAccessHandle *remote_access_handle =
-+        META_REMOTE_ACCESS_HANDLE (session->handle);
-+
-+      meta_remote_access_handle_notify_stopped (remote_access_handle);
-+    }
-+
-   g_object_unref (session);
- }
- 
-@@ -361,6 +403,7 @@ meta_screen_cast_session_finalize (GObject *object)
- {
-   MetaScreenCastSession *session = META_SCREEN_CAST_SESSION (object);
- 
-+  g_clear_object (&session->handle);
-   g_free (session->peer_name);
-   g_free (session->object_path);
- 
-@@ -379,3 +422,40 @@ meta_screen_cast_session_class_init (MetaScreenCastSessionClass *klass)
- 
-   object_class->finalize = meta_screen_cast_session_finalize;
- }
-+
-+static MetaScreenCastSessionHandle *
-+meta_screen_cast_session_handle_new (MetaScreenCastSession *session)
-+{
-+  MetaScreenCastSessionHandle *handle;
-+
-+  handle = g_object_new (META_TYPE_SCREEN_CAST_SESSION_HANDLE, NULL);
-+  handle->session = session;
-+
-+  return handle;
-+}
-+
-+static void
-+meta_screen_cast_session_handle_stop (MetaRemoteAccessHandle *handle)
-+{
-+  MetaScreenCastSession *session;
-+
-+  session = META_SCREEN_CAST_SESSION_HANDLE (handle)->session;
-+  if (!session)
-+    return;
-+
-+  meta_screen_cast_session_close (session);
-+}
-+
-+static void
-+meta_screen_cast_session_handle_init (MetaScreenCastSessionHandle *handle)
-+{
-+}
-+
-+static void
-+meta_screen_cast_session_handle_class_init (MetaScreenCastSessionHandleClass *klass)
-+{
-+  MetaRemoteAccessHandleClass *remote_access_handle_class =
-+    META_REMOTE_ACCESS_HANDLE_CLASS (klass);
-+
-+  remote_access_handle_class->stop = meta_screen_cast_session_handle_stop;
-+}
-diff --git a/src/backends/meta-screen-cast-session.h b/src/backends/meta-screen-cast-session.h
-index c877912cf9..ac0a31a165 100644
---- a/src/backends/meta-screen-cast-session.h
-+++ b/src/backends/meta-screen-cast-session.h
-@@ -26,6 +26,7 @@
- #include "backends/meta-screen-cast.h"
- 
- #include "backends/meta-screen-cast-stream.h"
-+#include "meta/meta-remote-access-controller.h"
- 
- typedef enum _MetaScreenCastSessionType
- {
-@@ -38,6 +39,12 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastSession, meta_screen_cast_session,
-                       META, SCREEN_CAST_SESSION,
-                       MetaDBusScreenCastSessionSkeleton)
- 
-+#define META_TYPE_SCREEN_CAST_SESSION_HANDLE (meta_screen_cast_session_handle_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaScreenCastSessionHandle,
-+                      meta_screen_cast_session_handle,
-+                      META, SCREEN_CAST_SESSION_HANDLE,
-+                      MetaRemoteAccessHandle)
-+
- char * meta_screen_cast_session_get_object_path (MetaScreenCastSession *session);
- 
- MetaScreenCastSession * meta_screen_cast_session_new (MetaScreenCast             *screen_cast,
-diff --git a/src/meta/meta-backend.h b/src/meta/meta-backend.h
-index 8db2360ccd..0e5947dc12 100644
---- a/src/meta/meta-backend.h
-+++ b/src/meta/meta-backend.h
-@@ -29,6 +29,7 @@
- 
- #include <clutter/clutter.h>
- #include "meta/meta-dnd.h"
-+#include "meta/meta-remote-access-controller.h"
- 
- typedef struct _MetaBackend        MetaBackend;
- typedef struct _MetaBackendClass   MetaBackendClass;
-@@ -54,6 +55,8 @@ MetaDnd      *meta_backend_get_dnd   (MetaBackend *backend);
- 
- MetaSettings *meta_backend_get_settings (MetaBackend *backend);
- 
-+MetaRemoteAccessController * meta_backend_get_remote_access_controller (MetaBackend *backend);
-+
- void meta_clutter_init (void);
- 
- #endif /* META_BACKEND_H */
-diff --git a/src/meta/meta-remote-access-controller.h b/src/meta/meta-remote-access-controller.h
-new file mode 100644
-index 0000000000..1b66f518c7
---- /dev/null
-+++ b/src/meta/meta-remote-access-controller.h
-@@ -0,0 +1,47 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef META_REMOTE_ACCESS_CONTROLLER_H
-+#define META_REMOTE_ACCESS_CONTROLLER_H
-+
-+#include <glib-object.h>
-+
-+#define META_TYPE_REMOTE_ACCESS_HANDLE meta_remote_access_handle_get_type ()
-+G_DECLARE_DERIVABLE_TYPE (MetaRemoteAccessHandle,
-+                          meta_remote_access_handle,
-+                          META, REMOTE_ACCESS_HANDLE,
-+                          GObject)
-+
-+struct _MetaRemoteAccessHandleClass
-+{
-+  GObjectClass parent_class;
-+
-+  void (*stop) (MetaRemoteAccessHandle *handle);
-+};
-+
-+void meta_remote_access_handle_stop (MetaRemoteAccessHandle *handle);
-+
-+#define META_TYPE_REMOTE_ACCESS_CONTROLLER meta_remote_access_controller_get_type ()
-+G_DECLARE_FINAL_TYPE (MetaRemoteAccessController,
-+                      meta_remote_access_controller,
-+                      META, REMOTE_ACCESS_CONTROLLER,
-+                      GObject)
-+
-+#endif /* META_REMOTE_ACCESS_CONTROLLER_H */
--- 
-2.17.1
-
diff --git a/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch b/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch
index 27abe19..8e12a79 100644
--- a/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch
+++ b/SOURCES/0001-Add-support-for-quad-buffer-stereo.patch
@@ -1,4 +1,4 @@
-From 592ed744f97f283be98d494028f7cbd44fdfab6b Mon Sep 17 00:00:00 2001
+From 2b45c3e37da7a590227e965d8a18e89337b791ba Mon Sep 17 00:00:00 2001
 From: "Owen W. Taylor" <otaylor@fishsoup.net>
 Date: Thu, 8 May 2014 18:44:15 -0400
 Subject: [PATCH] Add support for quad-buffer stereo
@@ -18,42 +18,29 @@ in Cogl to setup a stereo context, select which buffer to draw
 to, and draw either the left or right buffer of a stereo
 texture_from_pixmap.
 ---
- src/Makefile.am                              |   2 +
  src/compositor/compositor-private.h          |   9 ++
- src/compositor/compositor.c                  | 128 ++++++++++++++++
+ src/compositor/compositor.c                  | 125 +++++++++++++++
  src/compositor/meta-shaped-texture-private.h |   5 +-
- src/compositor/meta-shaped-texture.c         |  85 +++++++++--
+ src/compositor/meta-shaped-texture.c         |  86 ++++++++++-
  src/compositor/meta-surface-actor-wayland.c  |   2 +-
- src/compositor/meta-surface-actor-x11.c      |  56 ++++++-
+ src/compositor/meta-surface-actor-x11.c      |  54 ++++++-
  src/compositor/meta-surface-actor-x11.h      |   5 +
  src/compositor/meta-window-actor-private.h   |   5 +
  src/compositor/meta-window-actor.c           |  22 +++
  src/core/main.c                              |   4 +
- src/core/stereo.c                            | 153 +++++++++++++++++++
+ src/core/stereo.c                            | 154 +++++++++++++++++++
  src/core/stereo.h                            |  28 ++++
+ src/meson.build                              |   2 +
  src/wayland/meta-wayland-surface.c           |   2 +-
- 14 files changed, 483 insertions(+), 23 deletions(-)
+ 14 files changed, 483 insertions(+), 20 deletions(-)
  create mode 100644 src/core/stereo.c
  create mode 100644 src/core/stereo.h
 
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 8856877d8..26e0e55c2 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -315,6 +315,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\
- 	core/stack.h				\
- 	core/stack-tracker.c			\
- 	core/stack-tracker.h			\
-+	core/stereo.c				\
-+	core/stereo.h				\
- 	core/util.c				\
- 	meta/util.h				\
- 	core/util-private.h			\
 diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
-index 40c0344cc..25cab9280 100644
+index 6ab33416c..f70087512 100644
 --- a/src/compositor/compositor-private.h
 +++ b/src/compositor/compositor-private.h
-@@ -21,6 +21,10 @@ struct _MetaCompositor
+@@ -24,6 +24,10 @@ struct _MetaCompositor
    gint64          server_time_query_time;
    gint64          server_time_offset;
  
@@ -62,34 +49,34 @@ index 40c0344cc..25cab9280 100644
 +  guint           have_stereo_windows : 1;
 +
    guint           server_time_is_monotonic_time : 1;
-   guint           no_mipmaps  : 1;
  
-@@ -61,6 +65,11 @@ void     meta_end_modal_for_plugin   (MetaCompositor   *compositor,
+   ClutterActor          *stage, *window_group, *top_window_group, *feedback_group;
+@@ -63,6 +67,11 @@ void     meta_end_modal_for_plugin   (MetaCompositor   *compositor,
  gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display,
                                                        gint64       monotonic_time);
  
-+gboolean meta_compositor_window_is_stereo     (MetaScreen *screen,
-+                                               Window      xwindow);
-+void     meta_compositor_select_stereo_notify (MetaScreen *screen,
-+                                               Window      xwindow);
++gboolean meta_compositor_window_is_stereo     (MetaDisplay *display,
++                                               Window       xwindow);
++void     meta_compositor_select_stereo_notify (MetaDisplay *display,
++                                               Window       xwindow);
 +
  void meta_compositor_flash_window (MetaCompositor *compositor,
                                     MetaWindow     *window);
  
 diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
-index 8c924d256..e12fb7b58 100644
+index 2a2c8fb3b..6c08c8fe4 100644
 --- a/src/compositor/compositor.c
 +++ b/src/compositor/compositor.c
-@@ -70,6 +70,8 @@
- #include "meta-window-group-private.h"
- #include "window-private.h" /* to check window->hidden */
- #include "display-private.h" /* for meta_display_lookup_x_window() and meta_display_cancel_touch() */
-+#include "stack-tracker.h"
-+#include "stereo.h"
- #include "util-private.h"
- #include "backends/meta-dnd-private.h"
- #include "frame.h"
-@@ -487,6 +489,97 @@ redirect_windows (MetaScreen *screen)
+@@ -69,6 +69,8 @@
+ #include "core/core.h"
+ #include "core/display-private.h"
+ #include "core/frame.h"
++#include "core/stack-tracker.h"
++#include "core/stereo.h"
+ #include "core/util-private.h"
+ #include "core/window-private.h"
+ #include "meta/compositor-mutter.h"
+@@ -514,6 +516,94 @@ redirect_windows (MetaX11Display *x11_display)
      }
  }
  
@@ -109,10 +96,9 @@ index 8c924d256..e12fb7b58 100644
 +} StereoNotifyEvent;
 +
 +static gboolean
-+screen_has_stereo_tree_ext (MetaScreen *screen)
++display_has_stereo_tree_ext (MetaX11Display *x11_display)
 +{
-+  MetaDisplay *display = meta_screen_get_display (screen);
-+  Display     *xdisplay = meta_display_get_xdisplay (display);
++  Display     *xdisplay = x11_display->xdisplay;
 +  const char  *extensions_string;
 +
 +  static const char * (*query_extensions_string) (Display *display,
@@ -124,7 +110,7 @@ index 8c924d256..e12fb7b58 100644
 +      cogl_get_proc_address ("glXQueryExtensionsString");
 +
 +  extensions_string = query_extensions_string (xdisplay,
-+                                               meta_screen_get_screen_number (screen));
++                                               meta_x11_display_get_screen_number (x11_display));
 +
 +  return extensions_string && strstr (extensions_string, "EXT_stereo_tree") != 0;
 +}
@@ -132,12 +118,11 @@ index 8c924d256..e12fb7b58 100644
 +#include <GL/gl.h>
 +
 +gboolean
-+meta_compositor_window_is_stereo (MetaScreen *screen,
-+                                  Window      xwindow)
++meta_compositor_window_is_stereo (MetaDisplay *display,
++                                  Window       xwindow)
 +{
-+  MetaCompositor *compositor = get_compositor_for_screen (screen);
-+  MetaDisplay    *display = meta_screen_get_display (screen);
-+  Display        *xdisplay = meta_display_get_xdisplay (display);
++  MetaCompositor *compositor = get_compositor_for_display (display);
++  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 +
 +  static int (*query_drawable) (Display      *dpy,
 +                                Drawable      draw,
@@ -162,12 +147,11 @@ index 8c924d256..e12fb7b58 100644
 +}
 +
 +void
-+meta_compositor_select_stereo_notify (MetaScreen *screen,
-+                                      Window      xwindow)
++meta_compositor_select_stereo_notify (MetaDisplay *display,
++                                      Window       xwindow)
 +{
-+  MetaCompositor *compositor = get_compositor_for_screen (screen);
-+  MetaDisplay    *display = meta_screen_get_display (screen);
-+  Display        *xdisplay = meta_display_get_xdisplay (display);
++  MetaCompositor *compositor = get_compositor_for_display (display);
++  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 +
 +  static void (*select_event) (Display      *dpy,
 +                               Drawable      draw,
@@ -187,16 +171,16 @@ index 8c924d256..e12fb7b58 100644
  void
  meta_compositor_manage (MetaCompositor *compositor)
  {
-@@ -495,6 +588,8 @@ meta_compositor_manage (MetaCompositor *compositor)
-   MetaScreen *screen = display->screen;
-   MetaBackend *backend = meta_get_backend ();
- 
-+  compositor->stereo_tree_ext = screen_has_stereo_tree_ext (screen);
+@@ -525,6 +615,8 @@ meta_compositor_manage (MetaCompositor *compositor)
+     {
+       xdisplay = display->x11_display->xdisplay;
+       meta_x11_display_set_cm_selection (display->x11_display);
 +
-   meta_screen_set_cm_selection (display->screen);
++      compositor->stereo_tree_ext = display_has_stereo_tree_ext (display->x11_display);
+     }
  
    compositor->stage = meta_backend_get_stage (backend);
-@@ -759,6 +854,23 @@ meta_compositor_process_event (MetaCompositor *compositor,
+@@ -822,6 +914,23 @@ meta_compositor_process_event (MetaCompositor *compositor,
        if (window)
          process_damage (compositor, (XDamageNotifyEvent *) event, window);
      }
@@ -207,20 +191,20 @@ index 8c924d256..e12fb7b58 100644
 +      if (event->xcookie.evtype == GLX_STEREO_NOTIFY_EXT)
 +        {
 +          StereoNotifyEvent *stereo_event = (StereoNotifyEvent *)(event->xcookie.data);
-+          window = meta_display_lookup_x_window (compositor->display, stereo_event->window);
++          window = meta_x11_display_lookup_x_window (x11_display, stereo_event->window);
 +
 +          if (window != NULL)
 +            {
 +              MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
 +              meta_window_actor_stereo_notify (window_actor, stereo_event->stereo_tree);
-+              meta_stack_tracker_queue_sync_stack (window->screen->stack_tracker);
++              meta_stack_tracker_queue_sync_stack (window->display->stack_tracker);
 +            }
 +        }
 +    }
  
    if (compositor->have_x11_sync_object)
      meta_sync_ring_handle_event (event);
-@@ -969,6 +1081,7 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
+@@ -1038,6 +1147,7 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
  			    GList	    *stack)
  {
    GList *old_stack;
@@ -228,7 +212,7 @@ index 8c924d256..e12fb7b58 100644
  
    /* This is painful because hidden windows that we are in the process
     * of animating out of existence. They'll be at the bottom of the
-@@ -1044,6 +1157,8 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
+@@ -1113,6 +1223,8 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
         * near the front of the other.)
         */
        compositor->windows = g_list_prepend (compositor->windows, actor);
@@ -237,7 +221,7 @@ index 8c924d256..e12fb7b58 100644
  
        stack = g_list_remove (stack, window);
        old_stack = g_list_remove (old_stack, actor);
-@@ -1051,6 +1166,8 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
+@@ -1120,6 +1232,8 @@ meta_compositor_sync_stack (MetaCompositor  *compositor,
  
    sync_actor_stacking (compositor);
  
@@ -246,13 +230,13 @@ index 8c924d256..e12fb7b58 100644
    if (compositor->top_window_actor)
      g_signal_handlers_disconnect_by_func (compositor->top_window_actor,
                                            on_top_window_actor_destroyed,
-@@ -1259,6 +1376,17 @@ meta_compositor_new (MetaDisplay *display)
+@@ -1325,6 +1439,17 @@ meta_compositor_new (MetaDisplay *display)
                                             meta_post_paint_func,
                                             compositor,
                                             NULL);
 +  if (!meta_is_wayland_compositor ())
 +    {
-+      Display *xdisplay = meta_display_get_xdisplay (display);
++      Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 +      int glx_major_opcode, glx_first_event, glx_first_error;
 +
 +      if (XQueryExtension (xdisplay,
@@ -265,11 +249,11 @@ index 8c924d256..e12fb7b58 100644
  }
  
 diff --git a/src/compositor/meta-shaped-texture-private.h b/src/compositor/meta-shaped-texture-private.h
-index 5b3f283c2..189a95312 100644
+index a86a2bff0..d0efdd4dc 100644
 --- a/src/compositor/meta-shaped-texture-private.h
 +++ b/src/compositor/meta-shaped-texture-private.h
-@@ -30,8 +30,9 @@
- #include <meta/meta-shaped-texture.h>
+@@ -31,8 +31,9 @@
+ #include "meta/meta-shaped-texture.h"
  
  ClutterActor *meta_shaped_texture_new (void);
 -void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
@@ -281,12 +265,12 @@ index 5b3f283c2..189a95312 100644
                                              gboolean           is_y_inverted);
  void meta_shaped_texture_set_snippet (MetaShapedTexture *stex,
 diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 8de173bf7..e40bf9d9c 100644
+index ea8daa03d..9665ce2b6 100644
 --- a/src/compositor/meta-shaped-texture.c
 +++ b/src/compositor/meta-shaped-texture.c
-@@ -89,8 +89,10 @@ typedef struct
- struct _MetaShapedTexturePrivate
- {
+@@ -102,8 +102,10 @@ struct _MetaShapedTexture
+   ClutterActor parent;
+ 
    MetaTextureTower *paint_tower;
 +  MetaTextureTower *paint_tower_right;
  
@@ -295,33 +279,27 @@ index 8de173bf7..e40bf9d9c 100644
    CoglTexture *mask_texture;
    CoglSnippet *snippet;
  
-@@ -161,8 +163,10 @@ meta_shaped_texture_init (MetaShapedTexture *self)
-   priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
- 
-   priv->paint_tower = meta_texture_tower_new ();
-+  priv->paint_tower_right = NULL; /* demand create */
- 
-   priv->texture = NULL;
-+  priv->texture_right = NULL;
-   priv->mask_texture = NULL;
-   priv->create_mipmaps = TRUE;
-   priv->is_y_inverted = TRUE;
-@@ -229,11 +233,11 @@ meta_shaped_texture_dispose (GObject *object)
-   MetaShapedTexture *self = (MetaShapedTexture *) object;
-   MetaShapedTexturePrivate *priv = self->priv;
- 
--  if (priv->paint_tower)
--    meta_texture_tower_free (priv->paint_tower);
--  priv->paint_tower = NULL;
-+  g_clear_pointer (&priv->paint_tower, meta_texture_tower_free);
-+  g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free);
- 
-   g_clear_pointer (&priv->texture, cogl_object_unref);
-+  g_clear_pointer (&priv->texture_right, cogl_object_unref);
-   g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
- 
-   meta_shaped_texture_set_mask_texture (self, NULL);
-@@ -431,8 +435,9 @@ paint_clipped_rectangle (CoglFramebuffer       *fb,
+@@ -193,6 +195,9 @@ meta_shaped_texture_init (MetaShapedTexture *stex)
+ 
+   stex->paint_tower = meta_texture_tower_new ();
+ 
++  stex->paint_tower = meta_texture_tower_new ();
++  stex->paint_tower_right = NULL; /* demand create */
++
+   stex->texture = NULL;
+   stex->mask_texture = NULL;
+   stex->create_mipmaps = TRUE;
+@@ -335,6 +340,9 @@ meta_shaped_texture_dispose (GObject *object)
+     meta_texture_tower_free (stex->paint_tower);
+   stex->paint_tower = NULL;
+ 
++  g_clear_pointer (&stex->paint_tower, meta_texture_tower_free);
++  g_clear_pointer (&stex->paint_tower_right, meta_texture_tower_free);
++
+   g_clear_pointer (&stex->texture, cogl_object_unref);
+   g_clear_pointer (&stex->opaque_region, cairo_region_destroy);
+ 
+@@ -611,8 +619,9 @@ paint_clipped_rectangle (MetaShapedTexture     *stex,
  }
  
  static void
@@ -331,132 +309,128 @@ index 8de173bf7..e40bf9d9c 100644
 +                   CoglTexture       *cogl_tex,
 +                   CoglTexture       *cogl_tex_right)
  {
-   MetaShapedTexturePrivate *priv;
-   guint width, height;
-@@ -443,10 +448,13 @@ set_cogl_texture (MetaShapedTexture *stex,
+   int width, height;
  
-   if (priv->texture)
-     cogl_object_unref (priv->texture);
-+  if (priv->texture_right)
-+    cogl_object_unref (priv->texture_right);
+@@ -620,10 +629,13 @@ set_cogl_texture (MetaShapedTexture *stex,
  
-   g_clear_pointer (&priv->saved_base_surface, cairo_surface_destroy);
+   if (stex->texture)
+     cogl_object_unref (stex->texture);
++  if (stex->texture_right)
++    cogl_object_unref (stex->texture_right);
  
-   priv->texture = cogl_tex;
-+  priv->texture_right = cogl_tex_right;
+   g_clear_pointer (&stex->saved_base_surface, cairo_surface_destroy);
+ 
+   stex->texture = cogl_tex;
++  stex->texture_right = cogl_tex_right;
  
    if (cogl_tex != NULL)
      {
-@@ -460,6 +468,9 @@ set_cogl_texture (MetaShapedTexture *stex,
+@@ -637,6 +649,9 @@ set_cogl_texture (MetaShapedTexture *stex,
        height = 0;
      }
  
 +  if (cogl_tex_right != NULL)
 +    cogl_object_ref (cogl_tex_right);
 +
-   if (priv->tex_width != width ||
-       priv->tex_height != height)
+   if (stex->tex_width != width ||
+       stex->tex_height != height)
      {
-@@ -475,8 +486,23 @@ set_cogl_texture (MetaShapedTexture *stex,
+@@ -650,8 +665,23 @@ set_cogl_texture (MetaShapedTexture *stex,
     * previous buffer. We only queue a redraw in response to surface
     * damage. */
  
 +  if (cogl_tex_right != NULL)
 +    {
-+      if (priv->paint_tower_right == NULL)
-+        priv->paint_tower_right = meta_texture_tower_new ();
++      if (stex->paint_tower_right == NULL)
++        stex->paint_tower_right = meta_texture_tower_new ();
 +    }
 +  else
 +    {
-+      g_clear_pointer (&priv->paint_tower_right, meta_texture_tower_free);
++      g_clear_pointer (&stex->paint_tower_right, meta_texture_tower_free);
 +    }
 +
-   if (priv->create_mipmaps)
--    meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex);
+   if (stex->create_mipmaps)
+-    meta_texture_tower_set_base_texture (stex->paint_tower, cogl_tex);
 +    {
-+      meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex);
++      meta_texture_tower_set_base_texture (stex->paint_tower, cogl_tex);
 +
-+      if (priv->paint_tower_right)
-+        meta_texture_tower_set_base_texture (priv->paint_tower_right, cogl_tex_right);
++      if (stex->paint_tower_right)
++        meta_texture_tower_set_base_texture (stex->paint_tower_right, cogl_tex_right);
 +    }
  }
  
- static void
-@@ -485,6 +511,7 @@ do_paint (MetaShapedTexture *stex,
-           CoglTexture       *paint_tex,
-           cairo_region_t    *clip_region)
+ static gboolean
+@@ -927,7 +957,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
  {
-+  ClutterActor *actor = CLUTTER_ACTOR (stex);
-   MetaShapedTexturePrivate *priv = stex->priv;
-   guint tex_width, tex_height;
-   guchar opacity;
-@@ -700,7 +727,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
    MetaShapedTexture *stex = META_SHAPED_TEXTURE (actor);
-   MetaShapedTexturePrivate *priv = stex->priv;
-   CoglTexture *paint_tex = NULL;
+   CoglTexture *paint_tex;
 +  CoglTexture *paint_tex_right = NULL;
    CoglFramebuffer *fb;
 +  gboolean stereo;
  
-   if (!priv->texture)
+   if (!stex->texture)
      return;
-@@ -737,7 +766,32 @@ meta_shaped_texture_paint (ClutterActor *actor)
+@@ -989,7 +1021,32 @@ meta_shaped_texture_paint (ClutterActor *actor)
      return;
  
    fb = cogl_get_draw_framebuffer ();
--  do_paint (META_SHAPED_TEXTURE (actor), fb, paint_tex, priv->clip_region);
+-  do_paint (META_SHAPED_TEXTURE (actor), fb, paint_tex, stex->clip_region);
 +
-+  stereo = priv->texture_right && cogl_framebuffer_get_is_stereo (fb);
++  stereo = stex->texture_right && cogl_framebuffer_get_is_stereo (fb);
 +
 +  if (stereo)
 +    {
-+      if (priv->create_mipmaps)
-+	paint_tex_right = meta_texture_tower_get_paint_texture (priv->paint_tower_right);
++      if (stex->create_mipmaps)
++	paint_tex_right = meta_texture_tower_get_paint_texture (stex->paint_tower_right);
 +
 +      if (!paint_tex_right)
-+	paint_tex_right = COGL_TEXTURE (priv->texture_right);
++	paint_tex_right = COGL_TEXTURE (stex->texture_right);
 +    }
 +  else
 +    paint_tex_right = NULL;
 +
 +  if (stereo)
 +    cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_LEFT);
-+  do_paint (stex, fb, paint_tex, priv->clip_region);
++  do_paint (stex, fb, paint_tex, stex->clip_region);
 +  if (stereo)
 +    cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH);
 +
 +  if (paint_tex_right != NULL)
 +    {
 +      cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_RIGHT);
-+      do_paint (stex, fb, paint_tex_right, priv->clip_region);
++      do_paint (stex, fb, paint_tex_right, stex->clip_region);
 +      cogl_framebuffer_set_stereo_mode (fb, COGL_STEREO_BOTH);
 +    }
  }
  
  static void
-@@ -859,6 +913,12 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
-       priv->create_mipmaps = create_mipmaps;
-       base_texture = create_mipmaps ? priv->texture : NULL;
-       meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
+@@ -1063,6 +1120,12 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
+       stex->create_mipmaps = create_mipmaps;
+       base_texture = create_mipmaps ? stex->texture : NULL;
+       meta_texture_tower_set_base_texture (stex->paint_tower, base_texture);
 +
-+      if (priv->paint_tower_right)
++      if (stex->paint_tower_right)
 +        {
-+          base_texture = create_mipmaps ? priv->texture_right : NULL;
-+          meta_texture_tower_set_base_texture (priv->paint_tower_right, base_texture);
++          base_texture = create_mipmaps ? stex->texture_right : NULL;
++          meta_texture_tower_set_base_texture (stex->paint_tower_right, base_texture);
 +        }
      }
  }
  
-@@ -987,6 +1047,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
-   shrink_backing_region (stex, &clip);
- 
-   meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
-+  if (priv->paint_tower_right)
-+    meta_texture_tower_update_area (priv->paint_tower_right, x, y, width, height);
- 
-   unobscured_region = effective_unobscured_region (stex);
-   if (unobscured_region)
-@@ -1019,17 +1081,18 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
+@@ -1256,6 +1319,12 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
+                                   clip.y,
+                                   clip.width,
+                                   clip.height);
++  if (stex->paint_tower_right)
++    meta_texture_tower_update_area (stex->paint_tower_right,
++                                    clip.x,
++                                    clip.y,
++                                    clip.width,
++                                    clip.height);
+ 
+   stex->prev_invalidation = stex->last_invalidation;
+   stex->last_invalidation = g_get_monotonic_time ();
+@@ -1302,17 +1371,18 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
  }
  
  /**
@@ -480,31 +454,31 @@ index 8de173bf7..e40bf9d9c 100644
  
  /**
 diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c
-index 7505b7d79..f78bce66c 100644
+index f8d6c32b7..a75c4dd09 100644
 --- a/src/compositor/meta-surface-actor-wayland.c
 +++ b/src/compositor/meta-surface-actor-wayland.c
-@@ -187,7 +187,7 @@ meta_surface_actor_wayland_dispose (GObject *object)
+@@ -182,7 +182,7 @@ meta_surface_actor_wayland_dispose (GObject *object)
    MetaShapedTexture *stex =
      meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
  
 -  meta_shaped_texture_set_texture (stex, NULL);
 +  meta_shaped_texture_set_textures (stex, NULL, NULL);
-   if (priv->surface)
+   if (self->surface)
      {
-       g_object_remove_weak_pointer (G_OBJECT (priv->surface),
+       g_object_remove_weak_pointer (G_OBJECT (self->surface),
 diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c
-index d32aeb68a..52db3808e 100644
+index 244b1e885..3cd164d77 100644
 --- a/src/compositor/meta-surface-actor-x11.c
 +++ b/src/compositor/meta-surface-actor-x11.c
-@@ -31,6 +31,7 @@
- #include <cogl/winsys/cogl-texture-pixmap-x11.h>
- 
- #include <meta/errors.h>
+@@ -32,6 +32,7 @@
+ #include "cogl/winsys/cogl-texture-pixmap-x11.h"
+ #include "compositor/meta-cullable.h"
+ #include "compositor/meta-shaped-texture-private.h"
 +#include "compositor-private.h"
- #include "window-private.h"
- #include "meta-shaped-texture-private.h"
- #include "meta-cullable.h"
-@@ -43,6 +44,7 @@ struct _MetaSurfaceActorX11Private
+ #include "core/window-private.h"
+ #include "meta/meta-x11-errors.h"
+ #include "x11/meta-x11-display-private.h"
+@@ -46,6 +47,7 @@ struct _MetaSurfaceActorX11
    MetaDisplay *display;
  
    CoglTexture *texture;
@@ -512,16 +486,16 @@ index d32aeb68a..52db3808e 100644
    Pixmap pixmap;
    Damage damage;
  
-@@ -58,6 +60,8 @@ struct _MetaSurfaceActorX11Private
+@@ -61,6 +63,8 @@ struct _MetaSurfaceActorX11
    guint size_changed : 1;
  
    guint unredirected   : 1;
 +
 +  guint stereo : 1;
  };
- typedef struct _MetaSurfaceActorX11Private MetaSurfaceActorX11Private;
  
-@@ -94,7 +98,7 @@ detach_pixmap (MetaSurfaceActorX11 *self)
+ G_DEFINE_TYPE (MetaSurfaceActorX11,
+@@ -96,7 +100,7 @@ detach_pixmap (MetaSurfaceActorX11 *self)
     * you are supposed to be able to free a GLXPixmap after freeing the underlying
     * pixmap, but it certainly doesn't work with current DRI/Mesa
     */
@@ -529,16 +503,16 @@ index d32aeb68a..52db3808e 100644
 +  meta_shaped_texture_set_textures (stex, NULL, NULL);
    cogl_flush ();
  
-   meta_error_trap_push (display);
-@@ -103,6 +107,7 @@ detach_pixmap (MetaSurfaceActorX11 *self)
-   meta_error_trap_pop (display);
+   meta_x11_error_trap_push (display->x11_display);
+@@ -105,6 +109,7 @@ detach_pixmap (MetaSurfaceActorX11 *self)
+   meta_x11_error_trap_pop (display->x11_display);
  
-   g_clear_pointer (&priv->texture, cogl_object_unref);
-+  g_clear_pointer (&priv->texture_right, cogl_object_unref);
+   g_clear_pointer (&self->texture, cogl_object_unref);
++  g_clear_pointer (&self->texture_right, cogl_object_unref);
  }
  
  static void
-@@ -114,23 +119,35 @@ set_pixmap (MetaSurfaceActorX11 *self,
+@@ -114,23 +119,37 @@ set_pixmap (MetaSurfaceActorX11 *self,
    CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
    MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
    CoglError *error = NULL;
@@ -546,16 +520,16 @@ index d32aeb68a..52db3808e 100644
 +  CoglTexturePixmapX11 *texture;
 +  CoglTexturePixmapX11 *texture_right;
  
-   g_assert (priv->pixmap == None);
-   priv->pixmap = pixmap;
+   g_assert (self->pixmap == None);
+   self->pixmap = pixmap;
  
--  texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, priv->pixmap, FALSE, &error));
-+  if (priv->stereo)
+-  texture = COGL_TEXTURE (cogl_texture_pixmap_x11_new (ctx, self->pixmap, FALSE, &error));
++  if (self->stereo)
 +    texture = cogl_texture_pixmap_x11_new_left (ctx, pixmap, FALSE, &error);
 +  else
 +    texture = cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, &error);
 +
-+  if (priv->stereo)
++  if (self->stereo)
 +    texture_right = cogl_texture_pixmap_x11_new_right (texture);
 +  else
 +    texture_right = NULL;
@@ -569,47 +543,49 @@ index d32aeb68a..52db3808e 100644
 +  else if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (texture)))
      g_warning ("NOTE: Not using GLX TFP!\n");
  
--  priv->texture = texture;
+-  self->texture = texture;
 -  meta_shaped_texture_set_texture (stex, texture);
-+  priv->texture = COGL_TEXTURE (texture);
-+  if (priv->stereo)
-+    priv->texture_right = COGL_TEXTURE (texture_right);
++  self->texture = COGL_TEXTURE (texture);
++  if (self->stereo)
++    self->texture_right = COGL_TEXTURE (texture_right);
 +
-+  meta_shaped_texture_set_textures (stex, COGL_TEXTURE (texture), COGL_TEXTURE (texture_right));
++  meta_shaped_texture_set_textures (stex,
++                                    COGL_TEXTURE (texture),
++                                    COGL_TEXTURE (texture_right));;
  }
  
  static void
-@@ -433,8 +450,8 @@ reset_texture (MetaSurfaceActorX11 *self)
+@@ -419,8 +438,8 @@ reset_texture (MetaSurfaceActorX11 *self)
    /* Setting the texture to NULL will cause all the FBO's cached by the
     * shaped texture's MetaTextureTower to be discarded and recreated.
     */
 -  meta_shaped_texture_set_texture (stex, NULL);
--  meta_shaped_texture_set_texture (stex, priv->texture);
+-  meta_shaped_texture_set_texture (stex, self->texture);
 +  meta_shaped_texture_set_textures (stex, NULL, NULL);
-+  meta_shaped_texture_set_textures (stex, priv->texture, priv->texture_right);
++  meta_shaped_texture_set_textures (stex, self->texture, self->texture_right);
  }
  
  MetaSurfaceActor *
-@@ -443,12 +460,17 @@ meta_surface_actor_x11_new (MetaWindow *window)
+@@ -428,12 +447,17 @@ meta_surface_actor_x11_new (MetaWindow *window)
+ {
    MetaSurfaceActorX11 *self = g_object_new (META_TYPE_SURFACE_ACTOR_X11, NULL);
-   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
    MetaDisplay *display = meta_window_get_display (window);
 +  Window xwindow;
  
    g_assert (!meta_is_wayland_compositor ());
  
-   priv->window = window;
-   priv->display = display;
+   self->window = window;
+   self->display = display;
  
 +  xwindow = meta_window_x11_get_toplevel_xwindow (window);
-+  priv->stereo = meta_compositor_window_is_stereo (display->screen, xwindow);
-+  meta_compositor_select_stereo_notify (display->screen, xwindow);
++  self->stereo = meta_compositor_window_is_stereo (display, xwindow);
++  meta_compositor_select_stereo_notify (display, xwindow);
 +
-   g_signal_connect_object (priv->display, "gl-video-memory-purged",
+   g_signal_connect_object (self->display, "gl-video-memory-purged",
                             G_CALLBACK (reset_texture), self, G_CONNECT_SWAPPED);
  
-@@ -479,3 +501,21 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
-   priv->last_height = height;
+@@ -463,3 +487,17 @@ meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
+   self->last_height = height;
    meta_shaped_texture_set_fallback_size (stex, width, height);
  }
 +
@@ -617,24 +593,20 @@ index d32aeb68a..52db3808e 100644
 +meta_surface_actor_x11_stereo_notify (MetaSurfaceActorX11 *self,
 +                                      gboolean             stereo_tree)
 +{
-+  MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
-+
-+  priv->stereo = stereo_tree != FALSE;
++  self->stereo = stereo_tree != FALSE;
 +  detach_pixmap (self);
 +}
 +
 +gboolean
 +meta_surface_actor_x11_is_stereo (MetaSurfaceActorX11 *self)
 +{
-+  MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
-+
-+  return priv->stereo;
++  return self->stereo;
 +}
 diff --git a/src/compositor/meta-surface-actor-x11.h b/src/compositor/meta-surface-actor-x11.h
-index 0e692ee0f..4b2ecccb1 100644
+index 2c4ed4dd6..3bdd5fdb0 100644
 --- a/src/compositor/meta-surface-actor-x11.h
 +++ b/src/compositor/meta-surface-actor-x11.h
-@@ -64,6 +64,11 @@ MetaSurfaceActor * meta_surface_actor_x11_new (MetaWindow *window);
+@@ -47,6 +47,11 @@ MetaSurfaceActor * meta_surface_actor_x11_new (MetaWindow *window);
  void meta_surface_actor_x11_set_size (MetaSurfaceActorX11 *self,
                                        int width, int height);
  
@@ -647,10 +619,10 @@ index 0e692ee0f..4b2ecccb1 100644
  
  #endif /* __META_SURFACE_ACTOR_X11_H__ */
 diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
-index ce5e7eadc..5b011cec1 100644
+index 6333f43db..9c1c12d09 100644
 --- a/src/compositor/meta-window-actor-private.h
 +++ b/src/compositor/meta-window-actor-private.h
-@@ -60,4 +60,9 @@ MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
+@@ -76,4 +76,9 @@ MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
  void meta_window_actor_update_surface (MetaWindowActor *self);
  MetaWindowActor *meta_window_actor_from_window (MetaWindow *window);
  
@@ -661,19 +633,19 @@ index ce5e7eadc..5b011cec1 100644
 +
  #endif /* META_WINDOW_ACTOR_PRIVATE_H */
 diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
-index b67fb3ce1..80ff5fdd3 100644
+index 1c8dc8fe5..11686d00b 100644
 --- a/src/compositor/meta-window-actor.c
 +++ b/src/compositor/meta-window-actor.c
-@@ -2321,3 +2321,25 @@ screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
-   iface->transform_relative_position = meta_window_actor_transform_relative_position;
+@@ -2031,3 +2031,25 @@ screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
    iface->capture_into = meta_window_actor_capture_into;
+   iface->has_damage = meta_window_actor_has_damage;
  }
 +
 +void
 +meta_window_actor_stereo_notify (MetaWindowActor *self,
 +                                 gboolean         stereo_tree)
 +{
-+  MetaWindowActorPrivate *priv = self->priv;
++  MetaWindowActorPrivate *priv = meta_window_actor_get_instance_private (self);
 +
 +  if (META_IS_SURFACE_ACTOR_X11 (priv->surface))
 +    meta_surface_actor_x11_stereo_notify (META_SURFACE_ACTOR_X11 (priv->surface),
@@ -683,7 +655,7 @@ index b67fb3ce1..80ff5fdd3 100644
 +gboolean
 +meta_window_actor_is_stereo (MetaWindowActor *self)
 +{
-+  MetaWindowActorPrivate *priv = self->priv;
++  MetaWindowActorPrivate *priv = meta_window_actor_get_instance_private (self);
 +
 +  if (META_IS_SURFACE_ACTOR_X11 (priv->surface))
 +    return meta_surface_actor_x11_is_stereo (META_SURFACE_ACTOR_X11 (priv->surface));
@@ -691,18 +663,18 @@ index b67fb3ce1..80ff5fdd3 100644
 +    return FALSE;
 +}
 diff --git a/src/core/main.c b/src/core/main.c
-index be7a90feb..828037635 100644
+index e8464720f..629f8e94e 100644
 --- a/src/core/main.c
 +++ b/src/core/main.c
-@@ -47,6 +47,7 @@
- #include <meta/main.h>
- #include "util-private.h"
- #include "display-private.h"
+@@ -81,6 +81,7 @@
+ #include "meta/meta-backend.h"
+ #include "meta/meta-x11-errors.h"
+ #include "meta/prefs.h"
 +#include "stereo.h"
- #include <meta/errors.h>
- #include "ui.h"
- #include <meta/prefs.h>
-@@ -582,6 +583,9 @@ meta_init (void)
+ #include "ui/ui.h"
+ #include "x11/session.h"
+ 
+@@ -589,6 +590,9 @@ meta_init (void)
  
    meta_init_backend (backend_gtype);
  
@@ -714,10 +686,10 @@ index be7a90feb..828037635 100644
  #ifdef HAVE_WAYLAND
 diff --git a/src/core/stereo.c b/src/core/stereo.c
 new file mode 100644
-index 000000000..5a232b67c
+index 000000000..817056527
 --- /dev/null
 +++ b/src/core/stereo.c
-@@ -0,0 +1,153 @@
+@@ -0,0 +1,154 @@
 +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 +
 +/*
@@ -759,11 +731,12 @@ index 000000000..5a232b67c
 +#include <gio/gunixinputstream.h>
 +#include <X11/Xatom.h>
 +
++#include "display-private.h"
 +#include <meta/main.h>
-+#include "ui.h"
++#include <meta/meta-x11-display.h>
 +#include <meta/util.h>
-+#include "display-private.h"
 +#include "stereo.h"
++#include "ui/ui.h"
 +#include "util-private.h"
 +
 +static guint stereo_switch_id = 0;
@@ -843,7 +816,7 @@ index 000000000..5a232b67c
 +  if (!stereo_restart && have_windows != stereo_have_windows)
 +    {
 +      MetaDisplay *display = meta_get_display ();
-+      Display *xdisplay = meta_display_get_xdisplay (display);
++      Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 +      Window root = DefaultRootWindow (xdisplay);
 +      Atom atom_enable_stereo = XInternAtom (xdisplay, "_MUTTER_ENABLE_STEREO", False);
 +      long value;
@@ -905,11 +878,24 @@ index 000000000..ccd1d702a
 +void     meta_stereo_finish_restart          (void);
 +
 +#endif
+diff --git a/src/meson.build b/src/meson.build
+index 9919b5cfb..7cced8f53 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -353,6 +353,8 @@ mutter_sources = [
+   'core/stack.h',
+   'core/stack-tracker.c',
+   'core/stack-tracker.h',
++  'core/stereo.c',
++  'core/stereo.h',
+   'core/startup-notification.c',
+   'core/startup-notification-private.h',
+   'core/util.c',
 diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
-index c9c229e6c..7bc72f166 100644
+index da0acfcbb..ddad1a45c 100644
 --- a/src/wayland/meta-wayland-surface.c
 +++ b/src/wayland/meta-wayland-surface.c
-@@ -676,7 +676,7 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface      *surface,
+@@ -731,7 +731,7 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface      *surface,
                snippet = meta_wayland_buffer_create_snippet (pending->buffer);
                is_y_inverted = meta_wayland_buffer_is_y_inverted (pending->buffer);
  
@@ -919,5 +905,5 @@ index c9c229e6c..7bc72f166 100644
                meta_shaped_texture_set_is_y_inverted (stex, is_y_inverted);
                g_clear_pointer (&snippet, cogl_object_unref);
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-Make-screen-cast-and-remote-desktop-non-experimental.patch b/SOURCES/0001-Make-screen-cast-and-remote-desktop-non-experimental.patch
deleted file mode 100644
index c1633bb..0000000
--- a/SOURCES/0001-Make-screen-cast-and-remote-desktop-non-experimental.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From 19539bd93c521002222a895dca3abf3f3c46a1b5 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 7 Jun 2018 10:21:06 +0200
-Subject: [PATCH] Make screen cast and remote desktop non-experimental
-
-It's time to make this feature more accessible by not requiring editing
-an array in gsettings.
----
- data/org.gnome.mutter.gschema.xml.in |  4 ---
- src/backends/meta-backend.c          | 51 ++--------------------------
- src/backends/meta-settings-private.h |  4 +--
- src/backends/meta-settings.c         |  4 ---
- 4 files changed, 3 insertions(+), 60 deletions(-)
-
-diff --git a/data/org.gnome.mutter.gschema.xml.in b/data/org.gnome.mutter.gschema.xml.in
-index d926312c89..6cbd9c1b50 100644
---- a/data/org.gnome.mutter.gschema.xml.in
-+++ b/data/org.gnome.mutter.gschema.xml.in
-@@ -120,10 +120,6 @@
-                                         framebuffers instead of window content,
-                                         to manage HiDPI monitors. Does not
-                                         require a restart.
--        • “remote-desktop”            — enables remote desktop support. To support
--                                        remote desktop with screen sharing,
--                                        “screen-cast” must also be enabled.
--        • “screen-cast”               — enables screen cast support.
-       </description>
-     </key>
- 
-diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
-index 4ebceb4ea6..b523a91d4d 100644
---- a/src/backends/meta-backend.c
-+++ b/src/backends/meta-backend.c
-@@ -402,28 +402,6 @@ meta_backend_create_input_settings (MetaBackend *backend)
-   return META_BACKEND_GET_CLASS (backend)->create_input_settings (backend);
- }
- 
--#ifdef HAVE_REMOTE_DESKTOP
--static gboolean
--is_screen_cast_enabled (MetaBackend *backend)
--{
--  MetaSettings *settings = meta_backend_get_settings (backend);
--
--  return meta_settings_is_experimental_feature_enabled (
--    settings,
--    META_EXPERIMENTAL_FEATURE_SCREEN_CAST);
--}
--
--static gboolean
--is_remote_desktop_enabled (MetaBackend *backend)
--{
--  MetaSettings *settings = meta_backend_get_settings (backend);
--
--  return meta_settings_is_experimental_feature_enabled (
--    settings,
--    META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP);
--}
--#endif /* HAVE_REMOTE_DESKTOP */
--
- static void
- meta_backend_real_post_init (MetaBackend *backend)
- {
-@@ -457,10 +435,8 @@ meta_backend_real_post_init (MetaBackend *backend)
- 
- #ifdef HAVE_REMOTE_DESKTOP
-   priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL);
--  if (is_screen_cast_enabled (backend))
--    priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
--  if (is_remote_desktop_enabled (backend))
--    priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
-+  priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
-+  priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
- #endif /* HAVE_REMOTE_DESKTOP */
- 
-   if (!meta_monitor_manager_is_headless (priv->monitor_manager))
-@@ -552,26 +528,6 @@ meta_backend_class_init (MetaBackendClass *klass)
-   stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
- }
- 
--static void
--experimental_features_changed (MetaSettings            *settings,
--                               MetaExperimentalFeature  old_experimental_features,
--                               MetaBackend             *backend)
--{
--#ifdef HAVE_REMOTE_DESKTOP
--  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
--
--  if (is_screen_cast_enabled (backend) && !priv->screen_cast)
--    priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
--  else if (!is_screen_cast_enabled (backend))
--    g_clear_object (&priv->screen_cast);
--
--  if (is_remote_desktop_enabled (backend) && !priv->remote_desktop)
--    priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
--  else if (!is_remote_desktop_enabled (backend))
--    g_clear_object (&priv->remote_desktop);
--#endif /* HAVE_REMOTE_DESKTOP */
--}
--
- static MetaMonitorManager *
- meta_backend_create_monitor_manager (MetaBackend *backend,
-                                      GError     **error)
-@@ -599,9 +555,6 @@ meta_backend_initable_init (GInitable     *initable,
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
- 
-   priv->settings = meta_settings_new (backend);
--  g_signal_connect (priv->settings, "experimental-features-changed",
--                    G_CALLBACK (experimental_features_changed),
--                    backend);
- 
-   priv->egl = g_object_new (META_TYPE_EGL, NULL);
- 
-diff --git a/src/backends/meta-settings-private.h b/src/backends/meta-settings-private.h
-index a8cb6a5499..90bfb439f0 100644
---- a/src/backends/meta-settings-private.h
-+++ b/src/backends/meta-settings-private.h
-@@ -31,9 +31,7 @@ typedef enum _MetaExperimentalFeature
- {
-   META_EXPERIMENTAL_FEATURE_NONE = 0,
-   META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
--  META_EXPERIMENTAL_FEATURE_SCREEN_CAST = (1 << 1),
--  META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP  = (1 << 2),
--  META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS = (1 << 3),
-+  META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS  = (1 << 1),
- } MetaExperimentalFeature;
- 
- #define META_TYPE_SETTINGS (meta_settings_get_type ())
-diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c
-index 6f47c5f58c..a73850ed67 100644
---- a/src/backends/meta-settings.c
-+++ b/src/backends/meta-settings.c
-@@ -263,10 +263,6 @@ experimental_features_handler (GVariant *features_variant,
-       /* So far no experimental features defined. */
-       if (g_str_equal (feature, "scale-monitor-framebuffer"))
-         features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
--      else if (g_str_equal (feature, "screen-cast"))
--        features |= META_EXPERIMENTAL_FEATURE_SCREEN_CAST;
--      else if (g_str_equal (feature, "remote-desktop"))
--        features |= META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP;
-       else if (g_str_equal (feature, "kms-modifiers"))
-         features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS;
-       else
--- 
-2.17.1
-
diff --git a/SOURCES/0001-backends-x11-Only-free-cursor-if-it-was-created-succ.patch b/SOURCES/0001-backends-x11-Only-free-cursor-if-it-was-created-succ.patch
deleted file mode 100644
index 608cbb6..0000000
--- a/SOURCES/0001-backends-x11-Only-free-cursor-if-it-was-created-succ.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From f76cacd15430bcc22d9f66e0b500e3ec8a242c23 Mon Sep 17 00:00:00 2001
-From: Sebastian Keller <sebastian-keller@gmx.de>
-Date: Thu, 2 Aug 2018 00:58:56 +0200
-Subject: [PATCH] backends/x11: Only free cursor if it was created successfully
-
-XcursorLibraryLoadCursor can return 'None' if the current cursor theme
-is missing the requested icon. If XFreeCursor is then called on this
-cursor, it generates a BadCursor error causing gnome-shell to crash.
-
-Fixes https://gitlab.gnome.org/GNOME/mutter/issues/254
-
-(cherry picked from commit 1bfa20929b36d06cc23667d1122175149615b56d)
----
- src/core/screen.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/src/core/screen.c b/src/core/screen.c
-index c14bba0cf..d7623f3fb 100644
---- a/src/core/screen.c
-+++ b/src/core/screen.c
-@@ -1394,7 +1394,9 @@ meta_screen_update_cursor (MetaScreen *screen)
- 
-   XDefineCursor (display->xdisplay, screen->xroot, xcursor);
-   XFlush (display->xdisplay);
--  XFreeCursor (display->xdisplay, xcursor);
-+
-+  if (xcursor)
-+    XFreeCursor (display->xdisplay, xcursor);
- }
- 
- void
--- 
-2.19.0
-
diff --git a/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch b/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch
index d932796..2dd5bb9 100644
--- a/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch
+++ b/SOURCES/0001-backends-x11-Support-synaptics-configuration.patch
@@ -1,4 +1,4 @@
-From 39d66b990adfaed99e0a5ea473c8d1d0116c0757 Mon Sep 17 00:00:00 2001
+From 471174ba6cf517baf8ff73e903202e1c73b6ec74 Mon Sep 17 00:00:00 2001
 From: Carlos Garnacho <carlosg@gnome.org>
 Date: Thu, 19 Jan 2017 15:03:41 +0100
 Subject: [PATCH] backends/x11: Support synaptics configuration
@@ -6,22 +6,22 @@ Subject: [PATCH] backends/x11: Support synaptics configuration
 The code is taken mostly as-is from g-s-d, so we can drag the
 dead horse a bit longer.
 ---
- src/backends/x11/meta-input-settings-x11.c | 269 ++++++++++++++++++++-
- 1 file changed, 268 insertions(+), 1 deletion(-)
+ src/backends/x11/meta-input-settings-x11.c | 268 +++++++++++++++++++++
+ 1 file changed, 268 insertions(+)
 
 diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
-index 9687fb3..effcc5f 100644
+index 89f07ee1f..051a1c605 100644
 --- a/src/backends/x11/meta-input-settings-x11.c
 +++ b/src/backends/x11/meta-input-settings-x11.c
 @@ -26,6 +26,7 @@
- #include "meta-backend-x11.h"
- #include "meta-input-settings-x11.h"
+ #include "backends/x11/meta-input-settings-x11.h"
  
+ #include <gdk/gdkx.h>
 +#include <stdlib.h>
  #include <string.h>
- #include <gdk/gdkx.h>
  #include <X11/Xatom.h>
-@@ -159,6 +160,178 @@ change_property (ClutterInputDevice *device,
+ #include <X11/extensions/XInput2.h>
+@@ -162,6 +163,180 @@ change_property (ClutterInputDevice *device,
    meta_XFree (data_ret);
  }
  
@@ -45,6 +45,7 @@ index 9687fb3..effcc5f 100644
 +                                  gboolean            left_handed)
 +{
 +  MetaDisplay *display = meta_get_display ();
++  MetaX11Display *x11_display = display ? display->x11_display : NULL;
 +  MetaBackend *backend = meta_get_backend ();
 +  Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
 +  XDevice *xdevice;
@@ -68,8 +69,8 @@ index 9687fb3..effcc5f 100644
 +                   XA_INTEGER, 8, tap_action, 7);
 +  meta_XFree (tap_action);
 +
-+  if (display)
-+    meta_error_trap_push (display);
++  if (x11_display)
++    meta_x11_error_trap_push (x11_display);
 +  buttons = g_new (guchar, buttons_capacity);
 +  n_buttons = XGetDeviceButtonMapping (xdisplay, xdevice,
 +                                       buttons, buttons_capacity);
@@ -89,7 +90,7 @@ index 9687fb3..effcc5f 100644
 +  XSetDeviceButtonMapping (xdisplay, xdevice, buttons, n_buttons);
 +  g_free (buttons);
 +
-+  if (display && meta_error_trap_pop_with_return (display))
++  if (x11_display && meta_x11_error_trap_pop_with_return (x11_display))
 +    {
 +      g_warning ("Could not set synaptics touchpad left-handed for %s",
 +                 clutter_input_device_get_device_name (device));
@@ -104,6 +105,7 @@ index 9687fb3..effcc5f 100644
 +                        gdouble             speed)
 +{
 +  MetaDisplay *display = meta_get_display ();
++  MetaX11Display *x11_display = display ? display->x11_display : NULL;
 +  MetaBackend *backend = meta_get_backend ();
 +  Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
 +  XDevice *xdevice;
@@ -161,8 +163,8 @@ index 9687fb3..effcc5f 100644
 +      denominator = -1;
 +    }
 +
-+  if (display)
-+    meta_error_trap_push (display);
++  if (x11_display)
++    meta_x11_error_trap_push (x11_display);
 +
 +  state = (XFeedbackState *) states;
 +
@@ -187,7 +189,7 @@ index 9687fb3..effcc5f 100644
 +      state = (XFeedbackState *) ((char *) state + state->length);
 +    }
 +
-+  if (display && meta_error_trap_pop_with_return (display))
++  if (x11_display && meta_x11_error_trap_pop_with_return (x11_display))
 +    {
 +      g_warning ("Could not set synaptics touchpad acceleration for %s",
 +                 clutter_input_device_get_device_name (device));
@@ -200,7 +202,7 @@ index 9687fb3..effcc5f 100644
  static void
  meta_input_settings_x11_set_send_events (MetaInputSettings        *settings,
                                           ClutterInputDevice       *device,
-@@ -167,6 +340,13 @@ meta_input_settings_x11_set_send_events (MetaInputSettings        *settings,
+@@ -170,6 +345,13 @@ meta_input_settings_x11_set_send_events (MetaInputSettings        *settings,
    guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
    guchar *available;
  
@@ -214,7 +216,7 @@ index 9687fb3..effcc5f 100644
    available = get_property (device, "libinput Send Events Modes Available",
                              XA_INTEGER, 8, 2);
    if (!available)
-@@ -219,6 +399,12 @@ meta_input_settings_x11_set_speed (MetaInputSettings  *settings,
+@@ -222,6 +404,12 @@ meta_input_settings_x11_set_speed (MetaInputSettings  *settings,
    Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
    gfloat value = speed;
  
@@ -227,13 +229,8 @@ index 9687fb3..effcc5f 100644
    change_property (device, "libinput Accel Speed",
                     XInternAtom (xdisplay, "FLOAT", False),
                     32, &value, 1);
-@@ -242,9 +428,23 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings  *settings,
-       change_property (device, "Wacom Rotation",
-                        XA_INTEGER, 8, &value, 1);
-     }
--  else
-+  else if (device_type == CLUTTER_POINTER_DEVICE ||
-+           device_type == CLUTTER_TOUCHPAD_DEVICE)
+@@ -248,6 +436,19 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings  *settings,
+   else
      {
        value = enabled ? 1 : 0;
 +
@@ -252,7 +249,7 @@ index 9687fb3..effcc5f 100644
        change_property (device, "libinput Left Handed Enabled",
                         XA_INTEGER, 8, &value, 1);
      }
-@@ -268,6 +468,20 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings  *settings,
+@@ -271,6 +472,20 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings  *settings,
  {
    guchar value = (enabled) ? 1 : 0;
  
@@ -273,7 +270,7 @@ index 9687fb3..effcc5f 100644
    change_property (device, "libinput Tapping Enabled",
                     XA_INTEGER, 8, &value, 1);
  }
-@@ -290,6 +504,27 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings  *settings,
+@@ -293,6 +508,27 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings  *settings,
  {
    guchar value = (inverted) ? 1 : 0;
  
@@ -301,7 +298,7 @@ index 9687fb3..effcc5f 100644
    change_property (device, "libinput Natural Scrolling Enabled",
                     XA_INTEGER, 8, &value, 1);
  }
-@@ -303,6 +538,22 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings            *settings,
+@@ -306,6 +542,22 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings            *settings,
    guchar *current = NULL;
    guchar *available = NULL;
  
@@ -324,7 +321,7 @@ index 9687fb3..effcc5f 100644
    available = get_property (device, "libinput Scroll Methods Available",
                              XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
    if (!available || !available[SCROLL_METHOD_FIELD_EDGE])
-@@ -332,6 +583,22 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings            *set
+@@ -335,6 +587,22 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings            *set
    guchar *current = NULL;
    guchar *available = NULL;
  
diff --git a/SOURCES/0001-clutter-Add-clutter_input_method_forward_key-method.patch b/SOURCES/0001-clutter-Add-clutter_input_method_forward_key-method.patch
deleted file mode 100644
index 1586758..0000000
--- a/SOURCES/0001-clutter-Add-clutter_input_method_forward_key-method.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From 83808bbb02c0e4db40771358bf16237bd32ba2f2 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Thu, 27 Sep 2018 21:06:52 +0200
-Subject: [PATCH] clutter: Add clutter_input_method_forward_key() method.
-
-This allows input methods to inject key events with specific keyval/keycode,
-those events will be flagged with CLUTTER_EVENT_FLAG_INPUT_METHOD so they
-won't be processed by the IM again.
-
-https://gitlab.gnome.org/GNOME/gnome-shell/issues/531
----
- clutter/clutter/clutter-input-method.c | 44 ++++++++++++++++++++++++++
- clutter/clutter/clutter-input-method.h |  8 +++++
- 2 files changed, 52 insertions(+)
-
-diff --git a/clutter/clutter/clutter-input-method.c b/clutter/clutter/clutter-input-method.c
-index 11d726d7b..cb5364b21 100644
---- a/clutter/clutter/clutter-input-method.c
-+++ b/clutter/clutter/clutter-input-method.c
-@@ -25,6 +25,7 @@
- #include "clutter/clutter-input-method.h"
- #include "clutter/clutter-input-method-private.h"
- #include "clutter/clutter-input-focus-private.h"
-+#include "clutter/clutter-device-manager-private.h"
- 
- typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate;
- 
-@@ -442,3 +443,46 @@ clutter_input_method_filter_key_event (ClutterInputMethod    *im,
- 
-   return im_class->filter_key_event (im, (const ClutterEvent *) key);
- }
-+
-+void
-+clutter_input_method_forward_key (ClutterInputMethod *im,
-+                                  uint32_t            keyval,
-+                                  uint32_t            keycode,
-+                                  uint32_t            state,
-+                                  uint64_t            time_,
-+                                  gboolean            press)
-+{
-+  ClutterInputMethodPrivate *priv;
-+  ClutterDeviceManager *device_manager;
-+  ClutterInputDevice *keyboard;
-+  ClutterStage *stage;
-+  ClutterEvent *event;
-+
-+  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
-+
-+  priv = clutter_input_method_get_instance_private (im);
-+  if (!priv->focus)
-+    return;
-+
-+  device_manager = clutter_device_manager_get_default ();
-+  keyboard = clutter_device_manager_get_core_device (device_manager,
-+                                                     CLUTTER_KEYBOARD_DEVICE);
-+  stage = _clutter_input_device_get_stage (keyboard);
-+  if (stage == NULL)
-+    return;
-+
-+  event = clutter_event_new (press ? CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
-+  event->key.time = time_;
-+  event->key.flags = CLUTTER_EVENT_FLAG_INPUT_METHOD;
-+  event->key.modifier_state = state;
-+  event->key.keyval = keyval;
-+  event->key.hardware_keycode = keycode;
-+  event->key.unicode_value = clutter_keysym_to_unicode (keyval);
-+
-+  clutter_event_set_device (event, keyboard);
-+  clutter_event_set_source_device (event, keyboard);
-+  clutter_event_set_stage (event, stage);
-+
-+  clutter_event_put (event);
-+  clutter_event_free (event);
-+}
-diff --git a/clutter/clutter/clutter-input-method.h b/clutter/clutter/clutter-input-method.h
-index d37522d14..3aa549e24 100644
---- a/clutter/clutter/clutter-input-method.h
-+++ b/clutter/clutter/clutter-input-method.h
-@@ -85,4 +85,12 @@ void clutter_input_method_notify_key_event (ClutterInputMethod *im,
- CLUTTER_AVAILABLE_IN_MUTTER
- void clutter_input_method_request_toggle_input_panel (ClutterInputMethod *im);
- 
-+CLUTTER_AVAILABLE_IN_MUTTER
-+void clutter_input_method_forward_key (ClutterInputMethod *im,
-+                                       uint32_t            keyval,
-+                                       uint32_t            keycode,
-+                                       uint32_t            state,
-+                                       uint64_t            time_,
-+                                       gboolean            press);
-+
- #endif /* __CLUTTER_INPUT_METHOD_H__ */
--- 
-2.20.1
-
diff --git a/SOURCES/0001-clutter-Do-not-latch-modifiers-on-modifier-keys.patch b/SOURCES/0001-clutter-Do-not-latch-modifiers-on-modifier-keys.patch
deleted file mode 100644
index 062cebb..0000000
--- a/SOURCES/0001-clutter-Do-not-latch-modifiers-on-modifier-keys.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From c604ada385e046e9307571fa078972d2b1815987 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Wed, 3 Oct 2018 22:43:21 +0200
-Subject: [PATCH] clutter: Do not latch modifiers on modifier keys
-
-If the user maps eg. Alt+F2 to a pad button, the MetaInputSettings will
-send the full Alt press, F2 press, F2 release, Alt release sequence.
-However the keycode corresponding to Alt is found in level 1, so the
-Shift modifier gets unintendedly latched in addition to the Alt key
-press/release pair.
-
-We could probably improve keycode lookup heuristics so level=0 (and
-no modifier latching) is preferred, but we can do without it altogether
-for modifier keys.
----
- clutter/clutter/x11/clutter-virtual-input-device-x11.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/clutter/clutter/x11/clutter-virtual-input-device-x11.c b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-index b86ded0d0..e16ba3fd0 100644
---- a/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-+++ b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-@@ -147,14 +147,16 @@ clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtu
-       return;
-     }
- 
--  if (key_state == CLUTTER_KEY_STATE_PRESSED)
-+  if (!_clutter_keymap_x11_get_is_modifier (keymap, keycode) &&
-+      key_state == CLUTTER_KEY_STATE_PRESSED)
-     clutter_keymap_x11_latch_modifiers (keymap, level, TRUE);
- 
-   XTestFakeKeyEvent (clutter_x11_get_default_display (),
-                      (KeyCode) keycode,
-                      key_state == CLUTTER_KEY_STATE_PRESSED, 0);
- 
--  if (key_state == CLUTTER_KEY_STATE_RELEASED)
-+  if (!_clutter_keymap_x11_get_is_modifier (keymap, keycode) &&
-+      key_state == CLUTTER_KEY_STATE_RELEASED)
-     clutter_keymap_x11_latch_modifiers (keymap, level, FALSE);
- }
- 
--- 
-2.20.1
-
diff --git a/SOURCES/0001-clutter-Extend-touchpad-device-property-check-for-Sy.patch b/SOURCES/0001-clutter-Extend-touchpad-device-property-check-for-Sy.patch
index d7dff0d..96fe26b 100644
--- a/SOURCES/0001-clutter-Extend-touchpad-device-property-check-for-Sy.patch
+++ b/SOURCES/0001-clutter-Extend-touchpad-device-property-check-for-Sy.patch
@@ -1,4 +1,4 @@
-From dd49a4985c8e0bbe51d5784fd89363d496eae350 Mon Sep 17 00:00:00 2001
+From 368fdebe8f4f4e0c0e41f5be9961a748f328cb57 Mon Sep 17 00:00:00 2001
 From: Carlos Garnacho <carlosg@gnome.org>
 Date: Tue, 13 Feb 2018 11:44:40 +0100
 Subject: [PATCH] clutter: Extend touchpad device property check for Synaptics
@@ -10,10 +10,10 @@ to get the device type may fall short.
  1 file changed, 19 insertions(+), 3 deletions(-)
 
 diff --git a/clutter/clutter/x11/clutter-device-manager-xi2.c b/clutter/clutter/x11/clutter-device-manager-xi2.c
-index 62f558380..6794a2e0c 100644
+index 87da4b050..297d3acfe 100644
 --- a/clutter/clutter/x11/clutter-device-manager-xi2.c
 +++ b/clutter/clutter/x11/clutter-device-manager-xi2.c
-@@ -267,8 +267,9 @@ is_touch_device (XIAnyClassInfo         **classes,
+@@ -282,8 +282,9 @@ is_touch_device (XIAnyClassInfo         **classes,
  }
  
  static gboolean
@@ -25,7 +25,7 @@ index 62f558380..6794a2e0c 100644
  {
    gulong nitems, bytes_after;
    guint32 *data = NULL;
-@@ -276,7 +277,7 @@ is_touchpad_device (ClutterBackendX11 *backend_x11,
+@@ -291,7 +292,7 @@ is_touchpad_device (ClutterBackendX11 *backend_x11,
    Atom type;
    Atom prop;
  
@@ -34,7 +34,7 @@ index 62f558380..6794a2e0c 100644
    if (prop == None)
      return FALSE;
  
-@@ -297,6 +298,21 @@ is_touchpad_device (ClutterBackendX11 *backend_x11,
+@@ -312,6 +313,21 @@ is_touchpad_device (ClutterBackendX11 *backend_x11,
    return TRUE;
  }
  
@@ -57,5 +57,5 @@ index 62f558380..6794a2e0c 100644
  get_device_ids (ClutterBackendX11  *backend_x11,
                  XIDeviceInfo       *info,
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-clutter-Only-reset-scroll-axes-on-slave-devices.patch b/SOURCES/0001-clutter-Only-reset-scroll-axes-on-slave-devices.patch
index fbe7a48..dd9eeb5 100644
--- a/SOURCES/0001-clutter-Only-reset-scroll-axes-on-slave-devices.patch
+++ b/SOURCES/0001-clutter-Only-reset-scroll-axes-on-slave-devices.patch
@@ -1,4 +1,4 @@
-From 351f04e42c31d9c06274250988d05b439d50df2b Mon Sep 17 00:00:00 2001
+From 2259241e4e6f03bea4e9d746582a9e6a82b3c755 Mon Sep 17 00:00:00 2001
 From: Carlos Garnacho <carlosg@gnome.org>
 Date: Wed, 13 Jun 2018 13:48:24 +0200
 Subject: [PATCH] clutter: Only reset scroll axes on slave devices
@@ -9,10 +9,10 @@ As a plus, unknown source device IDs will just warn instead of crash.
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/clutter/clutter/x11/clutter-device-manager-xi2.c b/clutter/clutter/x11/clutter-device-manager-xi2.c
-index 6794a2e0c..0718cd975 100644
+index 297d3acfe..76ef420ed 100644
 --- a/clutter/clutter/x11/clutter-device-manager-xi2.c
 +++ b/clutter/clutter/x11/clutter-device-manager-xi2.c
-@@ -1819,7 +1819,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
+@@ -1899,7 +1899,8 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
              _clutter_input_device_set_stage (device, NULL);
            }
  
@@ -23,5 +23,5 @@ index 6794a2e0c..0718cd975 100644
          clutter_event_set_device (event, device);
          clutter_event_set_source_device (event, source_device);
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-clutter-evdev-Use-clutter_event_set_device.patch b/SOURCES/0001-clutter-evdev-Use-clutter_event_set_device.patch
deleted file mode 100644
index 75b2849..0000000
--- a/SOURCES/0001-clutter-evdev-Use-clutter_event_set_device.patch
+++ /dev/null
@@ -1,123 +0,0 @@
-From 580f7958efffd9548a1449c87f7f2c5e6642e6fd Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Mon, 19 Nov 2018 14:55:51 +0100
-Subject: [PATCH 01/12] clutter/evdev: Use `clutter_event_set_device()`
-
-Use the relevant clutter device API `clutter_event_set_device()` instead
-of setting the device directly in the event field.
----
- clutter/clutter/evdev/clutter-device-manager-evdev.c | 3 +--
- clutter/clutter/evdev/clutter-seat-evdev.c           | 4 ----
- clutter/clutter/evdev/clutter-xkb-utils.c            | 2 +-
- clutter/tests/performance/test-common.h              | 4 ++--
- 4 files changed, 4 insertions(+), 9 deletions(-)
-
-diff --git a/clutter/clutter/evdev/clutter-device-manager-evdev.c b/clutter/clutter/evdev/clutter-device-manager-evdev.c
-index f2aeda6..a885b90 100644
---- a/clutter/clutter/evdev/clutter-device-manager-evdev.c
-+++ b/clutter/clutter/evdev/clutter-device-manager-evdev.c
-@@ -324,7 +324,6 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
-   _clutter_evdev_event_set_time_usec (event, time_us);
-   event->motion.time = us2ms (time_us);
-   event->motion.stage = stage;
--  event->motion.device = seat->core_pointer;
-   _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
-   event->motion.x = x;
-   event->motion.y = y;
-@@ -332,6 +331,7 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
-                                                     &event->motion.x,
-                                                     &event->motion.y);
-   event->motion.axes = axes;
-+  clutter_event_set_device (event, seat->core_pointer);
-   clutter_event_set_source_device (event, input_device);
- 
-   if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
-@@ -519,7 +519,6 @@ notify_proximity (ClutterInputDevice *input_device,
- 
-   event->proximity.time = us2ms (time_us);
-   event->proximity.stage = CLUTTER_STAGE (stage);
--  event->proximity.device = seat->core_pointer;
-   clutter_event_set_device_tool (event, device_evdev->last_tool);
-   clutter_event_set_device (event, seat->core_pointer);
-   clutter_event_set_source_device (event, input_device);
-diff --git a/clutter/clutter/evdev/clutter-seat-evdev.c b/clutter/clutter/evdev/clutter-seat-evdev.c
-index a453b11..7cba516 100644
---- a/clutter/clutter/evdev/clutter-seat-evdev.c
-+++ b/clutter/clutter/evdev/clutter-seat-evdev.c
-@@ -385,7 +385,6 @@ new_absolute_motion_event (ClutterSeatEvdev   *seat,
-   _clutter_evdev_event_set_time_usec (event, time_us);
-   event->motion.time = us2ms (time_us);
-   event->motion.stage = stage;
--  event->motion.device = seat->core_pointer;
-   _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
-   event->motion.x = x;
-   event->motion.y = y;
-@@ -631,7 +630,6 @@ notify_scroll (ClutterInputDevice       *input_device,
-   _clutter_evdev_event_set_time_usec (event, time_us);
-   event->scroll.time = us2ms (time_us);
-   event->scroll.stage = CLUTTER_STAGE (stage);
--  event->scroll.device = seat->core_pointer;
-   _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
- 
-   /* libinput pointer axis events are in pointer motion coordinate space.
-@@ -684,7 +682,6 @@ notify_discrete_scroll (ClutterInputDevice     *input_device,
-   _clutter_evdev_event_set_time_usec (event, time_us);
-   event->scroll.time = us2ms (time_us);
-   event->scroll.stage = CLUTTER_STAGE (stage);
--  event->scroll.device = seat->core_pointer;
-   _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
- 
-   event->scroll.direction = direction;
-@@ -813,7 +810,6 @@ clutter_seat_evdev_notify_touch_event (ClutterSeatEvdev   *seat,
-   _clutter_evdev_event_set_time_usec (event, time_us);
-   event->touch.time = us2ms (time_us);
-   event->touch.stage = CLUTTER_STAGE (stage);
--  event->touch.device = seat->core_pointer;
-   event->touch.x = x;
-   event->touch.y = y;
-   clutter_input_device_evdev_translate_coordinates (input_device, stage,
-diff --git a/clutter/clutter/evdev/clutter-xkb-utils.c b/clutter/clutter/evdev/clutter-xkb-utils.c
-index 7f47682..0a9a838 100644
---- a/clutter/clutter/evdev/clutter-xkb-utils.c
-+++ b/clutter/clutter/evdev/clutter-xkb-utils.c
-@@ -76,12 +76,12 @@ _clutter_key_event_new_from_evdev (ClutterInputDevice *device,
-   else
-     sym = XKB_KEY_NoSymbol;
- 
--  event->key.device = core_device;
-   event->key.stage = stage;
-   event->key.time = _time;
-   _clutter_xkb_translate_state (event, xkb_state, button_state);
-   event->key.hardware_keycode = key;
-   event->key.keyval = sym;
-+  clutter_event_set_device (event, core_device);
-   clutter_event_set_source_device (event, device);
- 
-   n = xkb_keysym_to_utf8 (sym, buffer, sizeof (buffer));
-diff --git a/clutter/tests/performance/test-common.h b/clutter/tests/performance/test-common.h
-index b0bed10..919fa74 100644
---- a/clutter/tests/performance/test-common.h
-+++ b/clutter/tests/performance/test-common.h
-@@ -92,9 +92,9 @@ static gboolean perf_fake_mouse_cb (gpointer stage)
-       event2->crossing.source = stage;
-       event2->crossing.x = 10;
-       event2->crossing.y = 10;
--      event2->crossing.device = device;
-       event2->crossing.related = NULL;
- 
-+      clutter_event_set_device (event2, device);
-       clutter_input_device_update_from_event (device, event2, TRUE);
- 
-       clutter_event_put (event2);
-@@ -104,7 +104,7 @@ static gboolean perf_fake_mouse_cb (gpointer stage)
- 
-   clutter_actor_get_size (stage, &w, &h);
-   event->motion.stage = stage;
--  event->motion.device = device;
-+  clutter_event_set_device (event, device);
- 
-   /* called about every 60fps, and do 10 picks per stage */
-   for (i = 0; i < 10; i++)
--- 
-2.19.2
-
diff --git a/SOURCES/0001-clutter-x11-Implement-keycode-lookup-from-keysyms-on.patch b/SOURCES/0001-clutter-x11-Implement-keycode-lookup-from-keysyms-on.patch
deleted file mode 100644
index 89cf4ed..0000000
--- a/SOURCES/0001-clutter-x11-Implement-keycode-lookup-from-keysyms-on.patch
+++ /dev/null
@@ -1,317 +0,0 @@
-From 5b0bb0715f0b3b4aa8874d23dcfe4172b0742f25 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Fri, 29 Jun 2018 14:31:23 +0200
-Subject: [PATCH] clutter/x11: Implement keycode lookup from keysyms on virtual
- key devices
-
-Unfortunately XKeysymToKeycode() falls short in that it coalesces keysyms
-into keycodes pertaining to the first level (i.e. lowercase). Add a
-ClutterKeymapX11 method (much alike its GdkKeymap counterpart) to look up
-all matches for the given keysym.
-
-Two other helper methods have been added so the virtual device can fetch
-the current keyboard group, and latch modifiers for key emission. Combining
-all this, the virtual device is now able to handle keycodes in further
-levels.
-
-Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/135
-
-(cherry picked from commit 85284acb000ddc70afcf716b6c198b4b5bf5741e)
----
- clutter/clutter/x11/clutter-keymap-x11.c      | 178 +++++++++++++++++-
- clutter/clutter/x11/clutter-keymap-x11.h      |   8 +
- .../x11/clutter-virtual-input-device-x11.c    |  22 ++-
- 3 files changed, 204 insertions(+), 4 deletions(-)
-
-diff --git a/clutter/clutter/x11/clutter-keymap-x11.c b/clutter/clutter/x11/clutter-keymap-x11.c
-index 914e31434..c34e676a4 100644
---- a/clutter/clutter/x11/clutter-keymap-x11.c
-+++ b/clutter/clutter/x11/clutter-keymap-x11.c
-@@ -38,6 +38,14 @@
- 
- typedef struct _ClutterKeymapX11Class   ClutterKeymapX11Class;
- typedef struct _DirectionCacheEntry     DirectionCacheEntry;
-+typedef struct _ClutterKeymapKey        ClutterKeymapKey;
-+
-+struct _ClutterKeymapKey
-+{
-+  guint keycode;
-+  guint group;
-+  guint level;
-+};
- 
- struct _DirectionCacheEntry
- {
-@@ -59,6 +67,7 @@ struct _ClutterKeymapX11
- 
-   ClutterModifierType num_lock_mask;
-   ClutterModifierType scroll_lock_mask;
-+  ClutterModifierType level3_shift_mask;
- 
-   PangoDirection current_direction;
- 
-@@ -69,6 +78,7 @@ struct _ClutterKeymapX11
-   Atom current_group_atom;
-   guint current_cache_serial;
-   DirectionCacheEntry group_direction_cache[4];
-+  int current_group;
- #endif
- 
-   guint caps_lock_state : 1;
-@@ -198,6 +208,9 @@ get_xkb (ClutterKeymapX11 *keymap_x11)
-   if (keymap_x11->scroll_lock_mask == 0)
-     keymap_x11->scroll_lock_mask = XkbKeysymToModifiers (backend_x11->xdpy,
-                                                          XK_Scroll_Lock);
-+  if (keymap_x11->level3_shift_mask == 0)
-+    keymap_x11->level3_shift_mask = XkbKeysymToModifiers (backend_x11->xdpy,
-+                                                          XK_ISO_Level3_Shift);
- 
-   return keymap_x11->xkb_desc;
- }
-@@ -469,6 +482,7 @@ static void
- clutter_keymap_x11_init (ClutterKeymapX11 *keymap)
- {
-   keymap->current_direction = PANGO_DIRECTION_NEUTRAL;
-+  keymap->current_group = -1;
- }
- 
- static ClutterTranslateReturn
-@@ -498,7 +512,8 @@ clutter_keymap_x11_translate_event (ClutterEventTranslator *translator,
-         {
-         case XkbStateNotify:
-           CLUTTER_NOTE (EVENT, "Updating keyboard state");
--          update_direction (keymap_x11, XkbStateGroup (&xkb_event->state));
-+          keymap_x11->current_group = XkbStateGroup (&xkb_event->state);
-+          update_direction (keymap_x11, keymap_x11->current_group);
-           update_locked_mods (keymap_x11, xkb_event->state.locked_mods);
-           retval = CLUTTER_TRANSLATE_REMOVE;
-           break;
-@@ -665,3 +680,164 @@ _clutter_keymap_x11_get_direction (ClutterKeymapX11 *keymap)
- #endif
-     return PANGO_DIRECTION_NEUTRAL;
- }
-+
-+static gboolean
-+clutter_keymap_x11_get_entries_for_keyval (ClutterKeymapX11  *keymap_x11,
-+                                           guint              keyval,
-+                                           ClutterKeymapKey **keys,
-+                                           gint              *n_keys)
-+{
-+#ifdef HAVE_XKB
-+  if (CLUTTER_BACKEND_X11 (keymap_x11->backend)->use_xkb)
-+    {
-+      XkbDescRec *xkb = get_xkb (keymap_x11);
-+      GArray *retval;
-+      gint keycode;
-+
-+      keycode = keymap_x11->min_keycode;
-+      retval = g_array_new (FALSE, FALSE, sizeof (ClutterKeymapKey));
-+
-+      while (keycode <= keymap_x11->max_keycode)
-+        {
-+          gint max_shift_levels = XkbKeyGroupsWidth (xkb, keycode);
-+          gint group = 0;
-+          gint level = 0;
-+          gint total_syms = XkbKeyNumSyms (xkb, keycode);
-+          gint i = 0;
-+          KeySym *entry;
-+
-+          /* entry is an array with all syms for group 0, all
-+           * syms for group 1, etc. and for each group the
-+           * shift level syms are in order
-+           */
-+          entry = XkbKeySymsPtr (xkb, keycode);
-+
-+          while (i < total_syms)
-+            {
-+              g_assert (i == (group * max_shift_levels + level));
-+
-+              if (entry[i] == keyval)
-+                {
-+                  ClutterKeymapKey key;
-+
-+                  key.keycode = keycode;
-+                  key.group = group;
-+                  key.level = level;
-+
-+                  g_array_append_val (retval, key);
-+
-+                  g_assert (XkbKeySymEntry (xkb, keycode, level, group) ==
-+                            keyval);
-+                }
-+
-+              ++level;
-+
-+              if (level == max_shift_levels)
-+                {
-+                  level = 0;
-+                  ++group;
-+                }
-+
-+              ++i;
-+            }
-+
-+          ++keycode;
-+        }
-+
-+      if (retval->len > 0)
-+        {
-+          *keys = (ClutterKeymapKey*) retval->data;
-+          *n_keys = retval->len;
-+        }
-+      else
-+        {
-+          *keys = NULL;
-+          *n_keys = 0;
-+        }
-+
-+      g_array_free (retval, retval->len > 0 ? FALSE : TRUE);
-+
-+      return *n_keys > 0;
-+    }
-+  else
-+#endif
-+    {
-+      return FALSE;
-+    }
-+}
-+
-+void
-+clutter_keymap_x11_latch_modifiers (ClutterKeymapX11 *keymap_x11,
-+                                    uint32_t          level,
-+                                    gboolean          enable)
-+{
-+#ifdef HAVE_XKB
-+  ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (keymap_x11->backend);
-+  uint32_t modifiers[] = {
-+    0,
-+    ShiftMask,
-+    keymap_x11->level3_shift_mask,
-+    keymap_x11->level3_shift_mask | ShiftMask,
-+  };
-+  uint32_t value = 0;
-+
-+  if (!backend_x11->use_xkb)
-+    return;
-+
-+  level = CLAMP (level, 0, G_N_ELEMENTS (modifiers) - 1);
-+
-+  if (enable)
-+    value = modifiers[level];
-+  else
-+    value = 0;
-+
-+  XkbLatchModifiers (clutter_x11_get_default_display (),
-+                     XkbUseCoreKbd, modifiers[level],
-+                     value);
-+#endif
-+}
-+
-+static uint32_t
-+clutter_keymap_x11_get_current_group (ClutterKeymapX11 *keymap_x11)
-+{
-+  ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (keymap_x11->backend);
-+  XkbStateRec state_rec;
-+
-+  if (keymap_x11->current_group >= 0)
-+    return keymap_x11->current_group;
-+
-+  XkbGetState (backend_x11->xdpy, XkbUseCoreKbd, &state_rec);
-+  return XkbStateGroup (&state_rec);
-+}
-+
-+gboolean
-+clutter_keymap_x11_keycode_for_keyval (ClutterKeymapX11 *keymap_x11,
-+                                       guint             keyval,
-+                                       guint            *keycode_out,
-+                                       guint            *level_out)
-+{
-+  ClutterKeymapKey *keys;
-+  gint i, n_keys, group;
-+  gboolean found = FALSE;
-+
-+  g_return_val_if_fail (keycode_out != NULL, FALSE);
-+  g_return_val_if_fail (level_out != NULL, FALSE);
-+
-+  group = clutter_keymap_x11_get_current_group (keymap_x11);
-+
-+  if (!clutter_keymap_x11_get_entries_for_keyval (keymap_x11, keyval, &keys, &n_keys))
-+    return FALSE;
-+
-+  for (i = 0; i < n_keys && !found; i++)
-+    {
-+      if (keys[i].group == group)
-+        {
-+          *keycode_out = keys[i].keycode;
-+          *level_out = keys[i].level;
-+          found = TRUE;
-+        }
-+    }
-+
-+  g_free (keys);
-+  return found;
-+}
-diff --git a/clutter/clutter/x11/clutter-keymap-x11.h b/clutter/clutter/x11/clutter-keymap-x11.h
-index ad673a2a7..4b5b403c8 100644
---- a/clutter/clutter/x11/clutter-keymap-x11.h
-+++ b/clutter/clutter/x11/clutter-keymap-x11.h
-@@ -51,6 +51,14 @@ gboolean _clutter_keymap_x11_get_is_modifier     (ClutterKeymapX11    *keymap,
- 
- PangoDirection _clutter_keymap_x11_get_direction (ClutterKeymapX11    *keymap);
- 
-+gboolean clutter_keymap_x11_keycode_for_keyval (ClutterKeymapX11 *keymap_x11,
-+                                                guint             keyval,
-+                                                guint            *keycode_out,
-+                                                guint            *level_out);
-+void     clutter_keymap_x11_latch_modifiers (ClutterKeymapX11 *keymap_x11,
-+                                             uint32_t          level,
-+                                             gboolean          enable);
-+
- G_END_DECLS
- 
- #endif /* __CLUTTER_KEYMAP_X11_H__ */
-diff --git a/clutter/clutter/x11/clutter-virtual-input-device-x11.c b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-index 416c944b3..b86ded0d0 100644
---- a/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-+++ b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
-@@ -32,6 +32,8 @@
- 
- #include "clutter-virtual-input-device.h"
- #include "x11/clutter-virtual-input-device-x11.h"
-+#include "x11/clutter-backend-x11.h"
-+#include "x11/clutter-keymap-x11.h"
- 
- struct _ClutterVirtualInputDeviceX11
- {
-@@ -135,11 +137,25 @@ clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtu
- 						uint32_t                   keyval,
- 						ClutterKeyState            key_state)
- {
--  KeyCode keycode;
-+  ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
-+  ClutterKeymapX11 *keymap = backend_x11->keymap;
-+  uint32_t keycode, level;
-+
-+  if (!clutter_keymap_x11_keycode_for_keyval (keymap, keyval, &keycode, &level))
-+    {
-+      g_warning ("No keycode found for keyval %x in current group", keyval);
-+      return;
-+    }
-+
-+  if (key_state == CLUTTER_KEY_STATE_PRESSED)
-+    clutter_keymap_x11_latch_modifiers (keymap, level, TRUE);
- 
--  keycode = XKeysymToKeycode (clutter_x11_get_default_display (), keyval);
-   XTestFakeKeyEvent (clutter_x11_get_default_display (),
--                     keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
-+                     (KeyCode) keycode,
-+                     key_state == CLUTTER_KEY_STATE_PRESSED, 0);
-+
-+  if (key_state == CLUTTER_KEY_STATE_RELEASED)
-+    clutter_keymap_x11_latch_modifiers (keymap, level, FALSE);
- }
- 
- static void
--- 
-2.20.1
-
diff --git a/SOURCES/0001-cogl-add-new-UNSTABLE_TEXTURES-feature.patch b/SOURCES/0001-cogl-add-new-UNSTABLE_TEXTURES-feature.patch
index 9a60c8a..673608d 100644
--- a/SOURCES/0001-cogl-add-new-UNSTABLE_TEXTURES-feature.patch
+++ b/SOURCES/0001-cogl-add-new-UNSTABLE_TEXTURES-feature.patch
@@ -1,4 +1,4 @@
-From bac385833fddb5dadb3be1eaf7b6071991c4b048 Mon Sep 17 00:00:00 2001
+From 78bb1fff1155462638b0d6037ccddf1328482842 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Tue, 15 Jan 2019 11:01:38 -0500
 Subject: [PATCH 1/9] cogl: add new UNSTABLE_TEXTURES feature
@@ -17,37 +17,10 @@ the proprietary nvidia driver is in use.
  4 files changed, 27 insertions(+), 3 deletions(-)
 
 diff --git a/cogl/cogl/cogl-context.h b/cogl/cogl/cogl-context.h
-index add575b49..985ce336d 100644
+index d4104625e..a20c54549 100644
 --- a/cogl/cogl/cogl-context.h
 +++ b/cogl/cogl/cogl-context.h
-@@ -236,60 +236,61 @@ cogl_is_context (void *object);
-  * Since: 1.10
-  */
- typedef enum _CoglFeatureID
- {
-   COGL_FEATURE_ID_TEXTURE_NPOT_BASIC = 1,
-   COGL_FEATURE_ID_TEXTURE_NPOT_MIPMAP,
-   COGL_FEATURE_ID_TEXTURE_NPOT_REPEAT,
-   COGL_FEATURE_ID_TEXTURE_NPOT,
-   COGL_FEATURE_ID_TEXTURE_RECTANGLE,
-   COGL_FEATURE_ID_TEXTURE_3D,
-   COGL_FEATURE_ID_GLSL,
-   COGL_FEATURE_ID_ARBFP,
-   COGL_FEATURE_ID_OFFSCREEN,
-   COGL_FEATURE_ID_OFFSCREEN_MULTISAMPLE,
-   COGL_FEATURE_ID_ONSCREEN_MULTIPLE,
-   COGL_FEATURE_ID_UNSIGNED_INT_INDICES,
-   COGL_FEATURE_ID_DEPTH_RANGE,
-   COGL_FEATURE_ID_POINT_SPRITE,
-   COGL_FEATURE_ID_MAP_BUFFER_FOR_READ,
-   COGL_FEATURE_ID_MAP_BUFFER_FOR_WRITE,
-   COGL_FEATURE_ID_MIRRORED_REPEAT,
-   COGL_FEATURE_ID_SWAP_BUFFERS_EVENT,
-   COGL_FEATURE_ID_GLES2_CONTEXT,
-   COGL_FEATURE_ID_DEPTH_TEXTURE,
-   COGL_FEATURE_ID_PRESENTATION_TIME,
-   COGL_FEATURE_ID_FENCE,
-   COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
+@@ -261,6 +261,7 @@ typedef enum _CoglFeatureID
    COGL_FEATURE_ID_TEXTURE_RG,
    COGL_FEATURE_ID_BUFFER_AGE,
    COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
@@ -55,65 +28,11 @@ index add575b49..985ce336d 100644
  
    /*< private >*/
    _COGL_N_FEATURE_IDS   /*< skip >*/
- } CoglFeatureID;
- 
- 
- /**
-  * cogl_has_feature:
-  * @context: A #CoglContext pointer
-  * @feature: A #CoglFeatureID
-  *
-  * Checks if a given @feature is currently available
-  *
-  * Cogl does not aim to be a lowest common denominator API, it aims to
-  * expose all the interesting features of GPUs to application which
-  * means applications have some responsibility to explicitly check
-  * that certain features are available before depending on them.
-  *
-  * Returns: %TRUE if the @feature is currently supported or %FALSE if
-  * not.
-  *
-  * Since: 1.10
-  * Stability: unstable
-  */
- CoglBool
- cogl_has_feature (CoglContext *context, CoglFeatureID feature);
- 
- /**
-  * cogl_has_features:
-  * @context: A #CoglContext pointer
 diff --git a/cogl/cogl/cogl-types.h b/cogl/cogl/cogl-types.h
-index f67895dd9..8338e284d 100644
+index 690daa16a..5b980a43c 100644
 --- a/cogl/cogl/cogl-types.h
 +++ b/cogl/cogl/cogl-types.h
-@@ -371,91 +371,94 @@ typedef enum { /*< prefix=COGL_PIXEL_FORMAT >*/
-  * @COGL_FEATURE_OFFSCREEN_MULTISAMPLE: Multisample support on FBOs
-  * @COGL_FEATURE_OFFSCREEN_BLIT: Blit support on FBOs
-  * @COGL_FEATURE_FOUR_CLIP_PLANES: At least 4 clip planes available
-  * @COGL_FEATURE_STENCIL_BUFFER: Stencil buffer support
-  * @COGL_FEATURE_VBOS: VBO support
-  * @COGL_FEATURE_PBOS: PBO support
-  * @COGL_FEATURE_UNSIGNED_INT_INDICES: Set if
-  *     %COGL_INDICES_TYPE_UNSIGNED_INT is supported in
-  *     cogl_vertex_buffer_indices_new().
-  * @COGL_FEATURE_DEPTH_RANGE: cogl_material_set_depth_range() support
-  * @COGL_FEATURE_TEXTURE_NPOT_BASIC: The hardware supports non power
-  *     of two textures, but you also need to check the
-  *     %COGL_FEATURE_TEXTURE_NPOT_MIPMAP and %COGL_FEATURE_TEXTURE_NPOT_REPEAT
-  *     features to know if the hardware supports npot texture mipmaps
-  *     or repeat modes other than
-  *     %COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE respectively.
-  * @COGL_FEATURE_TEXTURE_NPOT_MIPMAP: Mipmapping is supported in
-  *     conjuntion with non power of two textures.
-  * @COGL_FEATURE_TEXTURE_NPOT_REPEAT: Repeat modes other than
-  *     %COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE are supported by the
-  *     hardware.
-  * @COGL_FEATURE_POINT_SPRITE: Whether
-  *     cogl_material_set_layer_point_sprite_coords_enabled() is supported.
-  * @COGL_FEATURE_TEXTURE_3D: 3D texture support
-  * @COGL_FEATURE_MAP_BUFFER_FOR_READ: Whether cogl_buffer_map() is
-  *     supported with CoglBufferAccess including read support.
-  * @COGL_FEATURE_MAP_BUFFER_FOR_WRITE: Whether cogl_buffer_map() is
+@@ -354,6 +354,8 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/
   *     supported with CoglBufferAccess including write support.
   * @COGL_FEATURE_DEPTH_TEXTURE: Whether #CoglFramebuffer support rendering the
   *     depth buffer to a texture.
@@ -122,30 +41,7 @@ index f67895dd9..8338e284d 100644
   *
   * Flags for the supported features.
   *
-  * Since: 0.8
-  */
- typedef enum
- {
-   COGL_FEATURE_TEXTURE_RECTANGLE      = (1 << 1),
-   COGL_FEATURE_TEXTURE_NPOT           = (1 << 2),
-   COGL_FEATURE_TEXTURE_YUV            = (1 << 3),
-   COGL_FEATURE_TEXTURE_READ_PIXELS    = (1 << 4),
-   COGL_FEATURE_SHADERS_GLSL           = (1 << 5),
-   COGL_FEATURE_OFFSCREEN              = (1 << 6),
-   COGL_FEATURE_OFFSCREEN_MULTISAMPLE  = (1 << 7),
-   COGL_FEATURE_OFFSCREEN_BLIT         = (1 << 8),
-   COGL_FEATURE_FOUR_CLIP_PLANES       = (1 << 9),
-   COGL_FEATURE_STENCIL_BUFFER         = (1 << 10),
-   COGL_FEATURE_VBOS		      = (1 << 11),
-   COGL_FEATURE_PBOS		      = (1 << 12),
-   COGL_FEATURE_UNSIGNED_INT_INDICES   = (1 << 13),
-   COGL_FEATURE_DEPTH_RANGE            = (1 << 14),
-   COGL_FEATURE_TEXTURE_NPOT_BASIC     = (1 << 15),
-   COGL_FEATURE_TEXTURE_NPOT_MIPMAP    = (1 << 16),
-   COGL_FEATURE_TEXTURE_NPOT_REPEAT    = (1 << 17),
-   COGL_FEATURE_POINT_SPRITE           = (1 << 18),
-   COGL_FEATURE_TEXTURE_3D             = (1 << 19),
-   COGL_FEATURE_SHADERS_ARBFP          = (1 << 20),
+@@ -383,7 +385,8 @@ typedef enum
    COGL_FEATURE_MAP_BUFFER_FOR_READ    = (1 << 21),
    COGL_FEATURE_MAP_BUFFER_FOR_WRITE   = (1 << 22),
    COGL_FEATURE_ONSCREEN_MULTIPLE      = (1 << 23),
@@ -155,65 +51,11 @@ index f67895dd9..8338e284d 100644
  } CoglFeatureFlags;
  
  /**
-  * CoglBufferTarget:
-  * @COGL_WINDOW_BUFFER: FIXME
-  * @COGL_OFFSCREEN_BUFFER: FIXME
-  *
-  * Target flags for FBOs.
-  *
-  * Since: 0.8
-  */
- typedef enum
- {
-   COGL_WINDOW_BUFFER      = (1 << 1),
-   COGL_OFFSCREEN_BUFFER   = (1 << 2)
- } CoglBufferTarget;
- 
- /**
-  * CoglColor:
-  * @red: amount of red
-  * @green: amount of green
-  * @blue: amount of green
-  * @alpha: alpha
-  *
-  * A structure for holding a color definition. The contents of
-  * the CoglColor structure are private and should never by accessed
-  * directly.
-  *
-  * Since: 1.0
-  */
 diff --git a/cogl/cogl/winsys/cogl-winsys-egl.c b/cogl/cogl/winsys/cogl-winsys-egl.c
-index 73648f663..66c2661b3 100644
+index 903c6492d..dd450d4f3 100644
 --- a/cogl/cogl/winsys/cogl-winsys-egl.c
 +++ b/cogl/cogl/winsys/cogl-winsys-egl.c
-@@ -475,72 +475,83 @@ _cogl_winsys_display_setup (CoglDisplay *display,
-       CoglRendererEGL *egl_renderer = display->renderer->winsys;
- 
-       if (egl_renderer->pf_eglBindWaylandDisplay)
- 	egl_renderer->pf_eglBindWaylandDisplay (egl_renderer->edpy,
- 						wayland_display);
-     }
- #endif
- 
-   if (egl_renderer->platform_vtable->display_setup &&
-       !egl_renderer->platform_vtable->display_setup (display, error))
-     goto error;
- 
-   if (!try_create_context (display, error))
-     goto error;
- 
-   egl_display->found_egl_config = TRUE;
- 
-   return TRUE;
- 
- error:
-   _cogl_winsys_display_destroy (display);
-   return FALSE;
- }
- 
- static CoglBool
- _cogl_winsys_context_init (CoglContext *context, CoglError **error)
- {
+@@ -499,6 +499,7 @@ _cogl_winsys_context_init (CoglContext *context, CoglError **error)
    CoglRenderer *renderer = context->display->renderer;
    CoglDisplayEGL *egl_display = context->display->winsys;
    CoglRendererEGL *egl_renderer = renderer->winsys;
@@ -221,12 +63,7 @@ index 73648f663..66c2661b3 100644
  
    context->winsys = g_new0 (CoglContextEGL, 1);
  
-   _COGL_RETURN_VAL_IF_FAIL (egl_display->egl_context, FALSE);
- 
-   memset (context->winsys_features, 0, sizeof (context->winsys_features));
- 
-   check_egl_extensions (renderer);
- 
+@@ -511,6 +512,16 @@ _cogl_winsys_context_init (CoglContext *context, CoglError **error)
    if (!_cogl_context_update_features (context, error))
      return FALSE;
  
@@ -243,65 +80,11 @@ index 73648f663..66c2661b3 100644
    if (egl_renderer->private_features & COGL_EGL_WINSYS_FEATURE_SWAP_REGION)
      {
        COGL_FLAGS_SET (context->winsys_features,
-                       COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
-       COGL_FLAGS_SET (context->winsys_features,
-                       COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
-     }
- 
-   if ((egl_renderer->private_features & COGL_EGL_WINSYS_FEATURE_FENCE_SYNC) &&
-       _cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_OES_EGL_SYNC))
-     COGL_FLAGS_SET (context->features, COGL_FEATURE_ID_FENCE, TRUE);
- 
-   if (egl_renderer->private_features & COGL_EGL_WINSYS_FEATURE_BUFFER_AGE)
-     {
-       COGL_FLAGS_SET (context->winsys_features,
-                       COGL_WINSYS_FEATURE_BUFFER_AGE,
-                       TRUE);
-       COGL_FLAGS_SET (context->features, COGL_FEATURE_ID_BUFFER_AGE, TRUE);
-     }
- 
-   /* NB: We currently only support creating standalone GLES2 contexts
-    * for offscreen rendering and so we need a dummy (non-visible)
-    * surface to be able to bind those contexts */
-   if (egl_display->dummy_surface != EGL_NO_SURFACE &&
-       context->driver == COGL_DRIVER_GLES2)
-     COGL_FLAGS_SET (context->features,
-                     COGL_FEATURE_ID_GLES2_CONTEXT, TRUE);
- 
-   if (egl_renderer->platform_vtable->context_init &&
-       !egl_renderer->platform_vtable->context_init (context, error))
 diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c
-index 74b0895d1..4a033c0c6 100644
+index 235cfe81f..7e87dc15f 100644
 --- a/cogl/cogl/winsys/cogl-winsys-glx.c
 +++ b/cogl/cogl/winsys/cogl-winsys-glx.c
-@@ -805,149 +805,158 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
-   /* XXX: Note: For a long time Mesa exported a hybrid GLX, exporting
-    * extensions specified to require GLX 1.3, but still reporting 1.2
-    * via glXQueryVersion. */
-   if (!glx_renderer->glXQueryVersion (xlib_renderer->xdpy,
-                                       &glx_renderer->glx_major,
-                                       &glx_renderer->glx_minor)
-       || !(glx_renderer->glx_major == 1 && glx_renderer->glx_minor >= 2))
-     {
-       _cogl_set_error (error, COGL_WINSYS_ERROR,
-                    COGL_WINSYS_ERROR_INIT,
-                    "XServer appears to lack required GLX 1.2 support");
-       goto error;
-     }
- 
-   update_base_winsys_features (renderer);
- 
-   glx_renderer->dri_fd = -1;
- 
-   return TRUE;
- 
- error:
-   _cogl_winsys_renderer_disconnect (renderer);
-   return FALSE;
- }
- 
- static CoglBool
- update_winsys_features (CoglContext *context, CoglError **error)
+@@ -830,12 +830,15 @@ update_winsys_features (CoglContext *context, CoglError **error)
  {
    CoglGLXDisplay *glx_display = context->display->winsys;
    CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
@@ -317,12 +100,7 @@ index 74b0895d1..4a033c0c6 100644
    memcpy (context->winsys_features,
            glx_renderer->base_winsys_features,
            sizeof (context->winsys_features));
- 
-   context->feature_flags |= glx_renderer->legacy_feature_flags;
- 
-   context->feature_flags |= COGL_FEATURE_ONSCREEN_MULTIPLE;
-   COGL_FLAGS_SET (context->features,
-                   COGL_FEATURE_ID_ONSCREEN_MULTIPLE, TRUE);
+@@ -848,7 +851,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
  
    if (glx_renderer->glXCopySubBuffer || context->glBlitFramebuffer)
      {
@@ -330,48 +108,7 @@ index 74b0895d1..4a033c0c6 100644
        CoglGpuInfoArchitecture arch = info->architecture;
  
        COGL_FLAGS_SET (context->winsys_features, COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
- 
-       /*
-        * "The "drisw" binding in Mesa for loading sofware renderers is
-        * broken, and neither glBlitFramebuffer nor glXCopySubBuffer
-        * work correctly."
-        * - ajax
-        * - https://bugzilla.gnome.org/show_bug.cgi?id=674208
-        *
-        * This is broken in software Mesa at least as of 7.10 and got
-        * fixed in Mesa 10.1
-        */
- 
-       if (info->driver_package == COGL_GPU_INFO_DRIVER_PACKAGE_MESA &&
-           info->driver_package_version < COGL_VERSION_ENCODE (10, 1, 0) &&
-           (arch == COGL_GPU_INFO_ARCHITECTURE_LLVMPIPE ||
-            arch == COGL_GPU_INFO_ARCHITECTURE_SOFTPIPE ||
-            arch == COGL_GPU_INFO_ARCHITECTURE_SWRAST))
- 	{
- 	  COGL_FLAGS_SET (context->winsys_features,
- 			  COGL_WINSYS_FEATURE_SWAP_REGION, FALSE);
- 	}
-     }
- 
-   /* Note: glXCopySubBuffer and glBlitFramebuffer won't be throttled
-    * by the SwapInterval so we have to throttle swap_region requests
-    * manually... */
-   if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION) &&
-       (glx_display->have_vblank_counter || glx_display->can_vblank_wait))
-     COGL_FLAGS_SET (context->winsys_features,
-                     COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
- 
-   if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT))
-     {
-       COGL_FLAGS_SET (context->winsys_features,
- 		      COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT, TRUE);
-       /* TODO: remove this deprecated feature */
-       COGL_FLAGS_SET (context->features,
-                       COGL_FEATURE_ID_SWAP_BUFFERS_EVENT,
-                       TRUE);
-       COGL_FLAGS_SET (context->features,
-                       COGL_FEATURE_ID_PRESENTATION_TIME,
-                       TRUE);
+@@ -897,7 +899,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
      }
    else
      {
@@ -379,21 +116,7 @@ index 74b0895d1..4a033c0c6 100644
        if (glx_display->have_vblank_counter &&
  	  context->display->renderer->xlib_enable_threaded_swap_wait &&
  	  info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA)
-         {
-           COGL_FLAGS_SET (context->winsys_features,
-                           COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT, TRUE);
-           COGL_FLAGS_SET (context->winsys_features,
-                           COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT, TRUE);
-           /* TODO: remove this deprecated feature */
-           COGL_FLAGS_SET (context->features,
-                           COGL_FEATURE_ID_SWAP_BUFFERS_EVENT,
-                           TRUE);
-           COGL_FLAGS_SET (context->features,
-                           COGL_FEATURE_ID_PRESENTATION_TIME,
-                           TRUE);
-           COGL_FLAGS_SET (context->private_features,
-                           COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT,
-                           TRUE);
+@@ -919,6 +920,14 @@ update_winsys_features (CoglContext *context, CoglError **error)
          }
      }
  
@@ -408,33 +131,6 @@ index 74b0895d1..4a033c0c6 100644
    /* We'll manually handle queueing dirty events in response to
     * Expose events from X */
    COGL_FLAGS_SET (context->private_features,
-                   COGL_PRIVATE_FEATURE_DIRTY_EVENTS,
-                   TRUE);
- 
-   if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE))
-     COGL_FLAGS_SET (context->features, COGL_FEATURE_ID_BUFFER_AGE, TRUE);
- 
-   return TRUE;
- }
- 
- static void
- glx_attributes_from_framebuffer_config (CoglDisplay *display,
-                                         CoglFramebufferConfig *config,
-                                         int *attributes)
- {
-   CoglGLXRenderer *glx_renderer = display->renderer->winsys;
-   int i = 0;
- 
-   attributes[i++] = GLX_DRAWABLE_TYPE;
-   attributes[i++] = GLX_WINDOW_BIT;
- 
-   attributes[i++] = GLX_RENDER_TYPE;
-   attributes[i++] = GLX_RGBA_BIT;
- 
-   attributes[i++] = GLX_DOUBLEBUFFER;
-   attributes[i++] = GL_TRUE;
- 
-   attributes[i++] = GLX_RED_SIZE;
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0001-enum-types-Use-basename-in-header-comment.patch b/SOURCES/0001-enum-types-Use-basename-in-header-comment.patch
new file mode 100644
index 0000000..88b3a4f
--- /dev/null
+++ b/SOURCES/0001-enum-types-Use-basename-in-header-comment.patch
@@ -0,0 +1,55 @@
+From 62387eb649b7b33d923d5382f85c9210a3bedbe8 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Thu, 30 May 2019 16:32:35 +0200
+Subject: [PATCH] enum-types: Use @basename@ in header comment
+
+@filename@ may contain arch-specific bits that introduce unnecessary
+multi-lib issues.
+---
+ clutter/clutter/clutter-enum-types.h.in  | 2 +-
+ cogl/cogl-path/cogl-path-enum-types.h.in | 2 +-
+ src/meta/meta-enum-types.h.in            | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/clutter/clutter/clutter-enum-types.h.in b/clutter/clutter/clutter-enum-types.h.in
+index 2e5b6707e..17f9ee644 100644
+--- a/clutter/clutter/clutter-enum-types.h.in
++++ b/clutter/clutter/clutter-enum-types.h.in
+@@ -13,7 +13,7 @@ G_BEGIN_DECLS
+ /*** END file-header ***/
+ 
+ /*** BEGIN file-production ***/
+-/* enumerations from "@filename@" */
++/* enumerations from "@basename@" */
+ /*** END file-production ***/
+ 
+ /*** BEGIN value-header ***/
+diff --git a/cogl/cogl-path/cogl-path-enum-types.h.in b/cogl/cogl-path/cogl-path-enum-types.h.in
+index 071686acd..2b377ed18 100644
+--- a/cogl/cogl-path/cogl-path-enum-types.h.in
++++ b/cogl/cogl-path/cogl-path-enum-types.h.in
+@@ -9,7 +9,7 @@ G_BEGIN_DECLS
+ /*** END file-header ***/
+ 
+ /*** BEGIN file-production ***/
+-/* enumerations from "@filename@" */
++/* enumerations from "@basename@" */
+ /*** END file-production ***/
+ 
+ /*** BEGIN file-tail ***/
+diff --git a/src/meta/meta-enum-types.h.in b/src/meta/meta-enum-types.h.in
+index 6e3b67b26..bee0196de 100644
+--- a/src/meta/meta-enum-types.h.in
++++ b/src/meta/meta-enum-types.h.in
+@@ -10,7 +10,7 @@ G_BEGIN_DECLS
+ /*** END file-header ***/
+ 
+ /*** BEGIN file-production ***/
+-/* enumerations from "@filename@" */
++/* enumerations from "@basename@" */
+ /*** END file-production ***/
+ 
+ /*** BEGIN file-tail ***/
+-- 
+2.21.0
+
diff --git a/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch b/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch
index 190d471..69fc6ef 100644
--- a/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch
+++ b/SOURCES/0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch
@@ -1,4 +1,4 @@
-From fc8acff3338364e8ace9558924c762a7a59d8450 Mon Sep 17 00:00:00 2001
+From f735f345ad8390a7fb09ef54ca3e0e419d395d1b Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
 Date: Thu, 21 Jul 2016 15:43:12 +0200
 Subject: [PATCH] events: Don't move (sloppy) focus while buttons are pressed
@@ -9,10 +9,10 @@ Subject: [PATCH] events: Don't move (sloppy) focus while buttons are pressed
  1 file changed, 11 insertions(+)
 
 diff --git a/src/x11/events.c b/src/x11/events.c
-index f60f650a6..291b7114a 100644
+index e363fdbb6..905b5bf9d 100644
 --- a/src/x11/events.c
 +++ b/src/x11/events.c
-@@ -830,6 +830,16 @@ crossing_serial_is_ignored (MetaDisplay  *display,
+@@ -832,6 +832,16 @@ crossing_serial_is_ignored (MetaX11Display *x11_display,
    return FALSE;
  }
  
@@ -27,16 +27,16 @@ index f60f650a6..291b7114a 100644
 +}
 +
  static gboolean
- handle_input_xevent (MetaDisplay  *display,
-                      XIEvent      *input_event,
-@@ -871,6 +881,7 @@ handle_input_xevent (MetaDisplay  *display,
+ handle_input_xevent (MetaX11Display *x11_display,
+                      XIEvent        *input_event,
+@@ -876,6 +886,7 @@ handle_input_xevent (MetaX11Display *x11_display,
         * avoid races.
         */
-       if (window && !crossing_serial_is_ignored (display, serial) &&
+       if (window && !crossing_serial_is_ignored (x11_display, serial) &&
 +          !event_has_button_mask (enter_event) &&
            enter_event->mode != XINotifyGrab &&
            enter_event->mode != XINotifyUngrab &&
            enter_event->detail != XINotifyInferior &&
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-gpu-kms-Don-t-crash-if-drmModeGetResources-returns-N.patch b/SOURCES/0001-gpu-kms-Don-t-crash-if-drmModeGetResources-returns-N.patch
deleted file mode 100644
index 6350f55..0000000
--- a/SOURCES/0001-gpu-kms-Don-t-crash-if-drmModeGetResources-returns-N.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 62660bbd1526c6135d149df397b2470c6e71969d Mon Sep 17 00:00:00 2001
-From: Aaron Plattner <aplattner@nvidia.com>
-Date: Thu, 19 Jul 2018 10:51:34 -0700
-Subject: [PATCH] gpu-kms: Don't crash if drmModeGetResources returns NULL
-
-DRM drivers can be opened by meta_launcher_open_restricted() even if they don't
-implement modesetting. However, drmModeGetResources() will return NULL.
-
-Check whether that happened in meta_gpu_kms_new() and return with an error
-instead of crashing.
-
-Fixes #223.
----
- src/backends/native/meta-gpu-kms.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index 613a60705..259cd7122 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -801,6 +801,13 @@ meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
-    */
-   drm_resources = drmModeGetResources (kms_fd);
- 
-+  if (!drm_resources)
-+    {
-+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "No resources");
-+      meta_launcher_close_restricted (launcher, kms_fd);
-+      return NULL;
-+    }
-+
-   n_connectors = drm_resources->count_connectors;
- 
-   drmModeFreeResources (drm_resources);
--- 
-2.19.0
-
diff --git a/SOURCES/0001-gpu-kms-Handle-drmModeGetResources-failing.patch b/SOURCES/0001-gpu-kms-Handle-drmModeGetResources-failing.patch
deleted file mode 100644
index 91b6ff5..0000000
--- a/SOURCES/0001-gpu-kms-Handle-drmModeGetResources-failing.patch
+++ /dev/null
@@ -1,99 +0,0 @@
-From 255146e4a3d16c74390f8fdd6cae46b5d0d59ad5 Mon Sep 17 00:00:00 2001
-From: Iain Lane <iainl@gnome.org>
-Date: Fri, 10 Aug 2018 09:46:51 +0000
-Subject: [PATCH 1/2] gpu-kms: Handle drmModeGetResources() failing
-
-Avoid dereferencing the NULL return value if it fails. We still create
-the MetaGpu, but we treat it as if it has no outputs.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/223
-
-
-(cherry picked from commit 29cc526e2eab65d856d1fd0a652f22dcdb5d72dd)
----
- src/backends/native/meta-gpu-kms.c | 36 +++++++++++++++++++++++++-----
- 1 file changed, 31 insertions(+), 5 deletions(-)
-
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index 1d1c28809..7e7607c46 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -62,6 +62,8 @@ struct _MetaGpuKms
-   int max_buffer_height;
- 
-   gboolean page_flips_not_supported;
-+
-+  gboolean resources_init_failed_before;
- };
- 
- G_DEFINE_QUARK (MetaGpuKmsError, meta_gpu_kms_error)
-@@ -709,20 +711,34 @@ init_outputs (MetaGpuKms       *gpu_kms,
-   setup_output_clones (gpu);
- }
- 
--static void
--meta_kms_resources_init (MetaKmsResources *resources,
--                         int               fd)
-+static gboolean
-+meta_kms_resources_init (MetaKmsResources  *resources,
-+                         int                fd,
-+                         GError           **error)
-+
- {
-   drmModeRes *drm_resources;
-   unsigned int i;
- 
-   drm_resources = drmModeGetResources (fd);
-+
-+  if (!drm_resources)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_FAILED,
-+                   "Calling drmModeGetResources() failed");
-+      return FALSE;
-+    }
-+
-   resources->resources = drm_resources;
- 
-   resources->n_encoders = (unsigned int) drm_resources->count_encoders;
-   resources->encoders = g_new (drmModeEncoder *, resources->n_encoders);
-   for (i = 0; i < resources->n_encoders; i++)
-     resources->encoders[i] = drmModeGetEncoder (fd, drm_resources->encoders[i]);
-+
-+  return TRUE;
- }
- 
- static void
-@@ -734,7 +750,7 @@ meta_kms_resources_release (MetaKmsResources *resources)
-     drmModeFreeEncoder (resources->encoders[i]);
-   g_free (resources->encoders);
- 
--  drmModeFreeResources (resources->resources);
-+  g_clear_pointer (&resources->resources, drmModeFreeResources);
- }
- 
- static gboolean
-@@ -745,8 +761,18 @@ meta_gpu_kms_read_current (MetaGpu  *gpu,
-   MetaMonitorManager *monitor_manager =
-     meta_gpu_get_monitor_manager (gpu);
-   MetaKmsResources resources;
-+  g_autoptr (GError) local_error = NULL;
- 
--  meta_kms_resources_init (&resources, gpu_kms->fd);
-+  if (!meta_kms_resources_init (&resources, gpu_kms->fd, &local_error))
-+    {
-+      if (!gpu_kms->resources_init_failed_before)
-+        {
-+          g_warning ("meta_kms_resources_init failed: %s, assuming we have no outputs",
-+                     local_error->message);
-+          gpu_kms->resources_init_failed_before = TRUE;
-+        }
-+      return TRUE;
-+    }
- 
-   gpu_kms->max_buffer_width = resources.resources->max_width;
-   gpu_kms->max_buffer_height = resources.resources->max_height;
--- 
-2.19.0
-
diff --git a/SOURCES/0001-iconcache-Avoid-xrender-picture-formats-when-creatin.patch b/SOURCES/0001-iconcache-Avoid-xrender-picture-formats-when-creatin.patch
new file mode 100644
index 0000000..0ed0857
--- /dev/null
+++ b/SOURCES/0001-iconcache-Avoid-xrender-picture-formats-when-creatin.patch
@@ -0,0 +1,136 @@
+From 80f79e0cc7509b79b38193a006b0d98d03432044 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 5 Aug 2019 14:39:21 -0400
+Subject: [PATCH] iconcache: Avoid xrender picture formats when creating cairo
+ surface
+
+If an application provides its window icon via wmhints, then mutter
+loads the pixmap specified by the application into a cairo xlib surface. When
+creating the surface it specifies the visual, indirectly, via an XRender
+picture format.
+
+This is suboptimal, since XRender picture formats don't have a way to specify
+16bpp depth, which an application may be using.
+
+In particular, applications are likely to use 16bpp depth pixmaps for their
+icons, if the video card offers a 16bpp framebuffer/root window.
+
+This commit drops the XRender middleman, and just tells cairo a visual to use
+directly.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/715
+---
+ src/x11/iconcache.c | 31 ++++++-------------------------
+ 1 file changed, 6 insertions(+), 25 deletions(-)
+
+diff --git a/src/x11/iconcache.c b/src/x11/iconcache.c
+index 15d72da65..521c77b8d 100644
+--- a/src/x11/iconcache.c
++++ b/src/x11/iconcache.c
+@@ -261,97 +261,78 @@ get_pixmap_geometry (MetaX11Display *x11_display,
+                      Pixmap          pixmap,
+                      int            *w,
+                      int            *h,
+                      int            *d)
+ {
+   Window root_ignored;
+   int x_ignored, y_ignored;
+   guint width, height;
+   guint border_width_ignored;
+   guint depth;
+ 
+   if (w)
+     *w = 1;
+   if (h)
+     *h = 1;
+   if (d)
+     *d = 1;
+ 
+   XGetGeometry (x11_display->xdisplay,
+                 pixmap, &root_ignored, &x_ignored, &y_ignored,
+                 &width, &height, &border_width_ignored, &depth);
+ 
+   if (w)
+     *w = width;
+   if (h)
+     *h = height;
+   if (d)
+     *d = depth;
+ }
+ 
+-static int
+-standard_pict_format_for_depth (int depth)
+-{
+-  switch (depth)
+-    {
+-    case 1:
+-      return PictStandardA1;
+-    case 24:
+-      return PictStandardRGB24;
+-    case 32:
+-      return PictStandardARGB32;
+-    default:
+-      g_assert_not_reached ();
+-    }
+-  return 0;
+-}
+-
+-static XRenderPictFormat *
+-pict_format_for_depth (Display *xdisplay, int depth)
+-{
+-  return XRenderFindStandardFormat (xdisplay, standard_pict_format_for_depth (depth));
+-}
+-
+ static cairo_surface_t *
+ surface_from_pixmap (Display *xdisplay, Pixmap xpixmap,
+                      int width, int height)
+ {
+   Window root_return;
++  XVisualInfo visual_info;
+   int x_ret, y_ret;
+   unsigned int w_ret, h_ret, bw_ret, depth_ret;
+ 
+   if (!XGetGeometry (xdisplay, xpixmap, &root_return,
+                      &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
+     return NULL;
+ 
+-  return cairo_xlib_surface_create_with_xrender_format (xdisplay, xpixmap, DefaultScreenOfDisplay (xdisplay),
+-                                                        pict_format_for_depth (xdisplay, depth_ret), w_ret, h_ret);
++  if (!XMatchVisualInfo (xdisplay, DefaultScreen (xdisplay),
++                         depth_ret, TrueColor, &visual_info))
++    return NULL;
++
++  return cairo_xlib_surface_create (xdisplay, xpixmap, visual_info.visual, w_ret, h_ret);
+ }
+ 
+ static gboolean
+ try_pixmap_and_mask (MetaX11Display   *x11_display,
+                      Pixmap            src_pixmap,
+                      Pixmap            src_mask,
+                      cairo_surface_t **iconp)
+ {
+   Display *xdisplay = x11_display->xdisplay;
+   cairo_surface_t *icon, *mask = NULL;
+   int w, h, d;
+ 
+   if (src_pixmap == None)
+     return FALSE;
+ 
+   meta_x11_error_trap_push (x11_display);
+ 
+   get_pixmap_geometry (x11_display, src_pixmap, &w, &h, &d);
+   icon = surface_from_pixmap (xdisplay, src_pixmap, w, h);
+ 
+   if (icon && src_mask != None)
+     {
+       get_pixmap_geometry (x11_display, src_mask, &w, &h, &d);
+ 
+       if (d == 1)
+         mask = surface_from_pixmap (xdisplay, src_mask, w, h);
+     }
+ 
+   meta_x11_error_trap_pop (x11_display);
+ 
+-- 
+2.21.0
+
diff --git a/SOURCES/0001-idle-monitor-Don-t-try-to-auto-start-SessionManager.patch b/SOURCES/0001-idle-monitor-Don-t-try-to-auto-start-SessionManager.patch
deleted file mode 100644
index f913a17..0000000
--- a/SOURCES/0001-idle-monitor-Don-t-try-to-auto-start-SessionManager.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 9d88fc8cb7565ce21563c1195c2950f8f050a3fc Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Sun, 29 Apr 2018 20:43:47 +0000
-Subject: [PATCH] idle-monitor: Don't try to auto-start SessionManager
-
-The interface is provided by gnome-session and not activatable.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/134
-
-
-(cherry picked from commit 2319cd9c4014fcc0c2487d7c02e67857f940687e)
----
- src/backends/meta-idle-monitor.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/backends/meta-idle-monitor.c b/src/backends/meta-idle-monitor.c
-index 7a217f761..76a7ee786 100644
---- a/src/backends/meta-idle-monitor.c
-+++ b/src/backends/meta-idle-monitor.c
-@@ -246,7 +246,8 @@ meta_idle_monitor_init (MetaIdleMonitor *monitor)
-   /* Monitor inhibitors */
-   monitor->session_proxy =
-     g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
--                                   G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
-+                                   G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
-+                                   G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                    NULL,
-                                    "org.gnome.SessionManager",
-                                    "/org/gnome/SessionManager",
--- 
-2.19.0
-
diff --git a/SOURCES/0001-main-be-more-aggressive-in-assuming-X11-backend.patch b/SOURCES/0001-main-be-more-aggressive-in-assuming-X11-backend.patch
index 174cf87..495d859 100644
--- a/SOURCES/0001-main-be-more-aggressive-in-assuming-X11-backend.patch
+++ b/SOURCES/0001-main-be-more-aggressive-in-assuming-X11-backend.patch
@@ -1,4 +1,4 @@
-From f829fc770c35f4bc5451a98602fe8e6478c7be10 Mon Sep 17 00:00:00 2001
+From 18d4fbb1fb641e2b507b3adcd13d231145a01cd6 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Tue, 13 Feb 2018 09:44:50 -0500
 Subject: [PATCH] main: be more aggressive in assuming X11 backend
@@ -12,10 +12,10 @@ to X11 if the session type isn't set to wayland explicitly.
  1 file changed, 3 insertions(+), 5 deletions(-)
 
 diff --git a/src/core/main.c b/src/core/main.c
-index 828037635..faa20818b 100644
+index 629f8e94e..1e1e13367 100644
 --- a/src/core/main.c
 +++ b/src/core/main.c
-@@ -332,7 +332,6 @@ find_session_type (void)
+@@ -333,7 +333,6 @@ find_session_type (void)
    char *session_id;
    char *session_type;
    const char *session_type_env;
@@ -23,7 +23,7 @@ index 828037635..faa20818b 100644
    int ret, i;
  
    ret = sd_pid_get_session (0, &session_id);
-@@ -345,8 +344,7 @@ find_session_type (void)
+@@ -346,8 +345,7 @@ find_session_type (void)
          {
            if (session_type_is_supported (session_type))
              goto out;
@@ -33,7 +33,7 @@ index 828037635..faa20818b 100644
            free (session_type);
          }
      }
-@@ -378,8 +376,8 @@ find_session_type (void)
+@@ -379,8 +377,8 @@ find_session_type (void)
        goto out;
      }
  
@@ -45,5 +45,5 @@ index 828037635..faa20818b 100644
        session_type = strdup ("x11");
        goto out;
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-monitor-Use-current-monitor-mode-to-check-whether-ac.patch b/SOURCES/0001-monitor-Use-current-monitor-mode-to-check-whether-ac.patch
deleted file mode 100644
index 2aa2ddc..0000000
--- a/SOURCES/0001-monitor-Use-current-monitor-mode-to-check-whether-ac.patch
+++ /dev/null
@@ -1,85 +0,0 @@
-From d0d8078013749bb84dc611dfdf6b317512c8559e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Tue, 31 Jul 2018 11:18:51 +0000
-Subject: [PATCH] monitor: Use current monitor mode to check whether active
-
-For historical reasons meta_monitor_is_active() checked whether it is
-active by checking whether the main output have a CRTC assigned and
-whether that CRTC has a current mode. At a later point, the MetaMonitor
-got its own mode abstraction (MetaMonitorMode), but
-meta_monitor_is_active() was never updated to use this.
-
-An issue with checking the main output's CRTC state is that, if there is
-some CRTC mode combination that for some reason isn't properly detected
-by the MetaMonitorMode abstraction (e.g. some tiling configuration not
-yet handled), meta_monitor_is_active() would return TRUE, even though no
-(abstracted) mode was set. This would cause confusion here and there,
-leading to NULL pointer dereferences due to the assumption that if a
-monitor is active, it has an active mode.
-
-Instead, change meta_monitor_is_active() to directly check the current
-monitor mode, and log a warning if the main output still happen to have
-a CRTC with a mode assigned to it. This way, when an not undrestood CRTC
-mode combination is encountered, instead of dereferencing NULL pointers,
-simply assume the monitor is not active, which means that it will not be
-managed or rendered by mutter at all.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/130
-
-
-(cherry picked from commit 4d465eac0806eb1ead375e2852d4a9d6bc24524f)
----
- src/backends/meta-monitor.c | 22 ++++++++++++++++------
- 1 file changed, 16 insertions(+), 6 deletions(-)
-
-diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
-index 92c61c037..60f36741a 100644
---- a/src/backends/meta-monitor.c
-+++ b/src/backends/meta-monitor.c
-@@ -203,13 +203,9 @@ meta_monitor_get_main_output (MetaMonitor *monitor)
- gboolean
- meta_monitor_is_active (MetaMonitor *monitor)
- {
--  MetaOutput *output;
--  MetaCrtc *crtc;
--
--  output = meta_monitor_get_main_output (monitor);
--  crtc = meta_output_get_assigned_crtc (output);
-+  MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
- 
--  return crtc && crtc->current_mode;
-+  return !!priv->current_mode;
- }
- 
- gboolean
-@@ -1411,6 +1407,18 @@ meta_monitor_get_current_mode (MetaMonitor *monitor)
-   return priv->current_mode;
- }
- 
-+static gboolean
-+is_current_mode_known (MetaMonitor *monitor)
-+{
-+  MetaOutput *output;
-+  MetaCrtc *crtc;
-+
-+  output = meta_monitor_get_main_output (monitor);
-+  crtc = meta_output_get_assigned_crtc (output);
-+
-+  return meta_monitor_is_active (monitor) == (crtc && crtc->current_mode);
-+}
-+
- void
- meta_monitor_derive_current_mode (MetaMonitor *monitor)
- {
-@@ -1430,6 +1438,8 @@ meta_monitor_derive_current_mode (MetaMonitor *monitor)
-     }
- 
-   priv->current_mode = current_mode;
-+
-+  g_warn_if_fail (is_current_mode_known (monitor));
- }
- 
- void
--- 
-2.19.0
-
diff --git a/SOURCES/0001-monitor-manager-Consider-external-layout-before-defa.patch b/SOURCES/0001-monitor-manager-Consider-external-layout-before-defa.patch
index 183443a..d204242 100644
--- a/SOURCES/0001-monitor-manager-Consider-external-layout-before-defa.patch
+++ b/SOURCES/0001-monitor-manager-Consider-external-layout-before-defa.patch
@@ -1,4 +1,4 @@
-From 68b47a018d26186f06ac08b8e271f325d247275a Mon Sep 17 00:00:00 2001
+From 4904f1a1e5b881dfd5a051c15acecb3232dc8207 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
 Date: Thu, 28 Jan 2016 15:26:33 +0100
 Subject: [PATCH] monitor-manager: Consider external layout before default
@@ -12,15 +12,15 @@ the existing layout if it passes some sanity checks before falling
 back to the default linear config.
 ---
  src/backends/meta-monitor-config-manager.c | 77 ++++++++++++++++++++++
- src/backends/meta-monitor-config-manager.h |  1 +
+ src/backends/meta-monitor-config-manager.h |  2 +
  src/backends/meta-monitor-manager.c        | 19 ++++++
- 3 files changed, 97 insertions(+)
+ 3 files changed, 98 insertions(+)
 
 diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
-index 197892bf2..585ee7034 100644
+index 9a54ce50f..d64ca1f79 100644
 --- a/src/backends/meta-monitor-config-manager.c
 +++ b/src/backends/meta-monitor-config-manager.c
-@@ -559,6 +559,83 @@ create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_ma
+@@ -643,6 +643,83 @@ create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_ma
    return logical_monitor_config;
  }
  
@@ -105,22 +105,23 @@ index 197892bf2..585ee7034 100644
  meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager)
  {
 diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
-index 269d8e1b7..c36df38e6 100644
+index 3875e04e9..364a2b36b 100644
 --- a/src/backends/meta-monitor-config-manager.h
 +++ b/src/backends/meta-monitor-config-manager.h
-@@ -87,6 +87,7 @@ gboolean meta_monitor_config_manager_assign (MetaMonitorManager *manager,
- 
+@@ -94,6 +94,8 @@ gboolean meta_monitor_config_manager_assign (MetaMonitorManager *manager,
+ META_EXPORT_TEST
  MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager);
  
++META_EXPORT_TEST
 +MetaMonitorsConfig * meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_manager);
+ META_EXPORT_TEST
  MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager);
  
- MetaMonitorsConfig * meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_manager);
 diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
-index 5bd34ad47..4503eb841 100644
+index 2d898c757..05b27c6be 100644
 --- a/src/backends/meta-monitor-manager.c
 +++ b/src/backends/meta-monitor-manager.c
-@@ -576,6 +576,25 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+@@ -614,6 +614,25 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
        g_clear_object (&config);
      }
  
@@ -147,5 +148,5 @@ index 5bd34ad47..4503eb841 100644
    if (config)
      {
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-monitor-manager-only-reuse-initial-config-if-monitor.patch b/SOURCES/0001-monitor-manager-only-reuse-initial-config-if-monitor.patch
index b4e141d..dc34cee 100644
--- a/SOURCES/0001-monitor-manager-only-reuse-initial-config-if-monitor.patch
+++ b/SOURCES/0001-monitor-manager-only-reuse-initial-config-if-monitor.patch
@@ -1,4 +1,4 @@
-From 7f73a6ed3ac3244d8d1ec3ab7a74b5a45a1350d9 Mon Sep 17 00:00:00 2001
+From 4ad8fd80355189ecbde6c38961335ae4be4db8b3 Mon Sep 17 00:00:00 2001
 From: rpm-build <rpm-build>
 Date: Tue, 11 Sep 2018 10:19:44 -0400
 Subject: [PATCH] monitor-manager: only reuse initial-config if monitor
@@ -22,10 +22,10 @@ the start up topology.
  3 files changed, 31 insertions(+), 7 deletions(-)
 
 diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
-index 585ee7034..1ad342a44 100644
+index d64ca1f79..c09edbe00 100644
 --- a/src/backends/meta-monitor-config-manager.c
 +++ b/src/backends/meta-monitor-config-manager.c
-@@ -40,6 +40,7 @@ struct _MetaMonitorConfigManager
+@@ -42,6 +42,7 @@ struct _MetaMonitorConfigManager
    MetaMonitorConfigStore *config_store;
  
    MetaMonitorsConfig *current_config;
@@ -33,7 +33,7 @@ index 585ee7034..1ad342a44 100644
    GQueue config_history;
  };
  
-@@ -579,9 +580,10 @@ create_logical_monitor_config_from_output (MetaMonitorManager           *monitor
+@@ -663,9 +664,10 @@ create_logical_monitor_config_from_output (MetaMonitorManager           *monitor
  }
  
  MetaMonitorsConfig *
@@ -45,7 +45,7 @@ index 585ee7034..1ad342a44 100644
    GList *logical_monitor_configs;
    MetaMonitor *primary_monitor;
    MetaLogicalMonitorLayoutMode layout_mode;
-@@ -589,6 +591,9 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
+@@ -673,6 +675,9 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
    GList *monitors;
    GList *l;
  
@@ -55,7 +55,7 @@ index 585ee7034..1ad342a44 100644
    if (meta_monitor_config_store_get_config_count (config_manager->config_store) > 0)
      return NULL;
  
-@@ -630,10 +635,14 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
+@@ -714,10 +719,14 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
                                                 logical_monitor_config);
      }
  
@@ -74,7 +74,7 @@ index 585ee7034..1ad342a44 100644
  }
  
  MetaMonitorsConfig *
-@@ -1162,6 +1171,7 @@ meta_monitor_config_manager_dispose (GObject *object)
+@@ -1256,6 +1265,7 @@ meta_monitor_config_manager_dispose (GObject *object)
      META_MONITOR_CONFIG_MANAGER (object);
  
    g_clear_object (&config_manager->current_config);
@@ -83,23 +83,23 @@ index 585ee7034..1ad342a44 100644
  
    G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object);
 diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
-index c36df38e6..29ef8f8ce 100644
+index 364a2b36b..409611bb0 100644
 --- a/src/backends/meta-monitor-config-manager.h
 +++ b/src/backends/meta-monitor-config-manager.h
-@@ -87,7 +87,7 @@ gboolean meta_monitor_config_manager_assign (MetaMonitorManager *manager,
- 
+@@ -95,7 +95,7 @@ META_EXPORT_TEST
  MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager);
  
+ META_EXPORT_TEST
 -MetaMonitorsConfig * meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_manager);
 +MetaMonitorsConfig * meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager);
+ META_EXPORT_TEST
  MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager);
  
- MetaMonitorsConfig * meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_manager);
 diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
-index 4503eb841..f7ada0136 100644
+index 05b27c6be..bb4b44188 100644
 --- a/src/backends/meta-monitor-manager.c
 +++ b/src/backends/meta-monitor-manager.c
-@@ -496,9 +496,11 @@ should_use_stored_config (MetaMonitorManager *manager)
+@@ -534,9 +534,11 @@ should_use_stored_config (MetaMonitorManager *manager)
  MetaMonitorsConfig *
  meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
  {
@@ -111,7 +111,7 @@ index 4503eb841..f7ada0136 100644
    MetaMonitorsConfigMethod method;
    MetaMonitorsConfigMethod fallback_method =
      META_MONITORS_CONFIG_METHOD_TEMPORARY;
-@@ -509,6 +511,18 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+@@ -547,6 +549,18 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
    else
      method = META_MONITORS_CONFIG_METHOD_TEMPORARY;
  
@@ -130,7 +130,7 @@ index 4503eb841..f7ada0136 100644
    if (use_stored_config)
      {
        config = meta_monitor_config_manager_get_stored (manager->config_manager);
-@@ -576,7 +590,7 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+@@ -614,7 +628,7 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
        g_clear_object (&config);
      }
  
@@ -140,5 +140,5 @@ index 4503eb841..f7ada0136 100644
      {
        if (!meta_monitor_manager_apply_monitors_config (manager,
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch b/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch
index b9b4a8a..2242c67 100644
--- a/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch
+++ b/SOURCES/0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch
@@ -1,4 +1,4 @@
-From 5bdc464aa6b15af1cf310427c360351db83388da Mon Sep 17 00:00:00 2001
+From 849902beff553de41dd3940b17672ef98f687be5 Mon Sep 17 00:00:00 2001
 From: Rui Matos <tiagomatos@gmail.com>
 Date: Mon, 4 Jun 2018 16:35:04 -0400
 Subject: [PATCH] monitor-manager-xrandr: Force an update when resuming from
@@ -9,10 +9,10 @@ doesn't generate RRScreenChangeNotify events when e.g. resuming a
 laptop on a dock, meaning that we'd miss newly attached outputs.
 ---
  src/backends/meta-gpu.c                       |  7 ++
- src/backends/meta-gpu.h                       |  2 +
+ src/backends/meta-gpu.h                       |  4 +
  src/backends/x11/meta-gpu-xrandr.c            | 26 ++++-
  .../x11/meta-monitor-manager-xrandr.c         | 96 +++++++++++++++++--
- 4 files changed, 121 insertions(+), 10 deletions(-)
+ 4 files changed, 123 insertions(+), 10 deletions(-)
 
 diff --git a/src/backends/meta-gpu.c b/src/backends/meta-gpu.c
 index 3577391e5..946f72387 100644
@@ -33,26 +33,24 @@ index 3577391e5..946f72387 100644
  meta_gpu_read_current (MetaGpu  *gpu,
                         GError  **error)
 diff --git a/src/backends/meta-gpu.h b/src/backends/meta-gpu.h
-index 4badcbd26..3cec8e5b0 100644
+index 701acdc97..a2fd061f7 100644
 --- a/src/backends/meta-gpu.h
 +++ b/src/backends/meta-gpu.h
-@@ -35,12 +35,14 @@ struct _MetaGpuClass
+@@ -36,8 +36,12 @@ struct _MetaGpuClass
  
    gboolean (* read_current) (MetaGpu  *gpu,
                               GError  **error);
 +  void     (* poll_hardware) (MetaGpu *gpu);
  };
  
- int meta_gpu_get_kms_fd (MetaGpu *gpu);
- 
- const char * meta_gpu_get_kms_file_path (MetaGpu *gpu);
- 
++META_EXPORT_TEST
 +void meta_gpu_poll_hardware (MetaGpu *gpu);
++
+ META_EXPORT_TEST
  gboolean meta_gpu_read_current (MetaGpu  *gpu,
                                  GError  **error);
- 
 diff --git a/src/backends/x11/meta-gpu-xrandr.c b/src/backends/x11/meta-gpu-xrandr.c
-index 14b46d530..add80c0d2 100644
+index 3e8a7318d..90b33d486 100644
 --- a/src/backends/x11/meta-gpu-xrandr.c
 +++ b/src/backends/x11/meta-gpu-xrandr.c
 @@ -44,6 +44,8 @@ struct _MetaGpuXrandr
@@ -79,7 +77,7 @@ index 14b46d530..add80c0d2 100644
  static gboolean
  meta_gpu_xrandr_read_current (MetaGpu  *gpu,
                                GError  **error)
-@@ -148,8 +158,18 @@ meta_gpu_xrandr_read_current (MetaGpu  *gpu,
+@@ -116,8 +126,18 @@ meta_gpu_xrandr_read_current (MetaGpu  *gpu,
    monitor_manager->screen_width = WidthOfScreen (screen);
    monitor_manager->screen_height = HeightOfScreen (screen);
  
@@ -100,7 +98,7 @@ index 14b46d530..add80c0d2 100644
    if (!resources)
      {
        g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-@@ -282,6 +302,7 @@ meta_gpu_xrandr_finalize (GObject *object)
+@@ -250,6 +270,7 @@ meta_gpu_xrandr_finalize (GObject *object)
  static void
  meta_gpu_xrandr_init (MetaGpuXrandr *gpu_xrandr)
  {
@@ -108,17 +106,17 @@ index 14b46d530..add80c0d2 100644
  }
  
  static void
-@@ -293,4 +314,5 @@ meta_gpu_xrandr_class_init (MetaGpuXrandrClass *klass)
+@@ -261,4 +282,5 @@ meta_gpu_xrandr_class_init (MetaGpuXrandrClass *klass)
    object_class->finalize = meta_gpu_xrandr_finalize;
  
    gpu_class->read_current = meta_gpu_xrandr_read_current;
 +  gpu_class->poll_hardware = meta_gpu_xrandr_poll_hardware;
  }
 diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
-index c6eb4b6aa..26dccb247 100644
+index 448e51fae..d60f00325 100644
 --- a/src/backends/x11/meta-monitor-manager-xrandr.c
 +++ b/src/backends/x11/meta-monitor-manager-xrandr.c
-@@ -60,6 +60,10 @@ struct _MetaMonitorManagerXrandr
+@@ -71,6 +71,10 @@ struct _MetaMonitorManagerXrandr
    Display *xdisplay;
    int rr_event_base;
    int rr_error_base;
@@ -129,16 +127,16 @@ index c6eb4b6aa..26dccb247 100644
    gboolean has_randr15;
  
    /*
-@@ -95,6 +99,8 @@ typedef struct _MetaMonitorXrandrData
+@@ -102,6 +106,8 @@ typedef struct _MetaMonitorXrandrData
+ 
  GQuark quark_meta_monitor_xrandr_data;
- #endif /* HAVE_RANDR15 */
  
 +static void meta_monitor_manager_xrandr_update (MetaMonitorManagerXrandr *manager_xrandr);
 +
  Display *
  meta_monitor_manager_xrandr_get_xdisplay (MetaMonitorManagerXrandr *manager_xrandr)
  {
-@@ -966,6 +972,62 @@ meta_monitor_manager_xrandr_get_default_layout_mode (MetaMonitorManager *manager
+@@ -1016,6 +1022,62 @@ meta_monitor_manager_xrandr_get_default_layout_mode (MetaMonitorManager *manager
    return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
  }
  
@@ -201,7 +199,7 @@ index c6eb4b6aa..26dccb247 100644
  static void
  meta_monitor_manager_xrandr_constructed (GObject *object)
  {
-@@ -1024,12 +1086,23 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
+@@ -1072,12 +1134,23 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
    g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
    g_free (manager_xrandr->supported_scales);
  
@@ -225,7 +223,7 @@ index c6eb4b6aa..26dccb247 100644
  }
  
  static void
-@@ -1076,9 +1149,8 @@ is_xvnc (MetaMonitorManager *manager)
+@@ -1123,9 +1196,8 @@ is_xvnc (MetaMonitorManager *manager)
    return FALSE;
  }
  
@@ -237,7 +235,7 @@ index c6eb4b6aa..26dccb247 100644
  {
    MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr);
    MetaGpuXrandr *gpu_xrandr;
-@@ -1087,11 +1159,6 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
+@@ -1134,11 +1206,6 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
    gboolean is_our_configuration;
    unsigned int timestamp;
  
@@ -249,7 +247,7 @@ index c6eb4b6aa..26dccb247 100644
    meta_monitor_manager_read_current_state (manager);
  
    gpu_xrandr = META_GPU_XRANDR (manager_xrandr->gpu);
-@@ -1126,6 +1193,19 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
+@@ -1173,6 +1240,19 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
  
        meta_monitor_manager_xrandr_rebuild_derived (manager, config);
      }
@@ -270,5 +268,5 @@ index c6eb4b6aa..26dccb247 100644
    return TRUE;
  }
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch b/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch
index b27453a..c487119 100644
--- a/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch
+++ b/SOURCES/0001-monitor-manager-xrandr-Work-around-spurious-hotplugs.patch
@@ -1,4 +1,4 @@
-From f562a522a30f3048da0f2fff7ee4950e53e8c462 Mon Sep 17 00:00:00 2001
+From 7e21503dc7c3b8321475eb5ccfdb23e71f86c0a0 Mon Sep 17 00:00:00 2001
 From: Rui Matos <tiagomatos@gmail.com>
 Date: Tue, 6 Oct 2015 21:16:18 +0200
 Subject: [PATCH] monitor-manager-xrandr: Work around spurious hotplugs on Xvnc
@@ -13,10 +13,10 @@ hotplug.
  1 file changed, 19 insertions(+), 1 deletion(-)
 
 diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
-index e438d8f98..c6eb4b6aa 100644
+index 45c81f4eb..448e51fae 100644
 --- a/src/backends/x11/meta-monitor-manager-xrandr.c
 +++ b/src/backends/x11/meta-monitor-manager-xrandr.c
-@@ -1063,6 +1063,19 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
+@@ -1110,6 +1110,19 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
      g_quark_from_static_string ("-meta-monitor-xrandr-data");
  }
  
@@ -36,7 +36,7 @@ index e438d8f98..c6eb4b6aa 100644
  gboolean
  meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xrandr,
  					   XEvent                   *event)
-@@ -1072,6 +1085,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
+@@ -1119,6 +1132,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
    XRRScreenResources *resources;
    gboolean is_hotplug;
    gboolean is_our_configuration;
@@ -44,7 +44,7 @@ index e438d8f98..c6eb4b6aa 100644
  
    if ((event->type - manager_xrandr->rr_event_base) != RRScreenChangeNotify)
      return FALSE;
-@@ -1083,7 +1097,11 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
+@@ -1130,7 +1144,11 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
    gpu_xrandr = META_GPU_XRANDR (manager_xrandr->gpu);
    resources = meta_gpu_xrandr_get_resources (gpu_xrandr);
  
@@ -58,5 +58,5 @@ index e438d8f98..c6eb4b6aa 100644
                            manager_xrandr->last_xrandr_set_timestamp);
    if (is_hotplug)
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-native-gpu-Handle-drmModeSetCrtc-failing-gracefully.patch b/SOURCES/0001-native-gpu-Handle-drmModeSetCrtc-failing-gracefully.patch
deleted file mode 100644
index 3c6bc9c..0000000
--- a/SOURCES/0001-native-gpu-Handle-drmModeSetCrtc-failing-gracefully.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 44682a2cc5550ae2d51f606f800405a05b72a240 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Tue, 24 Apr 2018 09:26:33 +0000
-Subject: [PATCH] native/gpu: Handle drmModeSetCrtc() failing gracefully
-
-If drmModeSetCrtc() is called with no fb, mode or connectors for some
-CRTC it may still fail, and we should handle that gracefully instead of
-assuming it failed to set a non-disabled state.
-
-Closes https://gitlab.gnome.org/GNOME/mutter/issues/70
-
-
-(cherry picked from commit 6e953e2725d5d5b10d14c7bd479bd99f6853addc)
----
- src/backends/native/meta-gpu-kms.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index 259cd7122..1d1c28809 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -143,7 +143,10 @@ meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
-                       connectors, n_connectors,
-                       mode) != 0)
-     {
--      g_warning ("Failed to set CRTC mode %s: %m", crtc->current_mode->name);
-+      if (mode)
-+        g_warning ("Failed to set CRTC mode %s: %m", crtc->current_mode->name);
-+      else
-+        g_warning ("Failed to disable CRTC");
-       g_free (connectors);
-       return FALSE;
-     }
--- 
-2.19.0
-
diff --git a/SOURCES/0001-renderer-native-Also-wrap-flip-closures-for-EGLStrea.patch b/SOURCES/0001-renderer-native-Also-wrap-flip-closures-for-EGLStrea.patch
deleted file mode 100644
index 932311c..0000000
--- a/SOURCES/0001-renderer-native-Also-wrap-flip-closures-for-EGLStrea.patch
+++ /dev/null
@@ -1,170 +0,0 @@
-From 1c77f0613220b026cbc7eebeb0a00844a675a721 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Tue, 14 Nov 2017 16:08:52 +0800
-Subject: [PATCH] renderer/native: Also wrap flip closures for EGLStreams
-
-When using the EGLStream backend, the MetaRendererNative passed a
-GClosure to KMS when using EGLStreams, but KMS flip callback event
-handler in meta-gpu-kms.c expected a closure wrapped in a closure
-container, meaning it'd instead crash when using EGLStreams. Make the
-flip handler get what it expects also when using EGLStreams by wrapping
-the flip closure in the container before handing it over to EGL.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=790316
-(cherry picked from commit 8ee14a7cb7e8f072d2731d59c7dc735f83a9bb0b)
----
- src/backends/native/meta-gpu-kms.c         | 44 +++++++++++++++-------
- src/backends/native/meta-gpu-kms.h         |  7 ++++
- src/backends/native/meta-renderer-native.c |  7 +++-
- 3 files changed, 44 insertions(+), 14 deletions(-)
-
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index 08c1e7dbe..815caf501 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -47,6 +47,12 @@ typedef struct _MetaKmsSource
-   MetaGpuKms *gpu_kms;
- } MetaKmsSource;
- 
-+typedef struct _MetaGpuKmsFlipClosureContainer
-+{
-+  GClosure *flip_closure;
-+  MetaGpuKms *gpu_kms;
-+} MetaGpuKmsFlipClosureContainer;
-+
- struct _MetaGpuKms
- {
-   MetaGpu parent;
-@@ -209,11 +215,26 @@ meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
-   return TRUE;
- }
- 
--typedef struct _GpuClosureContainer
-+MetaGpuKmsFlipClosureContainer *
-+meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
-+                                GClosure   *flip_closure)
- {
--  GClosure *flip_closure;
--  MetaGpuKms *gpu_kms;
--} GpuClosureContainer;
-+  MetaGpuKmsFlipClosureContainer *closure_container;
-+
-+  closure_container = g_new0 (MetaGpuKmsFlipClosureContainer, 1);
-+  *closure_container = (MetaGpuKmsFlipClosureContainer) {
-+    .flip_closure = flip_closure,
-+    .gpu_kms = gpu_kms
-+  };
-+
-+  return closure_container;
-+}
-+
-+void
-+meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container)
-+{
-+  g_free (closure_container);
-+}
- 
- gboolean
- meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
-@@ -239,14 +260,11 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
- 
-   if (!gpu_kms->page_flips_not_supported)
-     {
--      GpuClosureContainer *closure_container;
-+      MetaGpuKmsFlipClosureContainer *closure_container;
-       int kms_fd = meta_gpu_kms_get_fd (gpu_kms);
- 
--      closure_container = g_new0 (GpuClosureContainer, 1);
--      *closure_container = (GpuClosureContainer) {
--        .flip_closure = flip_closure,
--        .gpu_kms = gpu_kms
--      };
-+      closure_container = meta_gpu_kms_wrap_flip_closure (gpu_kms,
-+                                                          flip_closure);
- 
-       ret = drmModePageFlip (kms_fd,
-                              crtc->crtc_id,
-@@ -255,7 +273,7 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
-                              closure_container);
-       if (ret != 0 && ret != -EACCES)
-         {
--          g_free (closure_container);
-+          meta_gpu_kms_flip_closure_container_free (closure_container);
-           g_warning ("Failed to flip: %s", strerror (-ret));
-           gpu_kms->page_flips_not_supported = TRUE;
-         }
-@@ -286,12 +304,12 @@ page_flip_handler (int           fd,
-                    unsigned int  usec,
-                    void         *user_data)
- {
--  GpuClosureContainer *closure_container = user_data;
-+  MetaGpuKmsFlipClosureContainer *closure_container = user_data;
-   GClosure *flip_closure = closure_container->flip_closure;
-   MetaGpuKms *gpu_kms = closure_container->gpu_kms;
- 
-   invoke_flip_closure (flip_closure, gpu_kms);
--  g_free (closure_container);
-+  meta_gpu_kms_flip_closure_container_free (closure_container);
- }
- 
- gboolean
-diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h
-index d53ed98c8..01c3f2c0c 100644
---- a/src/backends/native/meta-gpu-kms.h
-+++ b/src/backends/native/meta-gpu-kms.h
-@@ -40,6 +40,8 @@ GQuark meta_gpu_kms_error_quark (void);
- #define META_TYPE_GPU_KMS (meta_gpu_kms_get_type ())
- G_DECLARE_FINAL_TYPE (MetaGpuKms, meta_gpu_kms, META, GPU_KMS, MetaGpu)
- 
-+typedef struct _MetaGpuKmsFlipClosureContainer MetaGpuKmsFlipClosureContainer;
-+
- typedef struct _MetaKmsResources
- {
-   drmModeRes *resources;
-@@ -94,4 +96,9 @@ gboolean meta_drm_mode_equal (const drmModeModeInfo *one,
- 
- float meta_calculate_drm_mode_refresh_rate (const drmModeModeInfo *mode);
- 
-+MetaGpuKmsFlipClosureContainer * meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms,
-+                                                                 GClosure   *flip_closure);
-+
-+void meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container);
-+
- #endif /* META_GPU_KMS_H */
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index d0da98f74..470da8845 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -1286,6 +1286,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
-   MetaRendererNativeGpuData *renderer_gpu_data;
-   EGLDisplay *egl_display;
-   MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native);
-+  MetaGpuKmsFlipClosureContainer *closure_container;
-   EGLAttrib *acquire_attribs;
-   GError *error = NULL;
- 
-@@ -1295,9 +1296,12 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
-   if (renderer_gpu_data->egl.no_egl_output_drm_flip_event)
-     return FALSE;
- 
-+  closure_container =
-+    meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu, flip_closure);
-+
-   acquire_attribs = (EGLAttrib[]) {
-     EGL_DRM_FLIP_EVENT_DATA_NV,
--    (EGLAttrib) flip_closure,
-+    (EGLAttrib) closure_container,
-     EGL_NONE
-   };
- 
-@@ -1316,6 +1320,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
-           renderer_gpu_data->egl.no_egl_output_drm_flip_event = TRUE;
-         }
-       g_error_free (error);
-+      meta_gpu_kms_flip_closure_container_free (closure_container);
-       return FALSE;
-     }
- 
--- 
-2.19.1
-
diff --git a/SOURCES/0001-renderer-native-Check-calculated-transform-when-crea.patch b/SOURCES/0001-renderer-native-Check-calculated-transform-when-crea.patch
deleted file mode 100644
index 1079d4c..0000000
--- a/SOURCES/0001-renderer-native-Check-calculated-transform-when-crea.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 91c5c94434b22895f97b3ae47a889ccb902b86aa Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 23 Jul 2018 21:36:57 +0200
-Subject: [PATCH] renderer/native: Check calculated transform when creating
- view
-
-The "backends: Move MetaOutput::crtc field into private struct"
-accidentally changed the view transform calculation code to assume that
-"MetaCrtc::transform" corresponds to the transform of the CRTC; so is
-not the case yet; one must calculate the transform from the logical
-monitor, and check whether it is supported by the CRTC using
-meta_monitor_manager_is_transform_handled(). This commit restores the
-old behaviour that doesn't use MetaCrtc::transform when calculating the
-view transform.
-
-Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/216
----
- src/backends/native/meta-renderer-native.c         | 9 +++++++--
- src/backends/x11/nested/meta-renderer-x11-nested.c | 8 ++++++--
- 2 files changed, 13 insertions(+), 4 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index fc6b223026..8dc0da7104 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -2720,9 +2720,14 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
-   MetaMonitor *main_monitor;
-   MetaOutput *main_output;
-   MetaCrtc *crtc;
-+  MetaMonitorTransform crtc_transform;
-+
-   main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
-   main_output = meta_monitor_get_main_output (main_monitor);
-   crtc = meta_output_get_assigned_crtc (main_output);
-+  crtc_transform =
-+    meta_monitor_logical_to_crtc_transform (main_monitor,
-+                                            logical_monitor->transform);
- 
-   /*
-    * Pick any monitor and output and check; all CRTCs of a logical monitor will
-@@ -2731,10 +2736,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
- 
-   if (meta_monitor_manager_is_transform_handled (monitor_manager,
-                                                  crtc,
--                                                 crtc->transform))
-+                                                 crtc_transform))
-     return META_MONITOR_TRANSFORM_NORMAL;
-   else
--    return crtc->transform;
-+    return crtc_transform;
- }
- 
- static MetaRendererView *
-diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c b/src/backends/x11/nested/meta-renderer-x11-nested.c
-index 8fdf46b0b5..b29b9c69e2 100644
---- a/src/backends/x11/nested/meta-renderer-x11-nested.c
-+++ b/src/backends/x11/nested/meta-renderer-x11-nested.c
-@@ -51,10 +51,14 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
-   MetaMonitor *main_monitor;
-   MetaOutput *main_output;
-   MetaCrtc *crtc;
-+  MetaMonitorTransform crtc_transform;
- 
-   main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
-   main_output = meta_monitor_get_main_output (main_monitor);
-   crtc = meta_output_get_assigned_crtc (main_output);
-+  crtc_transform =
-+    meta_monitor_logical_to_crtc_transform (main_monitor,
-+                                            logical_monitor->transform);
-   /*
-    * Pick any monitor and output and check; all CRTCs of a logical monitor will
-    * always have the same transform assigned to them.
-@@ -62,10 +66,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
- 
-   if (meta_monitor_manager_is_transform_handled (monitor_manager,
-                                                  crtc,
--                                                 crtc->transform))
-+                                                 crtc_transform))
-     return META_MONITOR_TRANSFORM_NORMAL;
-   else
--    return crtc->transform;
-+    return crtc_transform;
- }
- 
- static MetaRendererView *
--- 
-2.17.1
-
diff --git a/SOURCES/0001-renderer-native-Choose-first-EGL-config-for-non-GBM-.patch b/SOURCES/0001-renderer-native-Choose-first-EGL-config-for-non-GBM-.patch
deleted file mode 100644
index 94a9629..0000000
--- a/SOURCES/0001-renderer-native-Choose-first-EGL-config-for-non-GBM-.patch
+++ /dev/null
@@ -1,124 +0,0 @@
-From c647bd7807d90d6b268aecc02f51ee5df1692684 Mon Sep 17 00:00:00 2001
-From: "Miguel A. Vico" <mvicomoya@nvidia.com>
-Date: Thu, 7 Jun 2018 23:29:44 +0000
-Subject: [PATCH] renderer/native: Choose first EGL config for non-GBM backends
-
-Commit 712ec30cd9be1f180c3789e7e6a042c5f7b5781d added the logic to only
-choose EGL configs that match the GBM_FORMAT_XRGB8888 pixel format.
-However, there won't be any EGL config satisfying such criteria for
-non-GBM backends, such as EGLDevice.
-
-This change will let us choose the first EGL config for the EGLDevice
-backend, while still forcing GBM_FORMAT_XRGB8888 configs for the GBM
-one.
-
-Related to: https://gitlab.gnome.org/GNOME/mutter/issues/2
-
-
-(cherry picked from commit 1bf2eb95b502ed0419b0fe8979c022cacaf79e84)
----
- src/backends/native/meta-renderer-native.c | 65 ++++++++++++++++------
- 1 file changed, 48 insertions(+), 17 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index 250a6b6c1..d0da98f74 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -993,14 +993,29 @@ meta_renderer_native_choose_egl_config (CoglDisplay  *cogl_display,
-   CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
-   MetaBackend *backend = meta_get_backend ();
-   MetaEgl *egl = meta_backend_get_egl (backend);
-+  MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
-   EGLDisplay egl_display = cogl_renderer_egl->edpy;
- 
--  return choose_egl_config_from_gbm_format (egl,
--                                            egl_display,
--                                            attributes,
--                                            GBM_FORMAT_XRGB8888,
--                                            out_config,
--                                            error);
-+  switch (renderer_gpu_data->mode)
-+    {
-+    case META_RENDERER_NATIVE_MODE_GBM:
-+      return choose_egl_config_from_gbm_format (egl,
-+                                                egl_display,
-+                                                attributes,
-+                                                GBM_FORMAT_XRGB8888,
-+                                                out_config,
-+                                                error);
-+#ifdef HAVE_EGL_DEVICE
-+    case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
-+      return meta_egl_choose_first_config (egl,
-+                                           egl_display,
-+                                           attributes,
-+                                           out_config,
-+                                           error);
-+#endif
-+    }
-+
-+  return FALSE;
- }
- 
- static gboolean
-@@ -2923,10 +2938,11 @@ meta_renderer_native_set_property (GObject      *object,
- }
- 
- static gboolean
--create_secondary_egl_config (MetaEgl   *egl,
--                             EGLDisplay egl_display,
--                             EGLConfig *egl_config,
--                             GError   **error)
-+create_secondary_egl_config (MetaEgl               *egl,
-+                             MetaRendererNativeMode mode,
-+                             EGLDisplay             egl_display,
-+                             EGLConfig             *egl_config,
-+                             GError               **error)
- {
-   EGLint attributes[] = {
-     EGL_RED_SIZE, 1,
-@@ -2939,12 +2955,26 @@ create_secondary_egl_config (MetaEgl   *egl,
-     EGL_NONE
-   };
- 
--  return choose_egl_config_from_gbm_format (egl,
--                                            egl_display,
--                                            attributes,
--                                            GBM_FORMAT_XRGB8888,
--                                            egl_config,
--                                            error);
-+  switch (mode)
-+    {
-+    case META_RENDERER_NATIVE_MODE_GBM:
-+      return choose_egl_config_from_gbm_format (egl,
-+                                                egl_display,
-+                                                attributes,
-+                                                GBM_FORMAT_XRGB8888,
-+                                                egl_config,
-+                                                error);
-+#ifdef HAVE_EGL_DEVICE
-+    case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
-+      return meta_egl_choose_first_config (egl,
-+                                           egl_display,
-+                                           attributes,
-+                                           egl_config,
-+                                           error);
-+#endif
-+    }
-+
-+  return FALSE;
- }
- 
- static EGLContext
-@@ -2988,7 +3018,8 @@ init_secondary_gpu_data_gpu (MetaRendererNativeGpuData *renderer_gpu_data,
-   EGLContext egl_context;
-   char **missing_gl_extensions;
- 
--  if (!create_secondary_egl_config (egl,egl_display, &egl_config, error))
-+  if (!create_secondary_egl_config (egl, renderer_gpu_data->mode, egl_display,
-+                                    &egl_config, error))
-     return FALSE;
- 
-   egl_context = create_secondary_egl_context (egl, egl_display, egl_config, error);
--- 
-2.19.1
-
diff --git a/SOURCES/0001-renderer-native-Fallback-to-non-planar-API-if-gbm_bo.patch b/SOURCES/0001-renderer-native-Fallback-to-non-planar-API-if-gbm_bo.patch
deleted file mode 100644
index 5d401e8..0000000
--- a/SOURCES/0001-renderer-native-Fallback-to-non-planar-API-if-gbm_bo.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From 1276cc97d1e6437c7fbc43fdd5cbcea39f60acee Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Alex=20Villac=C3=ADs=20Lasso?= <a_villacis@palosanto.com>
-Date: Fri, 27 Jul 2018 16:08:52 +0000
-Subject: [PATCH] renderer/native: Fallback to non-planar API if
- gbm_bo_get_handle_for_plane fails
-
-Commit c0d9b08ef9bf2be865aad9bf1bc74ba24c655d9f replaced the old GBM API calls
-with the multi-plane GBM API. However, the call to gbm_bo_get_handle_for_plane
-fails for some DRI drivers (in particular i915). Due to missing error checks,
-the subsequent call to drmModeAddFB[2] fails and the screen output locks up.
-
-This commit adds the missing error checks and falls back to the old GBM API
-(non-planar) if necessary.
-
-v5: test success of gbm_bo_get_handle_for_plane instead of errno
-
-This commit adopts solution proposed by Daniel van Vugt to check the return
-value of gbm_bo_get_handle_for_plane on plane 0 and fall back to old
-non-planar method if the call fails. This removes the errno check (for
-ENOSYS) that could abort if mesa ever sets a different value.
-
-Related to: https://gitlab.gnome.org/GNOME/mutter/issues/127
-
-
-(cherry picked from commit f7af32a3eaefabbea3ebbda3a93eff98dd105ab9)
----
- src/backends/native/meta-renderer-native.c | 21 ++++++++++++++++-----
- 1 file changed, 16 insertions(+), 5 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index fc6b22302..59003b397 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -1607,12 +1607,23 @@ gbm_get_next_fb_id (MetaGpuKms         *gpu_kms,
-       return FALSE;
-     }
- 
--  for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++)
-+  if (gbm_bo_get_handle_for_plane (next_bo, 0).s32 == -1)
-     {
--      strides[i] = gbm_bo_get_stride_for_plane (next_bo, i);
--      handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32;
--      offsets[i] = gbm_bo_get_offset (next_bo, i);
--      modifiers[i] = gbm_bo_get_modifier (next_bo);
-+      /* Failed to fetch handle to plane, falling back to old method */
-+      strides[0] = gbm_bo_get_stride (next_bo);
-+      handles[0] = gbm_bo_get_handle (next_bo).u32;
-+      offsets[0] = 0;
-+      modifiers[0] = DRM_FORMAT_MOD_INVALID;
-+    }
-+  else
-+    {
-+      for (i = 0; i < gbm_bo_get_plane_count (next_bo); i++)
-+        {
-+          strides[i] = gbm_bo_get_stride_for_plane (next_bo, i);
-+          handles[i] = gbm_bo_get_handle_for_plane (next_bo, i).u32;
-+          offsets[i] = gbm_bo_get_offset (next_bo, i);
-+          modifiers[i] = gbm_bo_get_modifier (next_bo);
-+        }
-     }
- 
-   kms_fd = meta_gpu_kms_get_fd (gpu_kms);
--- 
-2.19.0
-
diff --git a/SOURCES/0001-renderer-native-Use-shadow-fb-on-software-GL-if-pref.patch b/SOURCES/0001-renderer-native-Use-shadow-fb-on-software-GL-if-pref.patch
deleted file mode 100644
index 446324a..0000000
--- a/SOURCES/0001-renderer-native-Use-shadow-fb-on-software-GL-if-pref.patch
+++ /dev/null
@@ -1,187 +0,0 @@
-From d05751b1a28d7e99a089203401b0ec940373cbd0 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Tue, 9 Oct 2018 15:55:23 +0200
-Subject: [PATCH] renderer/native: Use shadow fb on software GL if preferred
-
-If a KMS device has the DRM_CAP_DUMB_PREFER_SHADOW and a software based
-GL driver is used, always use a shadow fb. This will speed up read backs
-in the llvmpipe OpenGL implementation, making blend operations faster.
-
-Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/106
----
- src/backends/native/meta-renderer-native.c | 61 ++++++++++++++++++++--
- 1 file changed, 57 insertions(+), 4 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index 470da8845..b15a6da96 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -2746,108 +2746,161 @@ meta_onscreen_native_set_view (CoglOnscreen     *onscreen,
- 
- static MetaMonitorTransform
- calculate_view_transform (MetaMonitorManager *monitor_manager,
-                           MetaLogicalMonitor *logical_monitor)
- {
-   MetaMonitor *main_monitor;
-   MetaOutput *main_output;
-   MetaCrtc *crtc;
-   MetaMonitorTransform crtc_transform;
- 
-   main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
-   main_output = meta_monitor_get_main_output (main_monitor);
-   crtc = meta_output_get_assigned_crtc (main_output);
-   crtc_transform =
-     meta_monitor_logical_to_crtc_transform (main_monitor,
-                                             logical_monitor->transform);
- 
-   /*
-    * Pick any monitor and output and check; all CRTCs of a logical monitor will
-    * always have the same transform assigned to them.
-    */
- 
-   if (meta_monitor_manager_is_transform_handled (monitor_manager,
-                                                  crtc,
-                                                  crtc_transform))
-     return META_MONITOR_TRANSFORM_NORMAL;
-   else
-     return crtc_transform;
- }
- 
-+static CoglContext *
-+cogl_context_from_renderer_native (MetaRendererNative *renderer_native)
-+{
-+  MetaMonitorManager *monitor_manager =
-+    META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
-+  MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
-+  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-+
-+  return clutter_backend_get_cogl_context (clutter_backend);
-+}
-+
-+static gboolean
-+should_force_shadow_fb (MetaRendererNative *renderer_native,
-+                        MetaGpuKms         *primary_gpu)
-+{
-+  CoglContext *cogl_context =
-+    cogl_context_from_renderer_native (renderer_native);
-+  CoglGpuInfo *info = &cogl_context->gpu;
-+  int kms_fd;
-+  uint64_t prefer_shadow = 0;
-+
-+  switch (info->architecture)
-+    {
-+    case COGL_GPU_INFO_ARCHITECTURE_UNKNOWN:
-+    case COGL_GPU_INFO_ARCHITECTURE_SANDYBRIDGE:
-+    case COGL_GPU_INFO_ARCHITECTURE_SGX:
-+    case COGL_GPU_INFO_ARCHITECTURE_MALI:
-+      return FALSE;
-+    case COGL_GPU_INFO_ARCHITECTURE_LLVMPIPE:
-+    case COGL_GPU_INFO_ARCHITECTURE_SOFTPIPE:
-+    case COGL_GPU_INFO_ARCHITECTURE_SWRAST:
-+      break;
-+    }
-+
-+  kms_fd = meta_gpu_kms_get_fd (primary_gpu);
-+  if (drmGetCap (kms_fd, DRM_CAP_DUMB_PREFER_SHADOW, &prefer_shadow) == 0)
-+    {
-+      if (prefer_shadow)
-+        {
-+          static gboolean logged_once = FALSE;
-+
-+          if (!logged_once)
-+            {
-+              g_message ("Forcing shadow framebuffer");
-+              logged_once = TRUE;
-+            }
-+
-+          return TRUE;
-+        }
-+    }
-+
-+  return FALSE;
-+}
-+
- static MetaRendererView *
- meta_renderer_native_create_view (MetaRenderer       *renderer,
-                                   MetaLogicalMonitor *logical_monitor)
- {
-   MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     renderer_native->monitor_manager_kms;
-   MetaMonitorManager *monitor_manager =
-     META_MONITOR_MANAGER (monitor_manager_kms);
--  MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
--  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-   CoglContext *cogl_context =
--    clutter_backend_get_cogl_context (clutter_backend);
-+    cogl_context_from_renderer_native (renderer_native);
-   CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
-   MetaGpuKms *primary_gpu;
-   CoglDisplayEGL *cogl_display_egl;
-   CoglOnscreenEGL *onscreen_egl;
-   MetaMonitorTransform view_transform;
-   CoglOnscreen *onscreen = NULL;
-   CoglOffscreen *offscreen = NULL;
-   float scale;
-   int width, height;
-   MetaRendererView *view;
-   GError *error = NULL;
- 
-   view_transform = calculate_view_transform (monitor_manager, logical_monitor);
- 
-   if (meta_is_stage_views_scaled ())
-     scale = meta_logical_monitor_get_scale (logical_monitor);
-   else
-     scale = 1.0;
- 
-   width = roundf (logical_monitor->rect.width * scale);
-   height = roundf (logical_monitor->rect.height * scale);
- 
-   primary_gpu = meta_monitor_manager_kms_get_primary_gpu (monitor_manager_kms);
-   onscreen = meta_renderer_native_create_onscreen (renderer_native,
-                                                    primary_gpu,
-                                                    logical_monitor,
-                                                    cogl_context,
-                                                    view_transform,
-                                                    width,
-                                                    height,
-                                                    &error);
-   if (!onscreen)
-     g_error ("Failed to allocate onscreen framebuffer: %s", error->message);
- 
--  if (view_transform != META_MONITOR_TRANSFORM_NORMAL)
-+  if (view_transform != META_MONITOR_TRANSFORM_NORMAL ||
-+      should_force_shadow_fb (renderer_native, primary_gpu))
-     {
-       offscreen = meta_renderer_native_create_offscreen (renderer_native,
-                                                          cogl_context,
-                                                          view_transform,
-                                                          width,
-                                                          height,
-                                                          &error);
-       if (!offscreen)
-         g_error ("Failed to allocate back buffer texture: %s", error->message);
-     }
- 
-   view = g_object_new (META_TYPE_RENDERER_VIEW,
-                        "layout", &logical_monitor->rect,
-                        "scale", scale,
-                        "framebuffer", onscreen,
-                        "offscreen", offscreen,
-                        "logical-monitor", logical_monitor,
-                        "transform", view_transform,
-                        NULL);
-   g_clear_pointer (&offscreen, cogl_object_unref);
- 
-   meta_onscreen_native_set_view (onscreen, view);
- 
-   if (!meta_onscreen_native_allocate (onscreen, &error))
-     {
-       g_warning ("Could not create onscreen: %s", error->message);
-       cogl_object_unref (onscreen);
-       g_object_unref (view);
-       g_error_free (error);
-       return NULL;
--- 
-2.17.1
-
diff --git a/SOURCES/0001-screen-cast-Fix-monitor-recording-on-HiDPI.patch b/SOURCES/0001-screen-cast-Fix-monitor-recording-on-HiDPI.patch
deleted file mode 100644
index 13cfe0b..0000000
--- a/SOURCES/0001-screen-cast-Fix-monitor-recording-on-HiDPI.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 3fa6a92cc5dda6ab3939c3e982185f6caf453360 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 25 Jan 2019 22:06:39 +0100
-Subject: [PATCH] screen-cast: Fix monitor recording on HiDPI
-
-It scaled the logical monitor rect with scale to get the stream
-dimensions, but that is only valid when having
-'scale-monitor-framebuffers' enabled. Even when it was, it didn't work
-properly, as clutter_stage_capture_into() doesn't work properly with
-scaled monitor framebuffers yet.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/415
----
- src/backends/meta-screen-cast-monitor-stream-src.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
-index 897b86ae6..036c573a5 100644
---- a/src/backends/meta-screen-cast-monitor-stream-src.c
-+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
-@@ -102,7 +102,11 @@ meta_screen_cast_monitor_stream_src_get_specs (MetaScreenCastStreamSrc *src,
-   logical_monitor = meta_monitor_get_logical_monitor (monitor);
-   mode = meta_monitor_get_current_mode (monitor);
- 
--  scale = logical_monitor->scale;
-+  if (meta_is_stage_views_scaled ())
-+    scale = logical_monitor->scale;
-+  else
-+    scale = 1.0;
-+
-   *width = (int) roundf (logical_monitor->rect.width * scale);
-   *height = (int) roundf (logical_monitor->rect.height * scale);
-   *frame_rate = meta_monitor_mode_get_refresh_rate (mode);
--- 
-2.20.1
-
diff --git a/SOURCES/0001-virtual-input-evdev-Translate-from-button-codes-inte.patch b/SOURCES/0001-virtual-input-evdev-Translate-from-button-codes-inte.patch
deleted file mode 100644
index 880ee57..0000000
--- a/SOURCES/0001-virtual-input-evdev-Translate-from-button-codes-inte.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From f73524d6fcc45f42790d1fdad718f52f98ef793a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 6 Aug 2018 21:00:23 +0200
-Subject: [PATCH] virtual-input/evdev: Translate from button codes internal to
- evdev
-
-Sending button events to a ClutterVirtualInputDevice, the API expects
-button codes to be of the internal clutter type. The evdev
-implementation incorrectly assumed it was already prepared evdev event
-codes, which was not the case. Fix the evdev implementation to translate
-from the internal representation to evdev before passing it along to
-ClutterSeatEvdev.
----
- .../clutter-virtual-input-device-evdev.c      | 31 +++++++++++++++----
- 1 file changed, 25 insertions(+), 6 deletions(-)
-
-diff --git a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
-index fe628da855..e491416c4c 100644
---- a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
-+++ b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
-@@ -185,6 +185,22 @@ clutter_virtual_input_device_evdev_notify_absolute_motion (ClutterVirtualInputDe
-                                              NULL);
- }
- 
-+static int
-+translate_to_evdev_button (int button)
-+{
-+  switch (button)
-+    {
-+    case CLUTTER_BUTTON_PRIMARY:
-+      return BTN_LEFT;
-+    case CLUTTER_BUTTON_SECONDARY:
-+      return BTN_RIGHT;
-+    case CLUTTER_BUTTON_MIDDLE:
-+      return BTN_MIDDLE;
-+    default:
-+      return button + (BTN_LEFT - 1) - 4;
-+    }
-+}
-+
- static void
- clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *virtual_device,
-                                                   uint64_t                   time_us,
-@@ -194,30 +210,33 @@ clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *vir
-   ClutterVirtualInputDeviceEvdev *virtual_evdev =
-     CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
-   int button_count;
-+  int evdev_button;
- 
-   if (time_us == CLUTTER_CURRENT_TIME)
-     time_us = g_get_monotonic_time ();
- 
--  if (get_button_type (button) != EVDEV_BUTTON_TYPE_BUTTON)
-+  evdev_button = translate_to_evdev_button (button);
-+
-+  if (get_button_type (evdev_button) != EVDEV_BUTTON_TYPE_BUTTON)
-     {
-       g_warning ("Unknown/invalid virtual device button 0x%x pressed",
--                 button);
-+                 evdev_button);
-       return;
-     }
- 
--  button_count = update_button_count (virtual_evdev, button, button_state);
-+  button_count = update_button_count (virtual_evdev, evdev_button, button_state);
-   if (button_count < 0 || button_count > 1)
-     {
--      g_warning ("Received multiple virtual 0x%x button %s (ignoring)", button,
-+      g_warning ("Received multiple virtual 0x%x button %s (ignoring)", evdev_button,
-                  button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
--      update_button_count (virtual_evdev, button, 1 - button_state);
-+      update_button_count (virtual_evdev, evdev_button, 1 - button_state);
-       return;
-     }
- 
-   clutter_seat_evdev_notify_button (virtual_evdev->seat,
-                                     virtual_evdev->device,
-                                     time_us,
--                                    button,
-+                                    evdev_button,
-                                     button_state);
- }
- 
--- 
-2.17.1
-
diff --git a/SOURCES/0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch b/SOURCES/0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch
index 2c14c03..83f42ff 100644
--- a/SOURCES/0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch
+++ b/SOURCES/0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch
@@ -1,4 +1,4 @@
-From d951730695ec30987f8bf1cb95910720ecca8de7 Mon Sep 17 00:00:00 2001
+From 9dfe362f41b8811450cb563c39899fafe8ec2b63 Mon Sep 17 00:00:00 2001
 From: Olivier Fourdan <ofourdan@redhat.com>
 Date: Fri, 26 Oct 2018 08:49:39 +0200
 Subject: [PATCH] wayland: Allow Xwayland grabs on selected apps
@@ -31,5 +31,5 @@ index 48241296e..7a6ab9288 100644
        <description>
          List the resource names or resource class of X11 windows either
 -- 
-2.19.1
+2.21.0
 
diff --git a/SOURCES/0001-wayland-Always-realize-buffers-at-surface-commit-tim.patch b/SOURCES/0001-wayland-Always-realize-buffers-at-surface-commit-tim.patch
deleted file mode 100644
index 53e001d..0000000
--- a/SOURCES/0001-wayland-Always-realize-buffers-at-surface-commit-tim.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From f965b963844ef41e75b42f81005e4675df94e10c Mon Sep 17 00:00:00 2001
-From: "Miguel A. Vico" <mvicomoya@nvidia.com>
-Date: Sat, 6 May 2017 03:41:51 +0200
-Subject: [PATCH] wayland: Always realize buffers at surface commit time
-
-Clients using EGLStream-backed buffers will expect the stream to be
-functional after wl_surface::attach(). That means the compositor-side
-stream must be created and a consumer attached to it.
-
-To resolve the above, this change realizes buffers even when the attach
-operation is deferred (e.g. synchronized subsurfaces).
-
-https://bugzilla.gnome.org/show_bug.cgi?id=782575
-
-(cherry picked from commit 22723ca37173955d8ef4c6981795e91a85f4feb9)
----
- src/wayland/meta-wayland-buffer.c  | 21 +++++++++------------
- src/wayland/meta-wayland-buffer.h  |  2 ++
- src/wayland/meta-wayland-surface.c |  4 ++++
- 3 files changed, 15 insertions(+), 12 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
-index 3396f45..b4b1e78 100644
---- a/src/wayland/meta-wayland-buffer.c
-+++ b/src/wayland/meta-wayland-buffer.c
-@@ -94,13 +94,13 @@ meta_wayland_buffer_get_resource (MetaWaylandBuffer *buffer)
-   return buffer->resource;
- }
- 
--static gboolean
-+gboolean
- meta_wayland_buffer_is_realized (MetaWaylandBuffer *buffer)
- {
-   return buffer->type != META_WAYLAND_BUFFER_TYPE_UNKNOWN;
- }
- 
--static gboolean
-+gboolean
- meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
- {
-   EGLint format;
-@@ -131,13 +131,12 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
-     {
-       CoglTexture2D *texture;
- 
--      buffer->egl_stream.stream = stream;
--      buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
--
-       texture = meta_wayland_egl_stream_create_texture (stream, NULL);
-       if (!texture)
-         return FALSE;
- 
-+      buffer->egl_stream.stream = stream;
-+      buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
-       buffer->texture = COGL_TEXTURE (texture);
-       buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
- 
-@@ -344,13 +343,11 @@ meta_wayland_buffer_attach (MetaWaylandBuffer *buffer,
- 
-   if (!meta_wayland_buffer_is_realized (buffer))
-     {
--      if (!meta_wayland_buffer_realize (buffer))
--        {
--          g_set_error (error, G_IO_ERROR,
--                       G_IO_ERROR_FAILED,
--                       "Unknown buffer type");
--          return FALSE;
--        }
-+      /* The buffer should have been realized at surface commit time */
-+      g_set_error (error, G_IO_ERROR,
-+                   G_IO_ERROR_FAILED,
-+                   "Unknown buffer type");
-+      return FALSE;
-     }
- 
-   switch (buffer->type)
-diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
-index e00a41e..036f9d4 100644
---- a/src/wayland/meta-wayland-buffer.h
-+++ b/src/wayland/meta-wayland-buffer.h
-@@ -69,6 +69,8 @@ G_DECLARE_FINAL_TYPE (MetaWaylandBuffer, meta_wayland_buffer,
- 
- MetaWaylandBuffer *     meta_wayland_buffer_from_resource       (struct wl_resource    *resource);
- struct wl_resource *    meta_wayland_buffer_get_resource        (MetaWaylandBuffer     *buffer);
-+gboolean                meta_wayland_buffer_is_realized         (MetaWaylandBuffer     *buffer);
-+gboolean                meta_wayland_buffer_realize             (MetaWaylandBuffer     *buffer);
- gboolean                meta_wayland_buffer_attach              (MetaWaylandBuffer     *buffer,
-                                                                  GError               **error);
- CoglTexture *           meta_wayland_buffer_get_texture         (MetaWaylandBuffer     *buffer);
-diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
-index c9c229e..3c9a404 100644
---- a/src/wayland/meta-wayland-surface.c
-+++ b/src/wayland/meta-wayland-surface.c
-@@ -765,6 +765,10 @@ cleanup:
- static void
- meta_wayland_surface_commit (MetaWaylandSurface *surface)
- {
-+  if (surface->pending->buffer &&
-+      !meta_wayland_buffer_is_realized (surface->pending->buffer))
-+    meta_wayland_buffer_realize (surface->pending->buffer);
-+
-   /*
-    * If this is a sub-surface and it is in effective synchronous mode, only
-    * cache the pending surface state until either one of the following two
--- 
-2.19.1
-
diff --git a/SOURCES/0001-wayland-Clean-up-xwayland-grabs-even-if-surface-is-g.patch b/SOURCES/0001-wayland-Clean-up-xwayland-grabs-even-if-surface-is-g.patch
deleted file mode 100644
index d0c51ba..0000000
--- a/SOURCES/0001-wayland-Clean-up-xwayland-grabs-even-if-surface-is-g.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 5b9f5329bd922f7048084977102f23ad2845311e Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Fri, 3 Aug 2018 10:50:32 +0200
-Subject: [PATCH] wayland: Clean up xwayland grabs even if surface is gone
-
-If the surface is gone before `meta_xwayland_keyboard_grab_end()` is
-called, we would bail out early leaving an empty grab, which will cause
-a segfault as soon as a key is pressed later on.
-
-Make sure we clean up the keyboard grab even if the surface is gone.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/255
-(cherry picked from commit 252dd524390dcdbdd89534c0014d22a796957f55)
----
- src/wayland/meta-xwayland-grab-keyboard.c | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/src/wayland/meta-xwayland-grab-keyboard.c b/src/wayland/meta-xwayland-grab-keyboard.c
-index 42b194a77..db2d5f0bd 100644
---- a/src/wayland/meta-xwayland-grab-keyboard.c
-+++ b/src/wayland/meta-xwayland-grab-keyboard.c
-@@ -85,6 +85,13 @@ meta_xwayland_keyboard_grab_end (MetaXwaylandKeyboardActiveGrab *active_grab)
- {
-   MetaWaylandSeat *seat = active_grab->seat;
- 
-+  if (seat->keyboard->grab->interface->key == meta_xwayland_keyboard_grab_key)
-+    {
-+      meta_wayland_keyboard_end_grab (active_grab->keyboard_grab.keyboard);
-+      meta_wayland_keyboard_set_focus (active_grab->keyboard_grab.keyboard, NULL);
-+      meta_display_sync_wayland_input_focus (meta_get_display ());
-+    }
-+
-   if (!active_grab->surface)
-     return;
- 
-@@ -104,13 +111,6 @@ meta_xwayland_keyboard_grab_end (MetaXwaylandKeyboardActiveGrab *active_grab)
-       active_grab->window_associate_handler = 0;
-     }
- 
--  if (seat->keyboard->grab->interface->key == meta_xwayland_keyboard_grab_key)
--    {
--      meta_wayland_keyboard_end_grab (active_grab->keyboard_grab.keyboard);
--      meta_wayland_keyboard_set_focus (active_grab->keyboard_grab.keyboard, NULL);
--      meta_display_sync_wayland_input_focus (meta_get_display ());
--    }
--
-   active_grab->surface = NULL;
- }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0001-wayland-Create-EGLStream-backed-buffers-through-wl_e.patch b/SOURCES/0001-wayland-Create-EGLStream-backed-buffers-through-wl_e.patch
deleted file mode 100644
index ac932e6..0000000
--- a/SOURCES/0001-wayland-Create-EGLStream-backed-buffers-through-wl_e.patch
+++ /dev/null
@@ -1,245 +0,0 @@
-From 04f59617e14d266c9d82b3f37a79db9467697dcf Mon Sep 17 00:00:00 2001
-From: "Miguel A. Vico" <mvicomoya@nvidia.com>
-Date: Tue, 27 Jun 2017 16:37:30 -0700
-Subject: [PATCH] wayland: Create EGLStream-backed buffers through
- wl_eglstream_controller
-
-One of the current limitations of EGLStreams is that there's no way to
-resize a surface consumer without re-creating the entire stream.
-
-Therefore, while resizing, clients will send wl_surface::attach requests
-so the compositor can re-create its endpoint of the stream, but no
-buffer will be available actually. If we proceed with the rest of the
-attach operation we'll be presenting an empty buffer.
-
-In order to fix this, a separate wl_eglstream_controller protocol has
-been introduced that clients can use to request a stream re-creation
-without overloading wl_surface::attach for that purpose.
-
-This change adds the required logic to create the corresponding
-wl_eglstream_controller global interface that clients can bind to.
-
-Whenever a client requests a stream to be created, we just need to
-create and realize the new EGLStream buffer. The same buffer resource
-will be given at a later time to wl_surface::attach, whenever new
-content is made available by the application, so we can proceed to
-acquire the stream buffer and update the surface state.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=782575
-
-(cherry picked from commit 435b3c4bdb62edcbb4b400223ddf7e44613efa54)
----
- configure.ac                          | 12 ++++
- src/Makefile.am                       |  8 +++
- src/wayland/meta-wayland-egl-stream.c | 98 +++++++++++++++++++++++++++
- src/wayland/meta-wayland-egl-stream.h |  2 +
- src/wayland/meta-wayland.c            |  4 ++
- 6 files changed, 125 insertions(+)
-
-diff --git a/configure.ac b/configure.ac
-index e795159a1..cfb098d20 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -290,13 +290,24 @@ AS_IF([test "$have_native_backend" = "yes"], [
- ])
- AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
- 
-+MUTTER_WAYLAND_EGLSTREAM_MODULES="wayland-eglstream-protocols"
-+
- AC_ARG_ENABLE(egl-device,
-   AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),,
-   enable_egl_device=no
-+  have_wayland_eglstream=no
- )
- AS_IF([test "$enable_egl_device" = "yes"], [
-   AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled])
-+  PKG_CHECK_EXISTS([$MUTTER_WAYLAND_EGLSTREAM_MODULES], [have_wayland_eglstream=yes], [have_wayland_eglstream=no])
-+])
-+AS_IF([test "$have_wayland_eglstream" = "yes"], [
-+  AC_DEFINE([HAVE_WAYLAND_EGLSTREAM],[1],[Defined if Wayland EGLStream protocols are available])
-+  PKG_CHECK_MODULES(WAYLAND_EGLSTREAM, [$MUTTER_WAYLAND_EGLSTREAM_MODULES],
-+                    [ac_wayland_eglstream_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir $MUTTER_WAYLAND_EGLSTREAM_MODULES`])
-+  AC_SUBST(WAYLAND_EGLSTREAM_DATADIR, $ac_wayland_eglstream_pkgdatadir)
- ])
-+AM_CONDITIONAL([HAVE_WAYLAND_EGLSTREAM],[test "$have_wayland_eglstream" = "yes"])
- 
- MUTTER_WAYLAND_MODULES="wayland-server >= 1.13.0"
- 
-@@ -549,6 +560,7 @@ mutter-$VERSION
- 	Introspection:            ${found_introspection}
- 	Session management:       ${found_sm}
- 	Wayland:                  ${have_wayland}
-+	Wayland EGLStream:        ${have_wayland_eglstream}
- 	Native (KMS) backend:     ${have_native_backend}
- 	EGLDevice:                ${enable_egl_device}
- 	Remote desktop:           ${enable_remote_desktop}
-diff --git a/src/Makefile.am b/src/Makefile.am
-index bcb3505c7..6c4f872cb 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -91,6 +91,12 @@ mutter_built_sources += \
- 	gtk-text-input-protocol.c					\
- 	gtk-text-input-server-protocol.h				\
- 	$(NULL)
-+
-+if HAVE_WAYLAND_EGLSTREAM
-+mutter_built_sources += \
-+	wayland-eglstream-controller-server-protocol.h \
-+	$(NULL)
-+endif
- endif
- 
- wayland_protocols =				\
-@@ -760,3 +766,5 @@ endef
- 	$(AM_V_GEN)$(WAYLAND_SCANNER) code $< $@
- %-server-protocol.h : $(srcdir)/wayland/protocol/%.xml
- 	$(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
-+%-server-protocol.h : $(WAYLAND_EGLSTREAM_DATADIR)/%.xml
-+	$(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
-diff --git a/src/wayland/meta-wayland-egl-stream.c b/src/wayland/meta-wayland-egl-stream.c
-index 39ff93433..0d7ce2304 100644
---- a/src/wayland/meta-wayland-egl-stream.c
-+++ b/src/wayland/meta-wayland-egl-stream.c
-@@ -32,6 +32,104 @@
- #include "backends/meta-egl-ext.h"
- #include "meta/meta-backend.h"
- #include "wayland/meta-wayland-buffer.h"
-+#include "wayland/meta-wayland-private.h"
-+
-+#ifdef HAVE_WAYLAND_EGLSTREAM
-+
-+#include "wayland-eglstream-controller-server-protocol.h"
-+#include <dlfcn.h>
-+
-+static struct wl_interface *wl_eglstream_controller_interface_ptr = NULL;
-+
-+static void
-+attach_eglstream_consumer (struct wl_client   *client,
-+                           struct wl_resource *resource,
-+                           struct wl_resource *wl_surface,
-+                           struct wl_resource *wl_eglstream)
-+{
-+  MetaWaylandBuffer *buffer = meta_wayland_buffer_from_resource (wl_eglstream);
-+
-+  if (!meta_wayland_buffer_is_realized (buffer))
-+    meta_wayland_buffer_realize (buffer);
-+}
-+
-+static const struct wl_eglstream_controller_interface
-+meta_eglstream_controller_interface = {
-+  attach_eglstream_consumer
-+};
-+
-+static void
-+bind_eglstream_controller (struct wl_client *client,
-+                           void             *data,
-+                           uint32_t          version,
-+                           uint32_t          id)
-+{
-+  struct wl_resource *resource;
-+
-+  g_assert (wl_eglstream_controller_interface_ptr != NULL);
-+
-+  resource = wl_resource_create (client,
-+                                 wl_eglstream_controller_interface_ptr,
-+                                 version,
-+                                 id);
-+
-+  if (resource == NULL)
-+    {
-+      wl_client_post_no_memory(client);
-+      return;
-+    }
-+
-+  wl_resource_set_implementation (resource,
-+                                  &meta_eglstream_controller_interface,
-+                                  data,
-+                                  NULL);
-+}
-+
-+#endif /* HAVE_WAYLAND_EGLSTREAM */
-+
-+gboolean
-+meta_wayland_eglstream_controller_init (MetaWaylandCompositor *compositor)
-+{
-+#ifdef HAVE_WAYLAND_EGLSTREAM
-+  /*
-+   * wl_eglstream_controller_interface is provided by
-+   * libnvidia-egl-wayland.so.1
-+   *
-+   * Since it might not be available on the
-+   * system, dynamically load it at runtime and resolve the needed
-+   * symbols. If available, it should be found under any of the search
-+   * directories of dlopen()
-+   *
-+   * Failure to initialize wl_eglstream_controller is non-fatal
-+   */
-+
-+  void *lib = dlopen ("libnvidia-egl-wayland.so.1", RTLD_NOW | RTLD_LAZY);
-+  if (!lib)
-+    goto fail;
-+
-+  wl_eglstream_controller_interface_ptr =
-+    dlsym (lib, "wl_eglstream_controller_interface");
-+
-+  if (!wl_eglstream_controller_interface_ptr)
-+    goto fail;
-+
-+  if (wl_global_create (compositor->wayland_display,
-+                        wl_eglstream_controller_interface_ptr, 1,
-+                        NULL,
-+                        bind_eglstream_controller) == NULL)
-+    goto fail;
-+
-+  return TRUE;
-+
-+fail:
-+  if (lib)
-+    dlclose(lib);
-+
-+  g_debug ("WL: Unable to initialize wl_eglstream_controller.");
-+#endif
-+
-+  return FALSE;
-+}
- 
- struct _MetaWaylandEglStream
- {
-diff --git a/src/wayland/meta-wayland-egl-stream.h b/src/wayland/meta-wayland-egl-stream.h
-index 12a011f78..fe488ed54 100644
---- a/src/wayland/meta-wayland-egl-stream.h
-+++ b/src/wayland/meta-wayland-egl-stream.h
-@@ -31,6 +31,8 @@
- #include "cogl/cogl.h"
- #include "wayland/meta-wayland-types.h"
- 
-+gboolean meta_wayland_eglstream_controller_init (MetaWaylandCompositor *compositor);
-+
- #define META_TYPE_WAYLAND_EGL_STREAM (meta_wayland_egl_stream_get_type ())
- G_DECLARE_FINAL_TYPE (MetaWaylandEglStream, meta_wayland_egl_stream,
-                       META, WAYLAND_EGL_STREAM, GObject);
-diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
-index bab6b4ac4..9d416b20e 100644
---- a/src/wayland/meta-wayland.c
-+++ b/src/wayland/meta-wayland.c
-@@ -46,6 +46,8 @@
- #include "meta-wayland-inhibit-shortcuts.h"
- #include "meta-wayland-inhibit-shortcuts-dialog.h"
- #include "meta-xwayland-grab-keyboard.h"
-+#include "meta-xwayland.h"
-+#include "meta-wayland-egl-stream.h"
- 
- static MetaWaylandCompositor _meta_wayland_compositor;
- static char *_display_name_override;
-@@ -394,6 +396,8 @@ meta_wayland_init (void)
-                                   meta_xwayland_global_filter,
-                                   compositor);
- 
-+  meta_wayland_eglstream_controller_init (compositor);
-+
-   if (!meta_xwayland_start (&compositor->xwayland_manager, compositor->wayland_display))
-     g_error ("Failed to start X Wayland");
- 
--- 
-2.19.1
-
diff --git a/SOURCES/0001-wayland-No-xdg-output-events-without-a-logical-monit.patch b/SOURCES/0001-wayland-No-xdg-output-events-without-a-logical-monit.patch
deleted file mode 100644
index 4963f52..0000000
--- a/SOURCES/0001-wayland-No-xdg-output-events-without-a-logical-monit.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 6ed36cd6e36e9bd15ae4ca39f5b8163c4740c484 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 25 Sep 2018 13:50:09 +0200
-Subject: [PATCH] wayland: No xdg-output events without a logical monitor
-
-To avoid a known race condition in the wl_output protocol documented in
-https://phabricator.freedesktop.org/T7722, mutter delays the `wl_output`
-destruction but nullify the `logical_monitor` associated with the
-`wl_output` and the binding routine `bind_output()` makes sure not to
-send wl_output events if the `logical_monitor` is `NULL` (see commit
-1923db97).
-
-The binding routine for `xdg_output` however does not check for such a
-condition, hence if the output configuration changes while a client is
-binding to xdg-output (typically Xwayland at startup), mutter would
-crash while trying to access the `logical_monitor` which was nullified
-by the change in configuration.
-
-Just like `bind_output()` does for wl_output, do not send xdg-output
-events if there is no `logical_monitor` yet.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/194
-
-(cherry picked from commit 68ec9ac017157def9b7c25dd8141dc0e93d9f918)
----
- src/wayland/meta-wayland-outputs.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
-index bc67b90be..1f99a163d 100644
---- a/src/wayland/meta-wayland-outputs.c
-+++ b/src/wayland/meta-wayland-outputs.c
-@@ -592,6 +592,9 @@ meta_xdg_output_manager_get_xdg_output (struct wl_client   *client,
-   wayland_output->xdg_output_resources =
-     g_list_prepend (wayland_output->xdg_output_resources, xdg_output_resource);
- 
-+  if (!wayland_output->logical_monitor)
-+    return;
-+
-   send_xdg_output_events (xdg_output_resource,
-                           wayland_output,
-                           wayland_output->logical_monitor,
--- 
-2.19.0
-
diff --git a/SOURCES/0001-wayland-Nullify-monitor-resources-when-updating-outp.patch b/SOURCES/0001-wayland-Nullify-monitor-resources-when-updating-outp.patch
deleted file mode 100644
index cc25ac4..0000000
--- a/SOURCES/0001-wayland-Nullify-monitor-resources-when-updating-outp.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From f45af3315d4f11e16fc998322e4b407437259ce1 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Fri, 27 Jul 2018 16:32:31 +0000
-Subject: [PATCH] wayland: Nullify monitor resources when updating outputs
-
-If a client asks for xdg-output before we have set the output's logical
-monitor, we would end up crashing with a NULL pointer dereference.
-
-Make sure we clear the resource's user data when marking an output as
-inert on monitor change so that we don't end up with a Wayland output
-without a logical monitor.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/194
-
-
-(cherry picked from commit 48eaa36d41bb88d4831e40e9c3ef3c7afda195bc)
----
- src/wayland/meta-wayland-outputs.c | 52 ++++++++++++++++++------------
- 1 file changed, 31 insertions(+), 21 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
-index 509527d38..bc67b90be 100644
---- a/src/wayland/meta-wayland-outputs.c
-+++ b/src/wayland/meta-wayland-outputs.c
-@@ -365,12 +365,38 @@ meta_wayland_output_new (MetaWaylandCompositor *compositor,
- }
- 
- static void
--nullify_logical_monitor (gpointer key,
--                         gpointer value,
--                         gpointer data)
-+make_output_resources_inert (MetaWaylandOutput *wayland_output)
-+{
-+  GList *l;
-+
-+  for (l = wayland_output->resources; l; l = l->next)
-+    {
-+      struct wl_resource *output_resource = l->data;
-+
-+      wl_resource_set_user_data (output_resource, NULL);
-+    }
-+  g_list_free (wayland_output->resources);
-+  wayland_output->resources = NULL;
-+
-+  for (l = wayland_output->xdg_output_resources; l; l = l->next)
-+    {
-+      struct wl_resource *xdg_output_resource = l->data;
-+
-+      wl_resource_set_user_data (xdg_output_resource, NULL);
-+    }
-+  g_list_free (wayland_output->xdg_output_resources);
-+  wayland_output->xdg_output_resources = NULL;
-+}
-+
-+static void
-+make_output_inert (gpointer key,
-+                   gpointer value,
-+                   gpointer data)
- {
-   MetaWaylandOutput *wayland_output = value;
-+
-   wayland_output->logical_monitor = NULL;
-+  make_output_resources_inert (wayland_output);
- }
- 
- static gboolean
-@@ -420,7 +446,7 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
-                            wayland_output);
-     }
- 
--  g_hash_table_foreach (compositor->outputs, nullify_logical_monitor, NULL);
-+  g_hash_table_foreach (compositor->outputs, make_output_inert, NULL);
-   g_timeout_add_seconds (10, delayed_destroy_outputs, compositor->outputs);
- 
-   return new_table;
-@@ -449,23 +475,7 @@ meta_wayland_output_finalize (GObject *object)
-   /* Make sure the wl_output destructor doesn't try to access MetaWaylandOutput
-    * after we have freed it.
-    */
--  for (l = wayland_output->resources; l; l = l->next)
--    {
--      struct wl_resource *output_resource = l->data;
--
--      wl_resource_set_user_data (output_resource, NULL);
--    }
--
--  g_list_free (wayland_output->resources);
--
--  for (l = wayland_output->xdg_output_resources; l; l = l->next)
--    {
--      struct wl_resource *xdg_output_resource = l->data;
--
--      wl_resource_set_user_data (xdg_output_resource, NULL);
--    }
--
--  g_list_free (wayland_output->xdg_output_resources);
-+  make_output_resources_inert (wayland_output);
- 
-   G_OBJECT_CLASS (meta_wayland_output_parent_class)->finalize (object);
- }
--- 
-2.19.0
-
diff --git a/SOURCES/0001-wayland-Realize-dmabuf-buffers-before-trying-to-atta.patch b/SOURCES/0001-wayland-Realize-dmabuf-buffers-before-trying-to-atta.patch
deleted file mode 100644
index 8327800..0000000
--- a/SOURCES/0001-wayland-Realize-dmabuf-buffers-before-trying-to-atta.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 9ac07b40052b02d5b3aeb268fa64b4583dd53abd Mon Sep 17 00:00:00 2001
-From: "Miguel A. Vico" <mvicomoya@nvidia.com>
-Date: Thu, 21 Jun 2018 02:53:15 +0000
-Subject: [PATCH] wayland: Realize dmabuf buffers before trying to attach them
-
-Commit 22723ca37 moved buffer realization to
-meta_wayland_surface_commit() so that it wouldn't be part of
-meta_wayland_buffer_attach().
-
-However, creation of dmabuf buffers would call into
-meta_wayland_buffer_attach() directly without realizing the buffer
-first. attach() would then fail and mutter would effectively shut down
-any clients using the zwp_linux_dmabuf protocol (note that if such
-client was Xwayland, mutter itself would shut down as well).
-
-Add the missing bit in order to make zwp_linux_dmabuf protocol work
-again.
-
-
-(cherry picked from commit 54709c16b56a308d2254c56a35d042bf8b8e124f)
----
- src/wayland/meta-wayland-dma-buf.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/wayland/meta-wayland-dma-buf.c b/src/wayland/meta-wayland-dma-buf.c
-index 76b8aa219..e72c53935 100644
---- a/src/wayland/meta-wayland-dma-buf.c
-+++ b/src/wayland/meta-wayland-dma-buf.c
-@@ -365,6 +365,7 @@ buffer_params_create_common (struct wl_client   *client,
-                                   dma_buf, NULL);
-   buffer = meta_wayland_buffer_from_resource (buffer_resource);
- 
-+  meta_wayland_buffer_realize (buffer);
-   if (!meta_wayland_buffer_attach (buffer, &error))
-     {
-       if (buffer_id == 0)
--- 
-2.19.1
-
diff --git a/SOURCES/0001-wayland-Relax-requirements-for-evdev-events-to-have-.patch b/SOURCES/0001-wayland-Relax-requirements-for-evdev-events-to-have-.patch
deleted file mode 100644
index b632f2c..0000000
--- a/SOURCES/0001-wayland-Relax-requirements-for-evdev-events-to-have-.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 35b69c1af4af996fb4cdac329a941a155569d810 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Thu, 27 Sep 2018 21:05:30 +0200
-Subject: [PATCH] wayland: Relax requirements for evdev events to have a evcode
-
-There may be emulated events that don't contain those, it's fine to
-go through the fallback paths for these.
----
- src/wayland/meta-wayland-keyboard.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
-index e3ba4f000..4ffe146d5 100644
---- a/src/wayland/meta-wayland-keyboard.c
-+++ b/src/wayland/meta-wayland-keyboard.c
-@@ -633,7 +633,7 @@ default_grab_key (MetaWaylandKeyboardGrab *grab,
- {
-   MetaWaylandKeyboard *keyboard = grab->keyboard;
-   gboolean is_press = event->type == CLUTTER_KEY_PRESS;
--  guint32 code;
-+  guint32 code = 0;
- #ifdef HAVE_NATIVE_BACKEND
-   MetaBackend *backend = meta_get_backend ();
- #endif
-@@ -647,7 +647,7 @@ default_grab_key (MetaWaylandKeyboardGrab *grab,
- #ifdef HAVE_NATIVE_BACKEND
-   if (META_IS_BACKEND_NATIVE (backend))
-     code = clutter_evdev_event_get_event_code (event);
--  else
-+  if (code == 0)
- #endif
-     code = evdev_code (&event->key);
- 
--- 
-2.20.1
-
diff --git a/SOURCES/0001-wayland-buffer-Create-EGLStream-texture-at-buffer_re.patch b/SOURCES/0001-wayland-buffer-Create-EGLStream-texture-at-buffer_re.patch
deleted file mode 100644
index 6a3b8fc..0000000
--- a/SOURCES/0001-wayland-buffer-Create-EGLStream-texture-at-buffer_re.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From 53b040be5c55bf4b283599d2a912cb072937afd4 Mon Sep 17 00:00:00 2001
-From: "Miguel A. Vico" <mvicomoya@nvidia.com>
-Date: Sat, 6 May 2017 01:23:57 +0000
-Subject: [PATCH] wayland-buffer: Create EGLStream texture at buffer_realize
- time
-
-When dealing with synchronized subsurfaces, we defer buffer attachments
-until the parent surface state is applied.
-
-That causes interaction issues with EGLStream backed buffers, as the
-client expects the compositor-side stream to be functional after it
-requests a wl_surface::attach.
-
-By allowing the compositor to realize buffers without attaching them, we
-could resolve the issue above if we define a realized EGLStream buffer
-as a functional EGLStream (EGLStream + attached consumer).
-
-This change moves the texture consumer creation part from the attach
-function to the realize one.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=782575
-
-
-(cherry picked from commit edd3634bb52a8efc687c612152fda5c996e94d26)
----
- src/wayland/meta-wayland-buffer.c | 22 ++++++++++------------
- 1 file changed, 10 insertions(+), 12 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
-index 55564492a..6f4fd24bf 100644
---- a/src/wayland/meta-wayland-buffer.c
-+++ b/src/wayland/meta-wayland-buffer.c
-@@ -123,8 +123,18 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
-   stream = meta_wayland_egl_stream_new (buffer, NULL);
-   if (stream)
-     {
-+      CoglTexture2D *texture;
-+
-       buffer->egl_stream.stream = stream;
-       buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_STREAM;
-+
-+      texture = meta_wayland_egl_stream_create_texture (stream, NULL);
-+      if (!texture)
-+        return FALSE;
-+
-+      buffer->texture = COGL_TEXTURE (texture);
-+      buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
-+
-       return TRUE;
-     }
- 
-@@ -314,18 +324,6 @@ egl_stream_buffer_attach (MetaWaylandBuffer  *buffer,
- 
-   g_assert (stream);
- 
--  if (!buffer->texture)
--    {
--      CoglTexture2D *texture;
--
--      texture = meta_wayland_egl_stream_create_texture (stream, error);
--      if (!texture)
--        return FALSE;
--
--      buffer->texture = COGL_TEXTURE (texture);
--      buffer->is_y_inverted = meta_wayland_egl_stream_is_y_inverted (stream);
--    }
--
-   if (!meta_wayland_egl_stream_attach (stream, error))
-     return FALSE;
- 
--- 
-2.19.1
-
diff --git a/SOURCES/0001-wayland-keyboard-Create-a-separate-keymap-shm-file-p.patch b/SOURCES/0001-wayland-keyboard-Create-a-separate-keymap-shm-file-p.patch
deleted file mode 100644
index 57d66f2..0000000
--- a/SOURCES/0001-wayland-keyboard-Create-a-separate-keymap-shm-file-p.patch
+++ /dev/null
@@ -1,250 +0,0 @@
-From 0d134522d83ee263cdc83ea899af59fd264bafa7 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 29 Jun 2017 12:22:47 +0800
-Subject: [PATCH] wayland/keyboard: Create a separate keymap shm file per
- resource
-
-By using the shm file when sending the keymap to all clients, we
-effectively allows any client to change the keymap, as any client has
-the ability to change the content of the file. Sending a read-only file
-descriptor, or making the file itself read-only before unlinking, can
-be worked around by the client by using chmod(2) and open(2) on
-/proc/<pid>/<fd>.
-
-Using memfd could potentially solve this issue, but as the usage of
-mmap with MAP_SHARED is wide spread among clients, such a change can
-not be introduced without causing wide spread compatibility issues.
-
-So, to avoid allowing clients to interfere with each other, create a
-separate shm file for each wl_keyboard resource when sending the
-keymap. We could eventually do this per client, but in most cases,
-there will only be one wl_keyboard resource per client anyway.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=784206
----
- src/wayland/meta-wayland-keyboard.c | 136 +++++++++++-----------------
- src/wayland/meta-wayland-keyboard.h |   3 +-
- 2 files changed, 56 insertions(+), 83 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
-index 167293ca7..aca1fe411 100644
---- a/src/wayland/meta-wayland-keyboard.c
-+++ b/src/wayland/meta-wayland-keyboard.c
-@@ -127,34 +127,65 @@ create_anonymous_file (off_t    size,
- }
- 
- static void
--inform_clients_of_new_keymap (MetaWaylandKeyboard *keyboard)
-+send_keymap (MetaWaylandKeyboard *keyboard,
-+             struct wl_resource  *resource)
- {
--  struct wl_resource *keyboard_resource;
-+  MetaWaylandXkbInfo *xkb_info = &keyboard->xkb_info;
-+  GError *error = NULL;
-+  int fd;
-+  char *keymap_area;
- 
--  wl_resource_for_each (keyboard_resource, &keyboard->resource_list)
-+  if (!xkb_info->keymap_string)
-+    return;
-+
-+  fd = create_anonymous_file (xkb_info->keymap_size, &error);
-+  if (fd < 0)
-     {
--      wl_keyboard_send_keymap (keyboard_resource,
--			       WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
--			       keyboard->xkb_info.keymap_fd,
--			       keyboard->xkb_info.keymap_size);
-+      g_warning ("Creating a keymap file for %lu bytes failed: %s",
-+                 (unsigned long) xkb_info->keymap_size,
-+                 error->message);
-+      g_clear_error (&error);
-+      return;
-     }
--  wl_resource_for_each (keyboard_resource, &keyboard->focus_resource_list)
-+
-+
-+  keymap_area = mmap (NULL, xkb_info->keymap_size,
-+                      PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-+  if (keymap_area == MAP_FAILED)
-     {
--      wl_keyboard_send_keymap (keyboard_resource,
--                               WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
--                               keyboard->xkb_info.keymap_fd,
--                               keyboard->xkb_info.keymap_size);
-+      g_warning ("Failed to mmap() %lu bytes\n",
-+                 (unsigned long) xkb_info->keymap_size);
-+      close (fd);
-+      return;
-     }
-+
-+  strcpy (keymap_area, xkb_info->keymap_string);
-+
-+  munmap (keymap_area, xkb_info->keymap_size);
-+
-+  wl_keyboard_send_keymap (resource,
-+                           WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
-+                           fd,
-+                           keyboard->xkb_info.keymap_size);
-+  close (fd);
-+}
-+
-+static void
-+inform_clients_of_new_keymap (MetaWaylandKeyboard *keyboard)
-+{
-+  struct wl_resource *keyboard_resource;
-+
-+  wl_resource_for_each (keyboard_resource, &keyboard->resource_list)
-+    send_keymap (keyboard, keyboard_resource);
-+  wl_resource_for_each (keyboard_resource, &keyboard->focus_resource_list)
-+    send_keymap (keyboard, keyboard_resource);
- }
- 
- static void
- meta_wayland_keyboard_take_keymap (MetaWaylandKeyboard *keyboard,
- 				   struct xkb_keymap   *keymap)
- {
--  MetaWaylandXkbInfo  *xkb_info = &keyboard->xkb_info;
--  GError *error = NULL;
--  char *keymap_str;
--  size_t previous_size;
-+  MetaWaylandXkbInfo *xkb_info = &keyboard->xkb_info;
- 
-   if (keymap == NULL)
-     {
-@@ -162,60 +193,24 @@ meta_wayland_keyboard_take_keymap (MetaWaylandKeyboard *keyboard,
-       return;
-     }
- 
-+  g_clear_pointer (&xkb_info->keymap_string, g_free);
-   xkb_keymap_unref (xkb_info->keymap);
-   xkb_info->keymap = xkb_keymap_ref (keymap);
- 
-   meta_wayland_keyboard_update_xkb_state (keyboard);
- 
--  keymap_str = xkb_map_get_as_string (xkb_info->keymap);
--  if (keymap_str == NULL)
-+  xkb_info->keymap_string =
-+    xkb_keymap_get_as_string (xkb_info->keymap, XKB_KEYMAP_FORMAT_TEXT_V1);
-+  if (!xkb_info->keymap_string)
-     {
--      g_warning ("failed to get string version of keymap");
-+      g_warning ("Failed to get string version of keymap");
-       return;
-     }
--  previous_size = xkb_info->keymap_size;
--  xkb_info->keymap_size = strlen (keymap_str) + 1;
--
--  if (xkb_info->keymap_fd >= 0)
--    close (xkb_info->keymap_fd);
--
--  xkb_info->keymap_fd = create_anonymous_file (xkb_info->keymap_size, &error);
--  if (xkb_info->keymap_fd < 0)
--    {
--      g_warning ("creating a keymap file for %lu bytes failed: %s",
--                 (unsigned long) xkb_info->keymap_size,
--                 error->message);
--      g_clear_error (&error);
--      goto err_keymap_str;
--    }
--
--  if (xkb_info->keymap_area)
--    munmap (xkb_info->keymap_area, previous_size);
--
--  xkb_info->keymap_area = mmap (NULL, xkb_info->keymap_size,
--                                PROT_READ | PROT_WRITE,
--                                MAP_SHARED, xkb_info->keymap_fd, 0);
--  if (xkb_info->keymap_area == MAP_FAILED)
--    {
--      g_warning ("failed to mmap() %lu bytes\n",
--                 (unsigned long) xkb_info->keymap_size);
--      goto err_dev_zero;
--    }
--  strcpy (xkb_info->keymap_area, keymap_str);
--  free (keymap_str);
-+  xkb_info->keymap_size = strlen (xkb_info->keymap_string) + 1;
- 
-   inform_clients_of_new_keymap (keyboard);
- 
-   notify_modifiers (keyboard);
--
--  return;
--
--err_dev_zero:
--  close (xkb_info->keymap_fd);
--  xkb_info->keymap_fd = -1;
--err_keymap_str:
--  free (keymap_str);
--  return;
- }
- 
- static xkb_mod_mask_t
-@@ -707,28 +702,12 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
-   maybe_restore_numlock_state (keyboard);
- }
- 
--static void
--meta_wayland_xkb_info_init (MetaWaylandXkbInfo *xkb_info)
--{
--  xkb_info->keymap_fd = -1;
--}
--
- static void
- meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
- {
-   g_clear_pointer (&xkb_info->keymap, xkb_keymap_unref);
-   g_clear_pointer (&xkb_info->state, xkb_state_unref);
--
--  if (xkb_info->keymap_area)
--    {
--      munmap (xkb_info->keymap_area, xkb_info->keymap_size);
--      xkb_info->keymap_area = NULL;
--    }
--  if (xkb_info->keymap_fd >= 0)
--    {
--      close (xkb_info->keymap_fd);
--      xkb_info->keymap_fd = -1;
--    }
-+  g_clear_pointer (&xkb_info->keymap_string, g_free);
- }
- 
- void
-@@ -1001,10 +980,7 @@ meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard,
-   wl_resource_set_implementation (resource, &keyboard_interface,
-                                   keyboard, unbind_resource);
- 
--  wl_keyboard_send_keymap (resource,
--                           WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
--                           keyboard->xkb_info.keymap_fd,
--                           keyboard->xkb_info.keymap_size);
-+  send_keymap (keyboard, resource);
- 
-   notify_key_repeat_for_resource (keyboard, resource);
- 
-@@ -1050,8 +1026,6 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard)
-   wl_list_init (&keyboard->resource_list);
-   wl_list_init (&keyboard->focus_resource_list);
- 
--  meta_wayland_xkb_info_init (&keyboard->xkb_info);
--
-   keyboard->default_grab.interface = &default_keyboard_grab_interface;
-   keyboard->default_grab.keyboard = keyboard;
-   keyboard->grab = &keyboard->default_grab;
-diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h
-index 39f06ef17..dba9fda0c 100644
---- a/src/wayland/meta-wayland-keyboard.h
-+++ b/src/wayland/meta-wayland-keyboard.h
-@@ -74,9 +74,8 @@ typedef struct
- {
-   struct xkb_keymap *keymap;
-   struct xkb_state *state;
--  int keymap_fd;
-   size_t keymap_size;
--  char *keymap_area;
-+  char *keymap_string;
- } MetaWaylandXkbInfo;
- 
- struct _MetaWaylandKeyboard
--- 
-2.19.0
-
diff --git a/SOURCES/0001-wayland-xdg-shell-Queue-frame-callbacks-on-new-actor.patch b/SOURCES/0001-wayland-xdg-shell-Queue-frame-callbacks-on-new-actor.patch
deleted file mode 100644
index dd2516c..0000000
--- a/SOURCES/0001-wayland-xdg-shell-Queue-frame-callbacks-on-new-actor.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From 998e3279c24278c947832917706cf5a31b80fa26 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 25 Jul 2018 11:49:36 +0200
-Subject: [PATCH 1/8] wayland/xdg-shell: Queue frame callbacks on new actor
- after resetting
-
-When a xdg-toplevel is reset, the window and actor are recreated, and
-all state is cleared. When this happened, we earlied out from the
-xdg-toplevel commit handler, which would mean that if the client had
-queued frame callbacks when resetting, they'd be left in the pending
-commit state, later hitting an assert as they were not handled.
-
-Fix this by queuing the frame callbacks no the new actor, so that they
-are emitted whenever the actor is eventually painted.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit d791710197205028be40750d6ee4119f2b7f0e26)
----
- src/wayland/meta-wayland-actor-surface.c | 12 ++++++++----
- src/wayland/meta-wayland-actor-surface.h |  3 +++
- src/wayland/meta-wayland-xdg-shell.c     |  5 +++++
- 3 files changed, 16 insertions(+), 4 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-actor-surface.c b/src/wayland/meta-wayland-actor-surface.c
-index c10694a2a..b6dbd3326 100644
---- a/src/wayland/meta-wayland-actor-surface.c
-+++ b/src/wayland/meta-wayland-actor-surface.c
-@@ -47,10 +47,14 @@ meta_wayland_actor_surface_assigned (MetaWaylandSurfaceRole *surface_role)
-   wl_list_init (&surface->pending_frame_callback_list);
- }
- 
--static void
--queue_surface_actor_frame_callbacks (MetaWaylandSurface      *surface,
--                                     MetaWaylandPendingState *pending)
-+void
-+meta_wayland_actor_surface_queue_frame_callbacks (MetaWaylandActorSurface *actor_surface,
-+                                                  MetaWaylandPendingState *pending)
- {
-+  MetaWaylandSurfaceRole *surface_role =
-+    META_WAYLAND_SURFACE_ROLE (actor_surface);
-+  MetaWaylandSurface *surface =
-+    meta_wayland_surface_role_get_surface (surface_role);
-   MetaSurfaceActorWayland *surface_actor =
-     META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
- 
-@@ -167,7 +171,7 @@ meta_wayland_actor_surface_commit (MetaWaylandSurfaceRole  *surface_role,
-     meta_wayland_surface_role_get_surface (surface_role);
-   MetaWaylandSurface *toplevel_surface;
- 
--  queue_surface_actor_frame_callbacks (surface, pending);
-+  meta_wayland_actor_surface_queue_frame_callbacks (actor_surface, pending);
- 
-   toplevel_surface = meta_wayland_surface_get_toplevel (surface);
-   if (!toplevel_surface || !toplevel_surface->window)
-diff --git a/src/wayland/meta-wayland-actor-surface.h b/src/wayland/meta-wayland-actor-surface.h
-index a5cc24455..ab9b229ed 100644
---- a/src/wayland/meta-wayland-actor-surface.h
-+++ b/src/wayland/meta-wayland-actor-surface.h
-@@ -40,4 +40,7 @@ void meta_wayland_actor_surface_sync_actor_state (MetaWaylandActorSurface *actor
- 
- double meta_wayland_actor_surface_calculate_scale (MetaWaylandActorSurface *actor_surface);
- 
-+void meta_wayland_actor_surface_queue_frame_callbacks (MetaWaylandActorSurface *actor_surface,
-+                                                       MetaWaylandPendingState *pending);
-+
- #endif /* META_WAYLAND_ACTOR_SURFACE_H */
-diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
-index 2b1a71b19..4ab638f74 100644
---- a/src/wayland/meta-wayland-xdg-shell.c
-+++ b/src/wayland/meta-wayland-xdg-shell.c
-@@ -626,7 +626,12 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole  *surface_role,
- 
-   if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
-     {
-+      MetaWaylandActorSurface *actor_surface =
-+        META_WAYLAND_ACTOR_SURFACE (xdg_toplevel);
-+
-       meta_wayland_xdg_surface_reset (xdg_surface);
-+      meta_wayland_actor_surface_queue_frame_callbacks (actor_surface,
-+                                                        pending);
-       return;
-     }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-Don-t-refuse-to-move-focus-to-the-grab-window.patch b/SOURCES/0001-window-Don-t-refuse-to-move-focus-to-the-grab-window.patch
deleted file mode 100644
index 5e1caeb..0000000
--- a/SOURCES/0001-window-Don-t-refuse-to-move-focus-to-the-grab-window.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 513cc535f3adb4414126f2d0e18bb11bbd93d218 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Fri, 25 May 2018 18:18:23 +0000
-Subject: [PATCH 1/3] window: Don't refuse to move focus to the grab window
-
-We refuse to move focus while a grab operation is in place. While this
-generally makes sense, there's no reason why the window that owns the
-grab shouldn't be given the regular input focus as well - we pretty
-much assume that the grab window is also the focus window anyway.
-
-In fact there's a strong reason for allowing the focus change here:
-If the grab window isn't the focus window, it probably has a modal
-transient that is focused instead, and a likely reason for the focus
-request is that the transient is being unmanaged and we must move
-the focus elsewhere.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/15
-
-
-(cherry picked from commit 148da24f9510ebd23d750b8224aa0ab3a549e69e)
----
- src/core/window.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index 743326c60..5b1eb5b68 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -4620,6 +4620,7 @@ meta_window_focus (MetaWindow  *window,
-               window->desc, window->input, window->take_focus);
- 
-   if (window->display->grab_window &&
-+      window->display->grab_window != window &&
-       window->display->grab_window->all_keys_grabbed &&
-       !window->display->grab_window->unmanaging)
-     {
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-Pass-flag-to-meta_window_update_monitor-inste.patch b/SOURCES/0001-window-Pass-flag-to-meta_window_update_monitor-inste.patch
deleted file mode 100644
index 617c634..0000000
--- a/SOURCES/0001-window-Pass-flag-to-meta_window_update_monitor-inste.patch
+++ /dev/null
@@ -1,218 +0,0 @@
-From 30266605b58e02b017e793fc898917874590e01c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 24 Aug 2018 12:54:50 +0200
-Subject: [PATCH 1/2] window: Pass flag to meta_window_update_monitor() instead
- of bool
-
-The bool determines whether the call was directly from a user operation
-or not. To add more state into the call without having to add more
-boolenas, change the boolean to a flag (so far with 'none' and 'user-op'
-as possible values). No functional changes were made.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/192
-
-(cherry picked from commit f4d07caa38e51d09ee73bab20334a6b5c28952d6)
----
- src/core/window-private.h                | 14 ++++++++++----
- src/core/window.c                        | 24 ++++++++++++++++--------
- src/wayland/meta-wayland-shell-surface.c |  2 +-
- src/wayland/meta-window-wayland.c        |  8 ++++----
- src/x11/window-x11.c                     |  6 +++---
- 5 files changed, 34 insertions(+), 20 deletions(-)
-
-diff --git a/src/core/window-private.h b/src/core/window-private.h
-index eb86b642c..bed2fc7f6 100644
---- a/src/core/window-private.h
-+++ b/src/core/window-private.h
-@@ -121,6 +121,12 @@ typedef enum
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 1 << 5,
- } MetaPlacementConstraintAdjustment;
- 
-+typedef enum _MetaWindowUpdateMonitorFlags
-+{
-+  META_WINDOW_UPDATE_MONITOR_FLAGS_NONE = 0,
-+  META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP = 1 << 0,
-+} MetaWindowUpdateMonitorFlags;
-+
- typedef struct _MetaPlacementRule
- {
-   MetaRectangle anchor_rect;
-@@ -549,8 +555,8 @@ struct _MetaWindowClass
-                                   cairo_surface_t **icon,
-                                   cairo_surface_t **mini_icon);
-   uint32_t (*get_client_pid)     (MetaWindow *window);
--  void (*update_main_monitor)    (MetaWindow *window,
--                                  gboolean    user_op);
-+  void (*update_main_monitor)    (MetaWindow                   *window,
-+                                  MetaWindowUpdateMonitorFlags  flags);
-   void (*main_monitor_changed)   (MetaWindow *window,
-                                   const MetaLogicalMonitor *old);
-   void (*force_restore_shortcuts) (MetaWindow         *window,
-@@ -768,8 +774,8 @@ void meta_window_activate_full (MetaWindow     *window,
- MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window);
- 
- MetaLogicalMonitor * meta_window_get_main_logical_monitor (MetaWindow *window);
--void meta_window_update_monitor (MetaWindow *window,
--                                 gboolean    user_op);
-+void meta_window_update_monitor (MetaWindow                   *window,
-+                                 MetaWindowUpdateMonitorFlags  flags);
- 
- void meta_window_set_urgent (MetaWindow *window,
-                              gboolean    urgent);
-diff --git a/src/core/window.c b/src/core/window.c
-index cc0813ac4..5547169d8 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -3804,7 +3804,8 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
- 
-   if (window->override_redirect || window->type == META_WINDOW_DESKTOP)
-     {
--      meta_window_update_monitor (window, FALSE);
-+      meta_window_update_monitor (window,
-+                                  META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
-       return;
-     }
- 
-@@ -3839,18 +3840,19 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
-     }
-   else
-     {
--      meta_window_update_monitor (window, FALSE);
-+      meta_window_update_monitor (window,
-+                                  META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
-     }
- }
- 
- void
--meta_window_update_monitor (MetaWindow *window,
--                            gboolean    user_op)
-+meta_window_update_monitor (MetaWindow                   *window,
-+                            MetaWindowUpdateMonitorFlags  flags)
- {
-   const MetaLogicalMonitor *old;
- 
-   old = window->monitor;
--  META_WINDOW_GET_CLASS (window)->update_main_monitor (window, user_op);
-+  META_WINDOW_GET_CLASS (window)->update_main_monitor (window, flags);
-   if (old != window->monitor)
-     {
-       meta_window_on_all_workspaces_changed (window);
-@@ -3864,7 +3866,8 @@ meta_window_update_monitor (MetaWindow *window,
-        * That should be handled by explicitly moving the window before changing the
-        * workspace.
-        */
--      if (meta_prefs_get_workspaces_only_on_primary () && user_op &&
-+      if (meta_prefs_get_workspaces_only_on_primary () &&
-+          flags & META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP &&
-           meta_window_is_on_primary_monitor (window)  &&
-           window->screen->active_workspace != window->workspace)
-         meta_window_change_workspace (window, window->screen->active_workspace);
-@@ -3907,6 +3910,7 @@ meta_window_move_resize_internal (MetaWindow          *window,
-   MetaRectangle constrained_rect;
-   MetaMoveResizeResultFlags result = 0;
-   gboolean moved_or_resized = FALSE;
-+  MetaWindowUpdateMonitorFlags update_monitor_flags;
- 
-   g_return_if_fail (!window->override_redirect);
- 
-@@ -4007,13 +4011,17 @@ meta_window_move_resize_internal (MetaWindow          *window,
-                                             did_placement);
-     }
- 
-+  update_monitor_flags = META_WINDOW_UPDATE_MONITOR_FLAGS_NONE;
-+  if (flags & META_MOVE_RESIZE_USER_ACTION)
-+    update_monitor_flags |= META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP;
-+
-   if (window->monitor)
-     {
-       guint old_output_winsys_id;
- 
-       old_output_winsys_id = window->monitor->winsys_id;
- 
--      meta_window_update_monitor (window, flags & META_MOVE_RESIZE_USER_ACTION);
-+      meta_window_update_monitor (window, update_monitor_flags);
- 
-       if (old_output_winsys_id != window->monitor->winsys_id &&
-           flags & META_MOVE_RESIZE_MOVE_ACTION && flags & META_MOVE_RESIZE_USER_ACTION)
-@@ -4021,7 +4029,7 @@ meta_window_move_resize_internal (MetaWindow          *window,
-     }
-   else
-     {
--      meta_window_update_monitor (window, flags & META_MOVE_RESIZE_USER_ACTION);
-+      meta_window_update_monitor (window, update_monitor_flags);
-     }
- 
-   if ((result & META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED) && window->frame_bounds)
-diff --git a/src/wayland/meta-wayland-shell-surface.c b/src/wayland/meta-wayland-shell-surface.c
-index b5f3acacf..72b3557c7 100644
---- a/src/wayland/meta-wayland-shell-surface.c
-+++ b/src/wayland/meta-wayland-shell-surface.c
-@@ -83,7 +83,7 @@ meta_wayland_shell_surface_set_window (MetaWaylandShellSurface *shell_surface,
-     meta_wayland_surface_role_get_surface (surface_role);
- 
-   meta_wayland_surface_set_window (surface, window);
--  meta_window_update_monitor (window, FALSE);
-+  meta_window_update_monitor (window, META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
- }
- 
- void
-diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c
-index 8bafb252f..544c60b5b 100644
---- a/src/wayland/meta-window-wayland.c
-+++ b/src/wayland/meta-window-wayland.c
-@@ -371,8 +371,8 @@ scale_rect_size (MetaRectangle *rect,
- }
- 
- static void
--meta_window_wayland_update_main_monitor (MetaWindow *window,
--                                         gboolean    user_op)
-+meta_window_wayland_update_main_monitor (MetaWindow                   *window,
-+                                         MetaWindowUpdateMonitorFlags  flags)
- {
-   MetaBackend *backend = meta_get_backend ();
-   MetaMonitorManager *monitor_manager =
-@@ -392,7 +392,7 @@ meta_window_wayland_update_main_monitor (MetaWindow *window,
-   toplevel_window = meta_wayland_surface_get_toplevel_window (window->surface);
-   if (toplevel_window != window)
-     {
--      meta_window_update_monitor (toplevel_window, user_op);
-+      meta_window_update_monitor (window, flags);
-       window->monitor = toplevel_window->monitor;
-       return;
-     }
-@@ -413,7 +413,7 @@ meta_window_wayland_update_main_monitor (MetaWindow *window,
-       return;
-     }
- 
--  if (!user_op)
-+  if (flags & META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP)
-     {
-       window->monitor = to;
-       return;
-diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
-index e9bd8ae65..e1c34412d 100644
---- a/src/x11/window-x11.c
-+++ b/src/x11/window-x11.c
-@@ -1483,8 +1483,8 @@ meta_window_x11_update_icon (MetaWindow       *window,
- }
- 
- static void
--meta_window_x11_update_main_monitor (MetaWindow *window,
--                                     gboolean    user_op)
-+meta_window_x11_update_main_monitor (MetaWindow                   *window,
-+                                     MetaWindowUpdateMonitorFlags  flags)
- {
-   window->monitor = meta_window_calculate_main_logical_monitor (window);
- }
-@@ -3314,7 +3314,7 @@ meta_window_x11_configure_notify (MetaWindow      *window,
-   priv->client_rect = window->rect;
-   window->buffer_rect = window->rect;
- 
--  meta_window_update_monitor (window, FALSE);
-+  meta_window_update_monitor (window, META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
- 
-   /* Whether an override-redirect window is considered fullscreen depends
-    * on its geometry.
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-Really-force-update-monitor-on-hot-plugs.patch b/SOURCES/0001-window-Really-force-update-monitor-on-hot-plugs.patch
deleted file mode 100644
index 1969bd1..0000000
--- a/SOURCES/0001-window-Really-force-update-monitor-on-hot-plugs.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From fa495286a1037d610051ab49f0aa1e8b20e38066 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 6 Nov 2018 13:35:31 +0100
-Subject: [PATCH] window: Really force update monitor on hot plugs
-
-Commit 8d3e05305 ("window: Force update monitor on hot plugs") added the
-flag `META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE` passed to
-`update_monitor()` from `update_for_monitors_changed()`.
-
-However, `update_for_monitors_changed()` may choose to call another code
-path to `move_between_rects()` and `meta_window_move_resize_internal()`
-eventually.
-
-As `meta_window_move_resize_internal()` does not use the "force" flag,
-we may still end up in case where the window->monitor is left unchanged.
-
-To avoid that problem, add a new `MetaMoveResizeFlags` that
-`update_for_monitors_changed()` can use to force the monitor update from
-`meta_window_move_resize_internal()`.
-
-Fixes: 8d3e05305 ("window: Force update monitor on hot plugs")
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/189
----
- src/core/window-private.h |  1 +
- src/core/window.c         | 16 +++++++++++++---
- 2 files changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/src/core/window-private.h b/src/core/window-private.h
-index 6fc943f72..4cc05d934 100644
---- a/src/core/window-private.h
-+++ b/src/core/window-private.h
-@@ -80,6 +80,7 @@ typedef enum
-   META_MOVE_RESIZE_UNMAXIMIZE = 1 << 6,
-   META_MOVE_RESIZE_FORCE_MOVE = 1 << 7,
-   META_MOVE_RESIZE_WAYLAND_STATE_CHANGED = 1 << 8,
-+  META_MOVE_RESIZE_FORCE_UPDATE_MONITOR = 1 << 9,
- } MetaMoveResizeFlags;
- 
- typedef enum
-diff --git a/src/core/window.c b/src/core/window.c
-index d00719e23..4d9e51d8c 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -120,6 +120,7 @@ static gboolean queue_calc_showing_func (MetaWindow *window,
-                                          void       *data);
- 
- static void meta_window_move_between_rects (MetaWindow          *window,
-+                                            MetaMoveResizeFlags  move_resize_flags,
-                                             const MetaRectangle *old_area,
-                                             const MetaRectangle *new_area);
- 
-@@ -3864,6 +3865,7 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
-        * monitors changed and the same index could be refereing
-        * to a different monitor. */
-       meta_window_move_between_rects (window,
-+                                      META_MOVE_RESIZE_FORCE_UPDATE_MONITOR,
-                                       &old->rect,
-                                       &new->rect);
-     }
-@@ -4045,6 +4047,8 @@ meta_window_move_resize_internal (MetaWindow          *window,
-   update_monitor_flags = META_WINDOW_UPDATE_MONITOR_FLAGS_NONE;
-   if (flags & META_MOVE_RESIZE_USER_ACTION)
-     update_monitor_flags |= META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP;
-+  if (flags & META_MOVE_RESIZE_FORCE_UPDATE_MONITOR)
-+    update_monitor_flags |= META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE;
- 
-   if (window->monitor)
-     {
-@@ -4104,6 +4108,7 @@ meta_window_move_frame (MetaWindow *window,
- 
- static void
- meta_window_move_between_rects (MetaWindow  *window,
-+                                MetaMoveResizeFlags  move_resize_flags,
-                                 const MetaRectangle *old_area,
-                                 const MetaRectangle *new_area)
- {
-@@ -4127,7 +4132,12 @@ meta_window_move_between_rects (MetaWindow  *window,
-   window->saved_rect.x = window->unconstrained_rect.x;
-   window->saved_rect.y = window->unconstrained_rect.y;
- 
--  meta_window_move_resize_now (window);
-+  meta_window_move_resize_internal (window,
-+                                    move_resize_flags |
-+                                    META_MOVE_RESIZE_MOVE_ACTION |
-+                                    META_MOVE_RESIZE_RESIZE_ACTION,
-+                                    NorthWestGravity,
-+                                    window->unconstrained_rect);
- }
- 
- /**
-@@ -4188,14 +4198,14 @@ meta_window_move_to_monitor (MetaWindow  *window,
-       window->unconstrained_rect.height == 0 ||
-       !meta_rectangle_overlap (&window->unconstrained_rect, &old_area))
-     {
--      meta_window_move_between_rects (window, NULL, &new_area);
-+      meta_window_move_between_rects (window, 0, NULL, &new_area);
-     }
-   else
-     {
-       if (monitor == window->monitor->number)
-         return;
- 
--      meta_window_move_between_rects (window, &old_area, &new_area);
-+      meta_window_move_between_rects (window, 0, &old_area, &new_area);
-     }
- 
-   window->preferred_output_winsys_id = window->monitor->winsys_id;
--- 
-2.20.1
-
diff --git a/SOURCES/0001-window-Return-1-if-meta_window_get_monitor-is-called.patch b/SOURCES/0001-window-Return-1-if-meta_window_get_monitor-is-called.patch
deleted file mode 100644
index 4dd4bf0..0000000
--- a/SOURCES/0001-window-Return-1-if-meta_window_get_monitor-is-called.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 007864ac645715c0588b0dd5ae88c1e2900fe2a4 Mon Sep 17 00:00:00 2001
-From: Sam Spilsbury <sam@endlessm.com>
-Date: Tue, 10 Oct 2017 16:39:40 +0000
-Subject: [PATCH] window: Return -1 if meta_window_get_monitor is called on an
- unmanaged window
-
-As opposed to crashing. In this case, letting the caller deal with
-it is the best policy, since this is public API.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=788834
-
-
-(cherry picked from commit 8626c69c2ffa806f854041a3738340c6fb20c112)
----
- src/core/window.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index d69720a4d..e68f5245c 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -3752,11 +3752,15 @@ maybe_move_attached_dialog (MetaWindow *window,
-  *
-  * Gets index of the monitor that this window is on.
-  *
-- * Return Value: The index of the monitor in the screens monitor list
-+ * Return Value: The index of the monitor in the screens monitor list, or -1
-+ * if the window has been recently unmanaged and does not have a monitor.
-  */
- int
- meta_window_get_monitor (MetaWindow *window)
- {
-+  if (!window->monitor)
-+    return -1;
-+
-   return window->monitor->number;
- }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch b/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch
index 0f2f285..3cf01de 100644
--- a/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch
+++ b/SOURCES/0001-window-actor-Special-case-shaped-Java-windows.patch
@@ -1,4 +1,4 @@
-From ec74bb9607f5187f8fda37dba1882efe1693e24f Mon Sep 17 00:00:00 2001
+From 6bca5f001338d4647e4e21d549c8cdea4bcad669 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
 Date: Fri, 12 May 2017 13:40:31 +0200
 Subject: [PATCH] window-actor: Special-case shaped Java windows
@@ -12,10 +12,10 @@ by special-casing shaped Java windows.
  1 file changed, 8 insertions(+)
 
 diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
-index 381d3ea85..b67fb3ce1 100644
+index f850cb222..1c8dc8fe5 100644
 --- a/src/compositor/meta-window-actor.c
 +++ b/src/compositor/meta-window-actor.c
-@@ -865,6 +865,14 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
+@@ -798,6 +798,14 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
    if (priv->window->has_custom_frame_extents)
      return FALSE;
  
@@ -31,5 +31,5 @@ index 381d3ea85..b67fb3ce1 100644
     * Generate shadows for all other windows.
     */
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/0001-window-actor-Use-actual-image-size-for-capture.patch b/SOURCES/0001-window-actor-Use-actual-image-size-for-capture.patch
deleted file mode 100644
index c05de7d..0000000
--- a/SOURCES/0001-window-actor-Use-actual-image-size-for-capture.patch
+++ /dev/null
@@ -1,86 +0,0 @@
-From 1587447b47130affe437acce4770f82d13176227 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 22 Jan 2019 10:22:27 +0100
-Subject: [PATCH] window-actor: Use actual image size for capture
-
-Previously, the clipping rectangle passed to
-`meta_surface_actor_get_image()` was updated with the actual texture
-size, but recent changes in `meta_shaped_texture_get_image()` now keep
-the caller's clipping rectangle unchanged.
-
-The implementation of `meta_window_actor_capture_into()` was relying on
-the old behavior of updating the passed clipping rectangle, but now that
-it's kept unchanged, the actual clipping rectangle used to copy the data
-is wrong, which causes either a distorded image or worse, a crash of
-mutter.
-
-Use the resulting cairo image size to copy the data instead of the
-clipping rectangle to avoid the issue and get the expected size.
-
-Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/442
----
- src/compositor/meta-window-actor.c | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
-
-diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
-index 396fef1..756e6c0 100644
---- a/src/compositor/meta-window-actor.c
-+++ b/src/compositor/meta-window-actor.c
-@@ -2260,36 +2260,38 @@ meta_window_actor_capture_into (MetaScreenCastWindow *screen_cast_window,
- {
-   MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
-   cairo_surface_t *image;
--  MetaRectangle clip_rect;
-   uint8_t *cr_data;
-   int cr_stride;
-+  int cr_width;
-+  int cr_height;
-   int bpp = 4;
- 
-   if (meta_window_actor_is_destroyed (window_actor))
-     return;
- 
--  clip_rect = *bounds;
--  image = meta_surface_actor_get_image (window_actor->priv->surface, &clip_rect);
-+  image = meta_surface_actor_get_image (window_actor->priv->surface, bounds);
-   cr_data = cairo_image_surface_get_data (image);
-+  cr_width = cairo_image_surface_get_width (image);
-+  cr_height = cairo_image_surface_get_height (image);
-   cr_stride = cairo_image_surface_get_stride (image);
- 
--  if (clip_rect.width < bounds->width || clip_rect.height < bounds->height)
-+  if (cr_width < bounds->width || cr_height < bounds->height)
-     {
-       uint8_t *src, *dst;
-       src = cr_data;
-       dst = data;
- 
--      for (int i = 0; i < clip_rect.height; i++)
-+      for (int i = 0; i < cr_height; i++)
-         {
-           memcpy (dst, src, cr_stride);
--          if (clip_rect.width < bounds->width)
-+          if (cr_width < bounds->width)
-             memset (dst + cr_stride, 0, (bounds->width * bpp) - cr_stride);
- 
-           src += cr_stride;
-           dst += bounds->width * bpp;
-         }
- 
--      for (int i = clip_rect.height; i < bounds->height; i++)
-+      for (int i = cr_height; i < bounds->height; i++)
-         {
-           memset (dst, 0, bounds->width * bpp);
-           dst += bounds->width * bpp;
-@@ -2297,7 +2299,7 @@ meta_window_actor_capture_into (MetaScreenCastWindow *screen_cast_window,
-     }
-   else
-     {
--      memcpy (data, cr_data, clip_rect.height * cr_stride);
-+      memcpy (data, cr_data, cr_height * cr_stride);
-     }
- 
-   cairo_surface_destroy (image);
--- 
-2.20.1
-
diff --git a/SOURCES/0001-window-unmanage-dialog-when-clearing-transient_for.patch b/SOURCES/0001-window-unmanage-dialog-when-clearing-transient_for.patch
deleted file mode 100644
index 09aacc8..0000000
--- a/SOURCES/0001-window-unmanage-dialog-when-clearing-transient_for.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 398f03bd0fcd4eb31f9a0fc4990c21db4072488c Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 10 Jul 2018 14:42:42 +0000
-Subject: [PATCH] window: unmanage dialog when clearing transient_for
-
-On Wayland, xdg-foreign would leave a modal dialog managed even after
-the imported surface is destroyed.
-
-This is sub-optimal and this breaks the atomic relationship one would
-expect between the parent and its modal dialog.
-
-Make sure we unmanage the dialog if transient_for is unset even for
-Wayland native windows.
-
-Related: https://gitlab.gnome.org/GNOME/mutter/issues/174
-Related: https://gitlab.gnome.org/GNOME/mutter/issues/221
-
-
-(cherry picked from commit b443bd42ac738092817addf48e0b363d140cad26)
----
- src/core/window.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index e68f5245c..a1f4aa4f3 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -7942,7 +7942,15 @@ meta_window_set_transient_for (MetaWindow *window,
-             }
-         }
-     }
-+  else if (window->attached && parent == NULL)
-+    {
-+      guint32 timestamp;
- 
-+      timestamp =
-+        meta_display_get_current_time_roundtrip (window->display);
-+      meta_window_unmanage (window, timestamp);
-+      return;
-+    }
-   /* We know this won't create a reference cycle because we check for loops */
-   g_clear_object (&window->transient_for);
-   window->transient_for = parent ? g_object_ref (parent) : NULL;
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-wayland-Always-update-monitor-for-non-user-op.patch b/SOURCES/0001-window-wayland-Always-update-monitor-for-non-user-op.patch
deleted file mode 100644
index 22318d4..0000000
--- a/SOURCES/0001-window-wayland-Always-update-monitor-for-non-user-op.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From d74a046060df81ea766e999b4110e926b121cf2e Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Mon, 18 Jun 2018 10:39:11 +0000
-Subject: [PATCH] window/wayland: Always update monitor for non-user ops
-
-meta_window_wayland_update_main_monitor() would skip the monitor update
-if the difference in scale between the old and the new monitor would
-cause another monitor change.
-
-While this is suitable when the monitor change results from a user
-interactively moving the surface between monitors of different scales,
-this can leave dangling pointers to freed monitors when this is
-triggered by a change of monitor configuration.
-
-Make sure we update the monitor unconditionally if not from a user
-operation.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/189
-
-
-(cherry picked from commit a3da4b8d5bd217c0262fd9361036877d155a300f)
----
- src/wayland/meta-window-wayland.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c
-index 705bc4981..8bafb252f 100644
---- a/src/wayland/meta-window-wayland.c
-+++ b/src/wayland/meta-window-wayland.c
-@@ -413,6 +413,12 @@ meta_window_wayland_update_main_monitor (MetaWindow *window,
-       return;
-     }
- 
-+  if (!user_op)
-+    {
-+      window->monitor = to;
-+      return;
-+    }
-+
-   from_scale = meta_logical_monitor_get_scale (from);
-   to_scale = meta_logical_monitor_get_scale (to);
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0001-window-wayland-Don-t-recursive-indefinitely-when-upd.patch b/SOURCES/0001-window-wayland-Don-t-recursive-indefinitely-when-upd.patch
deleted file mode 100644
index b8b7ffd..0000000
--- a/SOURCES/0001-window-wayland-Don-t-recursive-indefinitely-when-upd.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 1514880e92841d51a557edd505555de3e4a5b6ae Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 27 Aug 2018 17:49:52 +0200
-Subject: [PATCH] window/wayland: Don't recursive indefinitely when updating
- monitor
-
-When we update the main monitor, there is a rule that makes it so that
-popup windows use the same main monitor as their parent. In the commit
-f4d07caa38e51d09ee73bab20334a6b5c28952d6 the call that updates and
-fetches the main monitor of the toplevel accidentally changed to update
-from itself, causing a indefinite recursion eventually resulting in a
-crash.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/279
-(cherry picked from commit e191c21e04cfaa560f8dd51f4f91013af98ccf4e)
----
- src/wayland/meta-window-wayland.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c
-index e837215de..241e6b61c 100644
---- a/src/wayland/meta-window-wayland.c
-+++ b/src/wayland/meta-window-wayland.c
-@@ -392,7 +392,7 @@ meta_window_wayland_update_main_monitor (MetaWindow                   *window,
-   toplevel_window = meta_wayland_surface_get_toplevel_window (window->surface);
-   if (toplevel_window != window)
-     {
--      meta_window_update_monitor (window, flags);
-+      meta_window_update_monitor (toplevel_window, flags);
-       window->monitor = toplevel_window->monitor;
-       return;
-     }
--- 
-2.19.0
-
diff --git a/SOURCES/0001-workspace-Focus-only-ancestors-that-are-focusable.patch b/SOURCES/0001-workspace-Focus-only-ancestors-that-are-focusable.patch
new file mode 100644
index 0000000..94a73d8
--- /dev/null
+++ b/SOURCES/0001-workspace-Focus-only-ancestors-that-are-focusable.patch
@@ -0,0 +1,83 @@
+From eca25ab6a12770a2a767458d9b0129d4fde3995c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
+Date: Tue, 13 Nov 2018 08:31:52 +0100
+Subject: [PATCH 1/2] workspace: Focus only ancestors that are focusable
+
+When destroying a window that has a parent, we initially try to focus one of
+its ancestors. However if no ancestor can be focused, then we should instead
+focus the default focus window instead of trying to request focus for a window
+that can't get focus anyways.
+
+Fixes https://gitlab.gnome.org/GNOME/mutter/issues/308
+(cherry picked from commit eccc791f3b3451216f957e67fec47a73b65ed2b2)
+---
+ src/core/workspace.c | 37 +++++++++++++++++++++++++++----------
+ 1 file changed, 27 insertions(+), 10 deletions(-)
+
+diff --git a/src/core/workspace.c b/src/core/workspace.c
+index f2b2c2c48..58fcfa78c 100644
+--- a/src/core/workspace.c
++++ b/src/core/workspace.c
+@@ -85,6 +85,12 @@ typedef struct _MetaWorkspaceLogicalMonitorData
+   MetaRectangle logical_monitor_work_area;
+ } MetaWorkspaceLogicalMonitorData;
+ 
++typedef struct _MetaWorkspaceFocusableAncestorData
++{
++  MetaWorkspace *workspace;
++  MetaWindow *out_window;
++} MetaWorkspaceFocusableAncestorData;
++
+ static MetaWorkspaceLogicalMonitorData *
+ meta_workspace_get_logical_monitor_data (MetaWorkspace      *workspace,
+                                          MetaLogicalMonitor *logical_monitor)
+@@ -1322,13 +1328,20 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
+ }
+ 
+ static gboolean
+-record_ancestor (MetaWindow *window,
+-                 void       *data)
++find_focusable_ancestor (MetaWindow *window,
++                         gpointer    user_data)
+ {
+-  MetaWindow **result = data;
++  MetaWorkspaceFocusableAncestorData *data = user_data;
++
++  if (!window->unmanaging && meta_window_is_focusable (window) &&
++      meta_window_located_on_workspace (window, data->workspace) &&
++      meta_window_showing_on_its_workspace (window))
++    {
++      data->out_window = window;
++      return FALSE;
++    }
+ 
+-  *result = window;
+-  return FALSE; /* quit with the first ancestor we find */
++  return TRUE;
+ }
+ 
+ /* Focus ancestor of not_this_one if there is one */
+@@ -1350,11 +1363,15 @@ focus_ancestor_or_top_window (MetaWorkspace *workspace,
+   if (not_this_one)
+     {
+       MetaWindow *ancestor;
+-      ancestor = NULL;
+-      meta_window_foreach_ancestor (not_this_one, record_ancestor, &ancestor);
+-      if (ancestor != NULL &&
+-          meta_window_located_on_workspace (ancestor, workspace) &&
+-          meta_window_showing_on_its_workspace (ancestor))
++      MetaWorkspaceFocusableAncestorData data;
++
++      data = (MetaWorkspaceFocusableAncestorData) {
++        .workspace = workspace,
++      };
++      meta_window_foreach_ancestor (not_this_one, find_focusable_ancestor, &data);
++      ancestor = data.out_window;
++
++      if (ancestor)
+         {
+           meta_topic (META_DEBUG_FOCUS,
+                       "Focusing %s, ancestor of %s\n",
+-- 
+2.21.0
+
diff --git a/SOURCES/0001-workspace-manager-Expose-layout-properties.patch b/SOURCES/0001-workspace-manager-Expose-layout-properties.patch
new file mode 100644
index 0000000..908fe67
--- /dev/null
+++ b/SOURCES/0001-workspace-manager-Expose-layout-properties.patch
@@ -0,0 +1,80 @@
+From 52536a44e96aa34d3ec3b9332adaa15a6399fc3e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Tue, 4 Jun 2019 21:21:37 +0200
+Subject: [PATCH] workspace-manager: Expose layout properties
+
+gnome-shell hardcodes a vertical one-column workspace layout, and
+while not supporting arbitrary grids is very much by design, it
+currently doesn't have a choice: We simply don't expose the workspace
+layout we use.
+
+Change that to allow gnome-shell to be a bit more flexible with the
+workspace layouts it supports.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/618
+---
+ src/core/meta-workspace-manager.c | 27 +++++++++++++++++++++++++++
+ 1 file changed, 27 insertions(+)
+
+diff --git a/src/core/meta-workspace-manager.c b/src/core/meta-workspace-manager.c
+index 8e1f03fe8..fbae34c73 100644
+--- a/src/core/meta-workspace-manager.c
++++ b/src/core/meta-workspace-manager.c
+@@ -50,6 +50,9 @@ enum
+ {
+   PROP_0,
+ 
++  PROP_LAYOUT_COLUMNS,
++  PROP_LAYOUT_ROWS,
++
+   PROP_N_WORKSPACES
+ };
+ 
+@@ -68,6 +71,12 @@ meta_workspace_manager_get_property (GObject    *object,
+ 
+   switch (prop_id)
+     {
++    case PROP_LAYOUT_COLUMNS:
++      g_value_set_int (value, workspace_manager->columns_of_workspaces);
++      break;
++    case PROP_LAYOUT_ROWS:
++      g_value_set_int (value, workspace_manager->rows_of_workspaces);
++      break;
+     case PROP_N_WORKSPACES:
+       g_value_set_int (value, meta_workspace_manager_get_n_workspaces (workspace_manager));
+       break;
+@@ -154,6 +163,22 @@ meta_workspace_manager_class_init (MetaWorkspaceManagerClass *klass)
+                   0, NULL, NULL, NULL,
+                   G_TYPE_NONE, 0);
+ 
++  g_object_class_install_property (object_class,
++                                   PROP_LAYOUT_COLUMNS,
++                                   g_param_spec_int ("layout-columns",
++                                                     "Layout columns",
++                                                     "Number of columns in layout",
++                                                     -1, G_MAXINT, 1,
++                                                     G_PARAM_READABLE));
++
++  g_object_class_install_property (object_class,
++                                   PROP_LAYOUT_ROWS,
++                                   g_param_spec_int ("layout-rows",
++                                                     "Layout rows",
++                                                     "Number of rows in layout",
++                                                     -1, G_MAXINT, -1,
++                                                     G_PARAM_READABLE));
++
+   g_object_class_install_property (object_class,
+                                    PROP_N_WORKSPACES,
+                                    g_param_spec_int ("n-workspaces",
+@@ -474,6 +499,8 @@ meta_workspace_manager_update_workspace_layout (MetaWorkspaceManager *workspace_
+                 workspace_manager->columns_of_workspaces,
+                 workspace_manager->vertical_workspaces,
+                 workspace_manager->starting_corner);
++  g_object_notify (G_OBJECT (workspace_manager), "layout-columns");
++  g_object_notify (G_OBJECT (workspace_manager), "layout-rows");
+ }
+ 
+ /**
+-- 
+2.21.0
+
diff --git a/SOURCES/0001-x11-window-props-Do-not-convert-WM_NAME.patch b/SOURCES/0001-x11-window-props-Do-not-convert-WM_NAME.patch
deleted file mode 100644
index 4542944..0000000
--- a/SOURCES/0001-x11-window-props-Do-not-convert-WM_NAME.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 432a509346c0727b21139fdf5c923b78cf818c4e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Tue, 9 Oct 2018 00:40:33 +0200
-Subject: [PATCH 1/2] x11/window-props: Do not convert WM_NAME
-
-The WM_NAME property is of type TEXT_PROPERTY, which is supposed to be
-returned as UTF-8. Commit 840378ae68 broke that assumption, resulting
-in crashes with non-UTF8 locales; however the "fix" of converting from
-LATIN1 to UTF8 is wrong as well, as the conversion will spit out garbage
-when the input encoding isn't actually LATIN1.
-
-Now that the original issue in text_property_to_utf8() has been fixed,
-we can simply revert the relevant bits of commit d62491f46eba748e.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/227
----
- src/x11/window-props.c | 5 +----
- 1 file changed, 1 insertion(+), 4 deletions(-)
-
-diff --git a/src/x11/window-props.c b/src/x11/window-props.c
-index 2f4dfeb31d..7c6b25fdbf 100644
---- a/src/x11/window-props.c
-+++ b/src/x11/window-props.c
-@@ -645,10 +645,7 @@ reload_wm_name (MetaWindow    *window,
- 
-   if (value->type != META_PROP_VALUE_INVALID)
-     {
--      g_autofree gchar *title = g_convert (value->v.str, -1,
--                                           "UTF-8", "LATIN1",
--                                           NULL, NULL, NULL);
--      set_window_title (window, title);
-+      set_window_title (window, value->v.str);
- 
-       meta_verbose ("Using WM_NAME for new title of %s: \"%s\"\n",
-                     window->desc, window->title);
--- 
-2.17.1
-
diff --git a/SOURCES/0002-backend-switch-to-using-generated-logind-proxy.patch b/SOURCES/0002-backend-switch-to-using-generated-logind-proxy.patch
index e6bb1a1..3cb0623 100644
--- a/SOURCES/0002-backend-switch-to-using-generated-logind-proxy.patch
+++ b/SOURCES/0002-backend-switch-to-using-generated-logind-proxy.patch
@@ -1,4 +1,4 @@
-From 76c34858d18c7ec2bdef6ceeee22b047a0a1bdcb Mon Sep 17 00:00:00 2001
+From 063db6c9a7504a4d7baae28f7899bd661c459c41 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Mon, 14 Jan 2019 11:11:01 -0500
 Subject: [PATCH 2/9] backend: switch to using generated logind proxy
@@ -11,115 +11,36 @@ proxy, which will become useful in a future commit,
 for adding suspending inhibitors.
 ---
  src/backends/meta-backend.c    | 60 ++++++++++++++++++++++------------
- src/org.freedesktop.login1.xml | 14 ++++++++
- 2 files changed, 53 insertions(+), 21 deletions(-)
+ src/org.freedesktop.login1.xml | 13 ++++++++
+ 2 files changed, 52 insertions(+), 21 deletions(-)
 
 diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
-index 28f1cd92f..2f090e233 100644
+index 23ab2faec..5d71977c6 100644
 --- a/src/backends/meta-backend.c
 +++ b/src/backends/meta-backend.c
-@@ -8,60 +8,61 @@
-  * published by the Free Software Foundation; either version 2 of the
-  * License, or (at your option) any later version.
-  *
-  * This program is distributed in the hope that it will be useful, but
-  * WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  * General Public License for more details.
-  *
-  * You should have received a copy of the GNU General Public License
-  * along with this program; if not, write to the Free Software
-  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-  * 02111-1307, USA.
-  *
-  * Written by:
-  *     Jasper St. Pierre <jstpierre@mecheye.net>
-  */
- 
- #include "config.h"
- 
- #include <stdlib.h>
- 
- #include <clutter/clutter-mutter.h>
- #include <meta/meta-backend.h>
- #include <meta/main.h>
- #include <meta/util.h>
- #include "meta-backend-private.h"
- #include "meta-input-settings-private.h"
- #include "backends/x11/meta-backend-x11.h"
- #include "meta-cursor-tracker-private.h"
- #include "meta-stage-private.h"
+@@ -65,6 +65,7 @@
+ #include "meta/main.h"
+ #include "meta/meta-backend.h"
+ #include "meta/util.h"
 +#include "meta-dbus-login1.h"
  
  #ifdef HAVE_REMOTE_DESKTOP
  #include "backends/meta-dbus-session-watcher.h"
- #include "backends/meta-screen-cast.h"
- #include "backends/meta-remote-access-controller-private.h"
- #include "backends/meta-remote-desktop.h"
- #endif
- 
- #ifdef HAVE_NATIVE_BACKEND
- #include "backends/native/meta-backend-native.h"
- #endif
- 
- #include "backends/meta-idle-monitor-private.h"
- #include "backends/meta-logical-monitor.h"
- #include "backends/meta-monitor-manager-dummy.h"
- #include "backends/meta-settings-private.h"
- 
- #define META_IDLE_MONITOR_CORE_DEVICE 0
- 
- enum
- {
-   KEYMAP_CHANGED,
-   KEYMAP_LAYOUT_GROUP_CHANGED,
-   LAST_DEVICE_CHANGED,
- 
-   N_SIGNALS
- };
- 
- static guint signals[N_SIGNALS];
- 
-@@ -87,93 +88,97 @@ struct _MetaBackendPrivate
-   MetaMonitorManager *monitor_manager;
-   MetaOrientationManager *orientation_manager;
-   MetaCursorTracker *cursor_tracker;
-   MetaCursorRenderer *cursor_renderer;
-   MetaInputSettings *input_settings;
-   MetaRenderer *renderer;
-   MetaEgl *egl;
-   MetaSettings *settings;
- #ifdef HAVE_REMOTE_DESKTOP
-   MetaRemoteAccessController *remote_access_controller;
-   MetaDbusSessionWatcher *dbus_session_watcher;
-   MetaScreenCast *screen_cast;
-   MetaRemoteDesktop *remote_desktop;
- #endif
- 
-   ClutterBackend *clutter_backend;
-   ClutterActor *stage;
- 
-   gboolean is_pointer_position_initialized;
+@@ -145,10 +146,12 @@ struct _MetaBackendPrivate
+   GDBusProxy *upower_proxy;
+   gboolean lid_is_closed;
  
-   guint device_update_idle_id;
- 
-   GHashTable *device_monitors;
- 
-   int current_device_id;
- 
-   MetaPointerConstraint *client_pointer_constraint;
-   MetaDnd *dnd;
- 
-   UpClient *up_client;
 -  guint sleep_signal_id;
    GCancellable *cancellable;
    GDBusConnection *system_bus;
-+
+ 
 +  Login1Manager *logind_proxy;
 +  int            inhibit_sleep_fd;
++
+   gboolean was_headless;
  };
  typedef struct _MetaBackendPrivate MetaBackendPrivate;
- 
+@@ -156,6 +159,10 @@ typedef struct _MetaBackendPrivate MetaBackendPrivate;
  static void
  initable_iface_init (GInitableIface *initable_iface);
  
@@ -130,85 +51,16 @@ index 28f1cd92f..2f090e233 100644
  G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaBackend, meta_backend, G_TYPE_OBJECT,
                                    G_ADD_PRIVATE (MetaBackend)
                                    G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
-                                                          initable_iface_init));
- 
- static void
- meta_backend_finalize (GObject *object)
- {
-   MetaBackend *backend = META_BACKEND (object);
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
- 
-   g_clear_object (&priv->monitor_manager);
-   g_clear_object (&priv->orientation_manager);
-   g_clear_object (&priv->input_settings);
- #ifdef HAVE_REMOTE_DESKTOP
-   g_clear_object (&priv->remote_desktop);
-   g_clear_object (&priv->screen_cast);
-   g_clear_object (&priv->dbus_session_watcher);
+@@ -177,8 +184,6 @@ meta_backend_finalize (GObject *object)
    g_clear_object (&priv->remote_access_controller);
  #endif
  
-   g_object_unref (priv->up_client);
 -  if (priv->sleep_signal_id)
 -    g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
+   if (priv->upower_watch_id)
+     g_bus_unwatch_name (priv->upower_watch_id);
    g_cancellable_cancel (priv->cancellable);
-   g_clear_object (&priv->cancellable);
-   g_clear_object (&priv->system_bus);
- 
-   if (priv->device_update_idle_id)
-     g_source_remove (priv->device_update_idle_id);
- 
-   g_hash_table_destroy (priv->device_monitors);
- 
-   g_clear_object (&priv->settings);
- 
-   G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
- }
- 
- static void
- meta_backend_sync_screen_size (MetaBackend *backend)
- {
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-   int width, height;
- 
-   meta_monitor_manager_get_screen_size (priv->monitor_manager, &width, &height);
- 
-   META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
- }
- 
- static void
- reset_pointer_position (MetaBackend *backend)
- {
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
-   MetaMonitorManager *monitor_manager = priv->monitor_manager;
-@@ -553,101 +558,114 @@ meta_backend_class_init (MetaBackendClass *klass)
- static MetaMonitorManager *
- meta_backend_create_monitor_manager (MetaBackend *backend,
-                                      GError     **error)
- {
-   if (g_getenv ("META_DUMMY_MONITORS"))
-     return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
- 
-   return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend,
-                                                                    error);
- }
- 
- static MetaRenderer *
- meta_backend_create_renderer (MetaBackend *backend,
-                               GError     **error)
- {
-   return META_BACKEND_GET_CLASS (backend)->create_renderer (backend, error);
- }
- 
- static void
- lid_is_closed_changed_cb (UpClient   *client,
-                           GParamSpec *pspec,
-                           gpointer    user_data)
- {
-   if (up_client_get_lid_is_closed (client))
-     return;
- 
-   meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
+@@ -764,13 +769,8 @@ meta_backend_create_renderer (MetaBackend *backend,
  }
  
  static void
@@ -224,9 +76,7 @@ index 28f1cd92f..2f090e233 100644
  {
    gboolean suspending;
  
-   g_variant_get (parameters, "(b)", &suspending);
-   if (suspending)
-     return;
+@@ -780,12 +780,31 @@ prepare_for_sleep_cb (GDBusConnection *connection,
    meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
  }
  
@@ -258,8 +108,7 @@ index 28f1cd92f..2f090e233 100644
    GDBusConnection *bus;
  
    bus = g_bus_get_finish (res, NULL);
-   if (!bus)
-     return;
+@@ -794,17 +813,16 @@ system_bus_gotten_cb (GObject      *object,
  
    priv = meta_backend_get_instance_private (user_data);
    priv->system_bus = bus;
@@ -287,72 +136,17 @@ index 28f1cd92f..2f090e233 100644
  }
  
  static gboolean
- meta_backend_initable_init (GInitable     *initable,
-                             GCancellable  *cancellable,
-                             GError       **error)
- {
-   MetaBackend *backend = META_BACKEND (initable);
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
- 
-   priv->settings = meta_settings_new (backend);
- 
-   priv->egl = g_object_new (META_TYPE_EGL, NULL);
- 
-   priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
- 
-   priv->monitor_manager = meta_backend_create_monitor_manager (backend, error);
-   if (!priv->monitor_manager)
-     return FALSE;
- 
-   priv->renderer = meta_backend_create_renderer (backend, error);
-   if (!priv->renderer)
-     return FALSE;
- 
-   priv->cursor_tracker = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
- 
-   priv->dnd = g_object_new (META_TYPE_DND, NULL);
- 
-   priv->up_client = up_client_new ();
-   g_signal_connect (priv->up_client, "notify::lid-is-closed",
 diff --git a/src/org.freedesktop.login1.xml b/src/org.freedesktop.login1.xml
-index 765475132..7db8f373c 100644
+index 765475132..1ecfd976f 100644
 --- a/src/org.freedesktop.login1.xml
 +++ b/src/org.freedesktop.login1.xml
-@@ -16,31 +16,45 @@
-       <arg name="major" type="u" direction="in"/>
-       <arg name="minor" type="u" direction="in"/>
-       <arg name="fd" type="h" direction="out"/>
-       <arg name="paused" type="b" direction="out"/>
-     </method>
-     <method name="ReleaseDevice">
-       <arg name="major" type="u"/>
-       <arg name="minor" type="u"/>
-     </method>
-     <method name="PauseDeviceComplete">
-       <arg name="major" type="u"/>
-       <arg name="minor" type="u"/>
-     </method>
-     <signal name="PauseDevice">
-       <arg name="major" type="u"/>
-       <arg name="minor" type="u"/>
-       <arg name="type" type="s"/>
-     </signal>
-     <signal name="ResumeDevice">
-       <arg name="major" type="u"/>
-       <arg name="minor" type="u"/>
-       <arg name="fd" type="h"/>
-     </signal>
-   </interface>
- 
-   <interface name="org.freedesktop.login1.Seat">
-     <method name="SwitchTo">
+@@ -43,4 +43,17 @@
        <arg name="vt" type="u"/>
      </method>
    </interface>
 +
 +  <interface name="org.freedesktop.login1.Manager">
 +    <method name="Inhibit">
-+      <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
 +      <arg name="what" type="s" direction="in"/>
 +      <arg name="who" type="s" direction="in"/>
 +      <arg name="why" type="s" direction="in"/>
@@ -365,5 +159,5 @@ index 765475132..7db8f373c 100644
 +  </interface>
  </node>
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0002-clutter-Keep-a-device-reference-with-events.patch b/SOURCES/0002-clutter-Keep-a-device-reference-with-events.patch
deleted file mode 100644
index 2879849..0000000
--- a/SOURCES/0002-clutter-Keep-a-device-reference-with-events.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From f41e9517ffd362505ca91c21387e6457e7c53a2d Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Mon, 19 Nov 2018 11:25:57 +0100
-Subject: [PATCH 02/12] clutter: Keep a device reference with events
-
-If a device (virtual or real) is removed while there are remaining
-events queued for that device, the event loop may try to access the
-event freed memory.
-
-To avoid the issue, add a reference to the device when the event is
-created or copied, and remove the reference once the device is freed.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/393
----
- clutter/clutter/clutter-event.c | 16 ++++++++++++----
- 1 file changed, 12 insertions(+), 4 deletions(-)
-
-diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c
-index 10b6c00..1b21b6a 100644
---- a/clutter/clutter/clutter-event.c
-+++ b/clutter/clutter/clutter-event.c
-@@ -1095,7 +1095,7 @@ clutter_event_set_device (ClutterEvent       *event,
-     {
-       ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
- 
--      real_event->device = device;
-+      g_set_object (&real_event->device, device);
-     }
- 
-   switch (event->type)
-@@ -1364,8 +1364,8 @@ clutter_event_copy (const ClutterEvent *event)
-     {
-       ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
- 
--      new_real_event->device = real_event->device;
--      new_real_event->source_device = real_event->source_device;
-+      g_set_object (&new_real_event->device, real_event->device);
-+      g_set_object (&new_real_event->source_device, real_event->source_device);
-       new_real_event->delta_x = real_event->delta_x;
-       new_real_event->delta_y = real_event->delta_y;
-       new_real_event->is_pointer_emulated = real_event->is_pointer_emulated;
-@@ -1435,6 +1435,14 @@ clutter_event_free (ClutterEvent *event)
-     {
-       _clutter_backend_free_event_data (clutter_get_default_backend (), event);
- 
-+      if (is_event_allocated (event))
-+        {
-+          ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
-+
-+          g_clear_object (&real_event->device);
-+          g_clear_object (&real_event->source_device);
-+        }
-+
-       switch (event->type)
-         {
-         case CLUTTER_BUTTON_PRESS:
-@@ -1689,7 +1697,7 @@ clutter_event_set_source_device (ClutterEvent       *event,
-     return;
- 
-   real_event = (ClutterEventPrivate *) event;
--  real_event->source_device = device;
-+  g_set_object (&real_event->source_device, device);
- }
- 
- /**
--- 
-2.19.2
-
diff --git a/SOURCES/0002-monitor-manager-kms-Check-if-GPUs-can-have-outputs.patch b/SOURCES/0002-monitor-manager-kms-Check-if-GPUs-can-have-outputs.patch
deleted file mode 100644
index 71a591e..0000000
--- a/SOURCES/0002-monitor-manager-kms-Check-if-GPUs-can-have-outputs.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-From aa6d1614c069496bab3f6fa5d374c727fa352742 Mon Sep 17 00:00:00 2001
-From: Iain Lane <iainl@gnome.org>
-Date: Mon, 13 Aug 2018 10:22:22 +0000
-Subject: [PATCH 2/2] monitor-manager-kms: Check if GPUs can have outputs
-
-We need a way for mutter to exit if no available GPUs are going to work.
-For example if gdm starts gnome-shell and we're using a DRM driver that
-doesn't work with KMS then we should exit so that GDM can try with Xorg,
-rather than operating in headless mode.
-
-Related: https://gitlab.gnome.org/GNOME/mutter/issues/223
-
-
-(cherry picked from commit deb541ef5ac2cc07d0259c259bff8d1523388d47)
----
- src/backends/native/meta-gpu-kms.c            |  8 ++++++++
- src/backends/native/meta-gpu-kms.h            |  2 ++
- .../native/meta-monitor-manager-kms.c         | 20 +++++++++++++++++++
- 3 files changed, 30 insertions(+)
-
-diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
-index 7e7607c46..08c1e7dbe 100644
---- a/src/backends/native/meta-gpu-kms.c
-+++ b/src/backends/native/meta-gpu-kms.c
-@@ -797,6 +797,12 @@ meta_gpu_kms_read_current (MetaGpu  *gpu,
-   return TRUE;
- }
- 
-+gboolean
-+meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms)
-+{
-+  return gpu_kms->n_connectors > 0;
-+}
-+
- MetaGpuKms *
- meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
-                   const char             *kms_file_path,
-@@ -860,6 +866,8 @@ meta_gpu_kms_new (MetaMonitorManagerKms  *monitor_manager_kms,
- 
-   drmSetClientCap (gpu_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
- 
-+  meta_gpu_kms_read_current (META_GPU (gpu_kms), NULL);
-+
-   source = g_source_new (&kms_event_funcs, sizeof (MetaKmsSource));
-   kms_source = (MetaKmsSource *) source;
-   kms_source->fd_tag = g_source_add_unix_fd (source,
-diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h
-index 3d0f5f65e..d53ed98c8 100644
---- a/src/backends/native/meta-gpu-kms.h
-+++ b/src/backends/native/meta-gpu-kms.h
-@@ -59,6 +59,8 @@ gboolean meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
-                                        int         y,
-                                        uint32_t    fb_id);
- 
-+gboolean meta_gpu_kms_can_have_outputs (MetaGpuKms *gpu_kms);
-+
- gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
-                                       MetaCrtc   *crtc);
- 
-diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
-index d8e7b848d..438069110 100644
---- a/src/backends/native/meta-monitor-manager-kms.c
-+++ b/src/backends/native/meta-monitor-manager-kms.c
-@@ -642,10 +642,12 @@ meta_monitor_manager_kms_initable_init (GInitable    *initable,
-                                         GError      **error)
- {
-   MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (initable);
-+  MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
-   const char *subsystems[2] = { "drm", NULL };
-   GList *gpu_paths;
-   g_autofree char *primary_gpu_path = NULL;
-   GList *l;
-+  gboolean can_have_outputs;
- 
-   manager_kms->udev = g_udev_client_new (subsystems);
- 
-@@ -694,6 +696,24 @@ meta_monitor_manager_kms_initable_init (GInitable    *initable,
-     }
-   g_list_free_full (gpu_paths, g_free);
- 
-+  can_have_outputs = FALSE;
-+  for (l = meta_monitor_manager_get_gpus (manager); l; l = l->next)
-+    {
-+      MetaGpuKms *gpu_kms = l->data;
-+
-+      if (meta_gpu_kms_can_have_outputs (gpu_kms))
-+        {
-+          can_have_outputs = TRUE;
-+          break;
-+        }
-+    }
-+  if (!can_have_outputs)
-+    {
-+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
-+                   "No GPUs with outputs found");
-+      return FALSE;
-+    }
-+
-   return TRUE;
- }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0002-wayland-surface-Add-API-to-cache-frame-callbacks.patch b/SOURCES/0002-wayland-surface-Add-API-to-cache-frame-callbacks.patch
deleted file mode 100644
index fb481f6..0000000
--- a/SOURCES/0002-wayland-surface-Add-API-to-cache-frame-callbacks.patch
+++ /dev/null
@@ -1,70 +0,0 @@
-From 4dfe4256ae66a151fb5a570f34af0f85f3e5e0f5 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 27 Aug 2018 12:05:58 +0200
-Subject: [PATCH 2/8] wayland/surface: Add API to cache frame callbacks
-
-Sometimes it may be useful for roles to put callbacks in the generic
-surface frame callback queue. The surface frame callback queue will
-either eventually be processed on the next surface role assignment that
-places the frame callbacks in a role specific queue, processed at some
-other point in time by a role, or cleaned up on surface destruction.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit 0ace58d05f3e50f4fdcf4971baab163e6ae5a1e9)
----
- src/wayland/meta-wayland-surface.c | 17 ++++++++++-------
- src/wayland/meta-wayland-surface.h |  3 +++
- 2 files changed, 13 insertions(+), 7 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
-index d2f5ffccf..3c9a404c7 100644
---- a/src/wayland/meta-wayland-surface.c
-+++ b/src/wayland/meta-wayland-surface.c
-@@ -602,6 +602,15 @@ parent_surface_state_applied (gpointer data,
-   meta_wayland_subsurface_parent_state_applied (subsurface);
- }
- 
-+void
-+meta_wayland_surface_cache_pending_frame_callbacks (MetaWaylandSurface      *surface,
-+                                                    MetaWaylandPendingState *pending)
-+{
-+  wl_list_insert_list (&surface->pending_frame_callback_list,
-+                       &pending->frame_callback_list);
-+  wl_list_init (&pending->frame_callback_list);
-+}
-+
- void
- meta_wayland_surface_apply_pending_state (MetaWaylandSurface      *surface,
-                                           MetaWaylandPendingState *pending)
-@@ -722,13 +731,7 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface      *surface,
-     }
-   else
-     {
--      /* Since there is no role assigned to the surface yet, keep frame
--       * callbacks queued until a role is assigned and we know how
--       * the surface will be drawn.
--       */
--      wl_list_insert_list (&surface->pending_frame_callback_list,
--                           &pending->frame_callback_list);
--      wl_list_init (&pending->frame_callback_list);
-+      meta_wayland_surface_cache_pending_frame_callbacks (surface, pending);
- 
-       if (pending->newly_attached)
-         {
-diff --git a/src/wayland/meta-wayland-surface.h b/src/wayland/meta-wayland-surface.h
-index 05d2a0a24..46accd900 100644
---- a/src/wayland/meta-wayland-surface.h
-+++ b/src/wayland/meta-wayland-surface.h
-@@ -261,6 +261,9 @@ MetaWaylandSurface *meta_wayland_surface_get_toplevel (MetaWaylandSurface *surfa
- 
- MetaWindow *        meta_wayland_surface_get_toplevel_window (MetaWaylandSurface *surface);
- 
-+void                meta_wayland_surface_cache_pending_frame_callbacks (MetaWaylandSurface      *surface,
-+                                                                        MetaWaylandPendingState *pending);
-+
- void                meta_wayland_surface_queue_pending_frame_callbacks (MetaWaylandSurface *surface);
- 
- void                meta_wayland_surface_queue_pending_state_frame_callbacks (MetaWaylandSurface      *surface,
--- 
-2.19.0
-
diff --git a/SOURCES/0002-window-Emit-an-error-and-return-when-trying-to-activ.patch b/SOURCES/0002-window-Emit-an-error-and-return-when-trying-to-activ.patch
new file mode 100644
index 0000000..fedf5ce
--- /dev/null
+++ b/SOURCES/0002-window-Emit-an-error-and-return-when-trying-to-activ.patch
@@ -0,0 +1,42 @@
+From 9a8bb8a205656ca1089444a041c99c5591477642 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
+Date: Fri, 3 May 2019 18:10:47 +0000
+Subject: [PATCH 2/2] window: Emit an error and return when trying to activate
+ an unmanaged
+
+If something (i.e. gnome-shell or an extension) tries to activate an unmanaged
+window, we should warn about this and avoid to perform further actions as this
+could lead to a crash of mutter, since the window has not valid flags (like
+workspace) set anymore at this stage.
+
+Fixes https://gitlab.gnome.org/GNOME/mutter/issues/580
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/564
+
+
+(cherry picked from commit a6fc656e917fd48b8708b8d9f4bf9f8b15581313)
+---
+ src/core/window.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/src/core/window.c b/src/core/window.c
+index d2c24506b..725cca7ce 100644
+--- a/src/core/window.c
++++ b/src/core/window.c
+@@ -3683,6 +3683,13 @@ meta_window_activate_full (MetaWindow     *window,
+ {
+   MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
+   gboolean allow_workspace_switch;
++
++  if (window->unmanaging)
++    {
++      g_warning ("Trying to activate unmanaged window '%s'", window->desc);
++      return;
++    }
++
+   meta_topic (META_DEBUG_FOCUS,
+               "_NET_ACTIVE_WINDOW message sent for %s at time %u "
+               "by client type %u.\n",
+-- 
+2.21.0
+
diff --git a/SOURCES/0002-window-Explicitly-exclude-unmanaging-window-from-foc.patch b/SOURCES/0002-window-Explicitly-exclude-unmanaging-window-from-foc.patch
deleted file mode 100644
index 21a81c5..0000000
--- a/SOURCES/0002-window-Explicitly-exclude-unmanaging-window-from-foc.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 137f22236cba5f2583d8db3d957e3926d1f7f668 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Fri, 25 May 2018 21:24:17 +0200
-Subject: [PATCH 2/3] window: Explicitly exclude unmanaging window from focus
- again
-
-Since commit b3b9d9e16 we no longer have to pass the unmanaging window
-to make sure we don't try to focus it again, however the parameter also
-influences the focus policy by giving ancestors preference over the normal
-stack order.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/15
-
-(cherry picked from commit d99442d6e6b7c9b383863cc754db609398d4e65b)
----
- src/core/window.c | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index 5b1eb5b68..cc0813ac4 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -1469,7 +1469,9 @@ meta_window_unmanage (MetaWindow  *window,
-       meta_topic (META_DEBUG_FOCUS,
-                   "Focusing default window since we're unmanaging %s\n",
-                   window->desc);
--      meta_workspace_focus_default_window (window->screen->active_workspace, NULL, timestamp);
-+      meta_workspace_focus_default_window (window->screen->active_workspace,
-+                                           window,
-+                                           timestamp);
-     }
-   else
-     {
--- 
-2.19.0
-
diff --git a/SOURCES/0002-window-Force-update-monitor-on-hot-plugs.patch b/SOURCES/0002-window-Force-update-monitor-on-hot-plugs.patch
deleted file mode 100644
index c627e71..0000000
--- a/SOURCES/0002-window-Force-update-monitor-on-hot-plugs.patch
+++ /dev/null
@@ -1,203 +0,0 @@
-From 83b7b17b64b3e42a87f524ac3504be81789ec0fc Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 24 Aug 2018 12:56:31 +0200
-Subject: [PATCH 2/2] window: Force update monitor on hot plugs
-
-Commit a3da4b8d5bd217c0262fd9361036877d155a300f changed updating of
-window monitors to always use take affect when it was done from a
-non-user operation. This could cause feed back loops when a non-user
-driven operation would trigger the changing of a monitor, which itself
-would trigger changing of the monitor again due to a window scale
-change.
-
-The reason for the change, was that when the window monitor changed due
-to a hot plug, if it didn't actually change, eventually the window
-monitor pointer would be pointing to freed memory.
-
-Instead of force updating the monitor on all non-user operations, just
-do it on hot plugs. This allows for the feedback loop preventing logic
-to still do what its supposed to do, without risking dangling pointers
-on hot plugs.
-
-Related: https://gitlab.gnome.org/GNOME/mutter/issues/189
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/192
-
-(cherry picked from commit 8d3e053059cd202e740076caedfc8e3ac149066a)
----
- src/core/window-private.h | 1 +
- src/core/window.c         | 4 ++--
- 2 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/src/core/window-private.h b/src/core/window-private.h
-index bed2fc7f6..8552829b2 100644
---- a/src/core/window-private.h
-+++ b/src/core/window-private.h
-@@ -98,60 +98,61 @@ typedef enum
-   META_PLACEMENT_GRAVITY_TOP    = 1 << 0,
-   META_PLACEMENT_GRAVITY_BOTTOM = 1 << 1,
-   META_PLACEMENT_GRAVITY_LEFT   = 1 << 2,
-   META_PLACEMENT_GRAVITY_RIGHT  = 1 << 3,
- } MetaPlacementGravity;
- 
- typedef enum
- {
-   META_PLACEMENT_ANCHOR_NONE   = 0,
-   META_PLACEMENT_ANCHOR_TOP    = 1 << 0,
-   META_PLACEMENT_ANCHOR_BOTTOM = 1 << 1,
-   META_PLACEMENT_ANCHOR_LEFT   = 1 << 2,
-   META_PLACEMENT_ANCHOR_RIGHT  = 1 << 3,
- } MetaPlacementAnchor;
- 
- typedef enum
- {
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_NONE     = 0,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X  = 1 << 0,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y  = 1 << 1,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X   = 1 << 2,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y   = 1 << 3,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_X = 1 << 4,
-   META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 1 << 5,
- } MetaPlacementConstraintAdjustment;
- 
- typedef enum _MetaWindowUpdateMonitorFlags
- {
-   META_WINDOW_UPDATE_MONITOR_FLAGS_NONE = 0,
-   META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP = 1 << 0,
-+  META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE = 1 << 1,
- } MetaWindowUpdateMonitorFlags;
- 
- typedef struct _MetaPlacementRule
- {
-   MetaRectangle anchor_rect;
-   MetaPlacementGravity gravity;
-   MetaPlacementAnchor anchor;
-   MetaPlacementConstraintAdjustment constraint_adjustment;
-   int offset_x;
-   int offset_y;
-   int width;
-   int height;
- } MetaPlacementRule;
- 
- typedef enum
- {
-   META_EDGE_CONSTRAINT_NONE    = 0,
-   META_EDGE_CONSTRAINT_WINDOW  = 1,
-   META_EDGE_CONSTRAINT_MONITOR = 2,
- } MetaEdgeConstraint;
- 
- struct _MetaWindow
- {
-   GObject parent_instance;
- 
-   MetaDisplay *display;
-   MetaScreen *screen;
-   guint64 stamp;
-   MetaLogicalMonitor *monitor;
-   MetaWorkspace *workspace;
-diff --git a/src/core/window.c b/src/core/window.c
-index ad4059704..07f826bb5 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -3776,97 +3776,97 @@ find_monitor_by_winsys_id (MetaWindow *window,
-   logical_monitors =
-     meta_monitor_manager_get_logical_monitors (monitor_manager);
- 
-   for (l = logical_monitors; l; l = l->next)
-     {
-       MetaLogicalMonitor *logical_monitor = l->data;
- 
-       if (logical_monitor->winsys_id == winsys_id)
-         return logical_monitor;
-     }
- 
-   return NULL;
- }
- 
- /* This is called when the monitor setup has changed. The window->monitor
-  * reference is still "valid", but refer to the previous monitor setup */
- void
- meta_window_update_for_monitors_changed (MetaWindow *window)
- {
-   MetaBackend *backend = meta_get_backend ();
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   const MetaLogicalMonitor *old, *new;
- 
-   if (meta_window_has_fullscreen_monitors (window))
-     meta_window_clear_fullscreen_monitors (window);
- 
-   if (window->override_redirect || window->type == META_WINDOW_DESKTOP)
-     {
-       meta_window_update_monitor (window,
--                                  META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
-+                                  META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE);
-       return;
-     }
- 
-   old = window->monitor;
- 
-   /* Try the preferred output first */
-   new = find_monitor_by_winsys_id (window, window->preferred_output_winsys_id);
- 
-   /* Otherwise, try to find the old output on a new monitor */
-   if (old && !new)
-     new = find_monitor_by_winsys_id (window, old->winsys_id);
- 
-   /* Fall back to primary if everything else failed */
-   if (!new)
-     new = meta_monitor_manager_get_primary_logical_monitor (monitor_manager);
- 
-   if (new && old)
-     {
-       if (window->tile_mode != META_TILE_NONE)
-         window->tile_monitor_number = new->number;
- 
-       /* This will eventually reach meta_window_update_monitor that
-        * will send leave/enter-monitor events. The old != new monitor
-        * check will always fail (due to the new logical_monitors set) so
-        * we will always send the events, even if the new and old monitor
-        * index is the same. That is right, since the enumeration of the
-        * monitors changed and the same index could be refereing
-        * to a different monitor. */
-       meta_window_move_between_rects (window,
-                                       &old->rect,
-                                       &new->rect);
-     }
-   else
-     {
-       meta_window_update_monitor (window,
--                                  META_WINDOW_UPDATE_MONITOR_FLAGS_NONE);
-+                                  META_WINDOW_UPDATE_MONITOR_FLAGS_FORCE);
-     }
- }
- 
- void
- meta_window_update_monitor (MetaWindow                   *window,
-                             MetaWindowUpdateMonitorFlags  flags)
- {
-   const MetaLogicalMonitor *old;
- 
-   old = window->monitor;
-   META_WINDOW_GET_CLASS (window)->update_main_monitor (window, flags);
-   if (old != window->monitor)
-     {
-       meta_window_on_all_workspaces_changed (window);
- 
-       /* If workspaces only on primary and we moved back to primary due to a user action,
-        * ensure that the window is now in that workspace. We do this because while
-        * the window is on a non-primary monitor it is always visible, so it would be
-        * very jarring if it disappeared when it crossed the monitor border.
-        * The one time we want it to both change to the primary monitor and a non-active
-        * workspace is when dropping the window on some other workspace thumbnail directly.
-        * That should be handled by explicitly moving the window before changing the
-        * workspace.
-        */
-       if (meta_prefs_get_workspaces_only_on_primary () &&
-           flags & META_WINDOW_UPDATE_MONITOR_FLAGS_USER_OP &&
-           meta_window_is_on_primary_monitor (window)  &&
-           window->screen->active_workspace != window->workspace)
-         meta_window_change_workspace (window, window->screen->active_workspace);
- 
--- 
-2.18.1
-
diff --git a/SOURCES/0002-xprops-Make-sure-text_property_to_utf8-returns-UTF8.patch b/SOURCES/0002-xprops-Make-sure-text_property_to_utf8-returns-UTF8.patch
deleted file mode 100644
index 61c7c2d..0000000
--- a/SOURCES/0002-xprops-Make-sure-text_property_to_utf8-returns-UTF8.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 72221729a46a6466203d218e82ac3cbb1623a44c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Tue, 9 Oct 2018 00:29:01 +0200
-Subject: [PATCH 2/2] xprops: Make sure text_property_to_utf8() returns UTF8
-
-Commit 840378ae682 changed the code to use XmbTextPropertyToTextList()
-instead of gdk_text_property_to_utf8_list_for_display(), but didn't
-take into account that the replacement returns text in the current
-locale's encoding, while any callers (rightfully) expect UTF8.
-
-Fix this by converting the text if necessary.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/227
----
- src/x11/xprops.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/x11/xprops.c b/src/x11/xprops.c
-index cffa5958ad..ca686b2fa8 100644
---- a/src/x11/xprops.c
-+++ b/src/x11/xprops.c
-@@ -637,6 +637,7 @@ text_property_to_utf8 (Display *xdisplay,
- {
-   char *ret = NULL;
-   char **local_list = NULL;
-+  const char *charset = NULL;
-   int count = 0;
-   int res;
- 
-@@ -647,7 +648,10 @@ text_property_to_utf8 (Display *xdisplay,
-   if (count == 0)
-     goto out;
- 
--  ret = g_strdup (local_list[0]);
-+  if (g_get_charset (&charset))
-+    ret = g_strdup (local_list[0]);
-+  else
-+    ret = g_convert (local_list[0], -1, "UTF-8", charset, NULL, NULL, NULL);
- 
-  out:
-   XFreeStringList (local_list);
--- 
-2.17.1
-
diff --git a/SOURCES/0003-backend-add-signals-for-reporting-suspend-and-resume.patch b/SOURCES/0003-backend-add-signals-for-reporting-suspend-and-resume.patch
index d0ab718..03adc3a 100644
--- a/SOURCES/0003-backend-add-signals-for-reporting-suspend-and-resume.patch
+++ b/SOURCES/0003-backend-add-signals-for-reporting-suspend-and-resume.patch
@@ -1,4 +1,4 @@
-From 4ac28995769b7820d802683bf86f1dc6c821a52b Mon Sep 17 00:00:00 2001
+From c5020c3d303ab211a970d88638e7d723034688db Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Thu, 10 Jan 2019 10:47:19 -0500
 Subject: [PATCH 3/9] backend: add signals for reporting suspend and resume
@@ -9,142 +9,36 @@ to MetaBackend.
 It's preliminary work needed for tracking when to purge
 and recreate all textures (needed by nvidia).
 ---
- src/backends/meta-backend.c | 99 ++++++++++++++++++++++++++++++++-----
- 1 file changed, 87 insertions(+), 12 deletions(-)
+ src/backends/meta-backend.c    | 98 ++++++++++++++++++++++++++++++----
+ src/org.freedesktop.login1.xml |  1 +
+ 2 files changed, 88 insertions(+), 11 deletions(-)
 
 diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
-index 2f090e233..eb8790967 100644
+index 5d71977c6..f59b899b7 100644
 --- a/src/backends/meta-backend.c
 +++ b/src/backends/meta-backend.c
-@@ -1,93 +1,96 @@
- /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
- 
- /*
-  * Copyright (C) 2014 Red Hat
-  *
-  * This program is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU General Public License as
-  * published by the Free Software Foundation; either version 2 of the
-  * License, or (at your option) any later version.
-  *
-  * This program is distributed in the hope that it will be useful, but
-  * WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  * General Public License for more details.
-  *
-  * You should have received a copy of the GNU General Public License
-  * along with this program; if not, write to the Free Software
-  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-  * 02111-1307, USA.
-  *
-  * Written by:
-  *     Jasper St. Pierre <jstpierre@mecheye.net>
-  */
- 
- #include "config.h"
+@@ -53,6 +53,8 @@
  
  #include <stdlib.h>
  
 +#include <gio/gunixfdlist.h>
 +
- #include <clutter/clutter-mutter.h>
- #include <meta/meta-backend.h>
- #include <meta/main.h>
- #include <meta/util.h>
- #include "meta-backend-private.h"
- #include "meta-input-settings-private.h"
- #include "backends/x11/meta-backend-x11.h"
- #include "meta-cursor-tracker-private.h"
- #include "meta-stage-private.h"
- #include "meta-dbus-login1.h"
- 
- #ifdef HAVE_REMOTE_DESKTOP
- #include "backends/meta-dbus-session-watcher.h"
- #include "backends/meta-screen-cast.h"
- #include "backends/meta-remote-access-controller-private.h"
- #include "backends/meta-remote-desktop.h"
- #endif
- 
- #ifdef HAVE_NATIVE_BACKEND
- #include "backends/native/meta-backend-native.h"
- #endif
- 
+ #include "backends/meta-cursor-tracker-private.h"
  #include "backends/meta-idle-monitor-private.h"
- #include "backends/meta-logical-monitor.h"
- #include "backends/meta-monitor-manager-dummy.h"
- #include "backends/meta-settings-private.h"
- 
- #define META_IDLE_MONITOR_CORE_DEVICE 0
- 
- enum
- {
-   KEYMAP_CHANGED,
-   KEYMAP_LAYOUT_GROUP_CHANGED,
+ #include "backends/meta-input-settings-private.h"
+@@ -87,6 +89,8 @@ enum
    LAST_DEVICE_CHANGED,
--
+   LID_IS_CLOSED_CHANGED,
+ 
 +  SUSPENDING,
 +  RESUMING,
    N_SIGNALS
  };
  
- static guint signals[N_SIGNALS];
- 
- static MetaBackend *_backend;
- 
- static gboolean stage_views_disabled = FALSE;
- 
- /**
-  * meta_get_backend:
-  *
-  * Accessor for the singleton MetaBackend.
-  *
-  * Returns: (transfer none): The only #MetaBackend there is.
-  */
- MetaBackend *
- meta_get_backend (void)
- {
-   return _backend;
- }
- 
- struct _MetaBackendPrivate
- {
-   MetaMonitorManager *monitor_manager;
-   MetaOrientationManager *orientation_manager;
-   MetaCursorTracker *cursor_tracker;
-   MetaCursorRenderer *cursor_renderer;
-   MetaInputSettings *input_settings;
-   MetaRenderer *renderer;
-@@ -523,149 +526,221 @@ meta_backend_class_init (MetaBackendClass *klass)
-   object_class->finalize = meta_backend_finalize;
- 
-   klass->post_init = meta_backend_real_post_init;
-   klass->create_cursor_renderer = meta_backend_real_create_cursor_renderer;
-   klass->grab_device = meta_backend_real_grab_device;
-   klass->ungrab_device = meta_backend_real_ungrab_device;
-   klass->select_stage_events = meta_backend_real_select_stage_events;
-   klass->get_relative_motion_deltas = meta_backend_real_get_relative_motion_deltas;
- 
-   signals[KEYMAP_CHANGED] =
-     g_signal_new ("keymap-changed",
-                   G_TYPE_FROM_CLASS (object_class),
-                   G_SIGNAL_RUN_LAST,
-                   0,
-                   NULL, NULL, NULL,
-                   G_TYPE_NONE, 0);
-   signals[KEYMAP_LAYOUT_GROUP_CHANGED] =
-     g_signal_new ("keymap-layout-group-changed",
-                   G_TYPE_FROM_CLASS (object_class),
-                   G_SIGNAL_RUN_LAST,
+@@ -745,6 +749,20 @@ meta_backend_class_init (MetaBackendClass *klass)
                    0,
                    NULL, NULL, NULL,
-                   G_TYPE_NONE, 1, G_TYPE_UINT);
-   signals[LAST_DEVICE_CHANGED] =
-     g_signal_new ("last-device-changed",
-                   G_TYPE_FROM_CLASS (object_class),
-                   G_SIGNAL_RUN_LAST,
-                   0,
-                   NULL, NULL, NULL,
-                   G_TYPE_NONE, 1, G_TYPE_INT);
+                   G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
 +  signals[SUSPENDING] =
 +    g_signal_new ("suspending",
 +                  G_TYPE_FROM_CLASS (object_class),
@@ -162,37 +56,10 @@ index 2f090e233..eb8790967 100644
  
    mutter_stage_views = g_getenv ("MUTTER_STAGE_VIEWS");
    stage_views_disabled = g_strcmp0 (mutter_stage_views, "0") == 0;
- }
- 
- static MetaMonitorManager *
- meta_backend_create_monitor_manager (MetaBackend *backend,
-                                      GError     **error)
- {
-   if (g_getenv ("META_DUMMY_MONITORS"))
-     return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
- 
-   return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend,
-                                                                    error);
- }
- 
- static MetaRenderer *
- meta_backend_create_renderer (MetaBackend *backend,
-                               GError     **error)
- {
+@@ -768,15 +786,66 @@ meta_backend_create_renderer (MetaBackend *backend,
    return META_BACKEND_GET_CLASS (backend)->create_renderer (backend, error);
  }
  
- static void
- lid_is_closed_changed_cb (UpClient   *client,
-                           GParamSpec *pspec,
-                           gpointer    user_data)
- {
-   if (up_client_get_lid_is_closed (client))
-     return;
- 
-   meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
- }
- 
 +static void
 +inhibit_sleep (MetaBackend *backend)
 +{
@@ -260,26 +127,7 @@ index 2f090e233..eb8790967 100644
    meta_idle_monitor_reset_idletime (meta_idle_monitor_get_core ());
  }
  
- static Login1Manager *
- get_logind_proxy (GCancellable *cancellable,
-                   GError      **error)
- {
-   Login1Manager *proxy;
- 
-   proxy =
-     login1_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                            G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
-                                            "org.freedesktop.login1",
-                                            "/org/freedesktop/login1",
-                                            cancellable, error);
-   if (!proxy)
-     g_prefix_error (error, "Could not get logind proxy: ");
- 
-   return proxy;
- }
- 
- static void
- system_bus_gotten_cb (GObject      *object,
+@@ -803,6 +872,7 @@ system_bus_gotten_cb (GObject      *object,
                        GAsyncResult *res,
                        gpointer      user_data)
  {
@@ -287,11 +135,7 @@ index 2f090e233..eb8790967 100644
    MetaBackendPrivate *priv;
    g_autoptr (GError) error = NULL;
    GDBusConnection *bus;
- 
-   bus = g_bus_get_finish (res, NULL);
-   if (!bus)
-     return;
- 
+@@ -814,15 +884,21 @@ system_bus_gotten_cb (GObject      *object,
    priv = meta_backend_get_instance_private (user_data);
    priv->system_bus = bus;
    priv->logind_proxy = get_logind_proxy (priv->cancellable, &error);
@@ -320,33 +164,18 @@ index 2f090e233..eb8790967 100644
  }
  
  static gboolean
- meta_backend_initable_init (GInitable     *initable,
-                             GCancellable  *cancellable,
-                             GError       **error)
- {
-   MetaBackend *backend = META_BACKEND (initable);
-   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
- 
-   priv->settings = meta_settings_new (backend);
- 
-   priv->egl = g_object_new (META_TYPE_EGL, NULL);
- 
-   priv->orientation_manager = g_object_new (META_TYPE_ORIENTATION_MANAGER, NULL);
- 
-   priv->monitor_manager = meta_backend_create_monitor_manager (backend, error);
-   if (!priv->monitor_manager)
-     return FALSE;
- 
-   priv->renderer = meta_backend_create_renderer (backend, error);
-   if (!priv->renderer)
-     return FALSE;
- 
-   priv->cursor_tracker = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
- 
-   priv->dnd = g_object_new (META_TYPE_DND, NULL);
- 
-   priv->up_client = up_client_new ();
-   g_signal_connect (priv->up_client, "notify::lid-is-closed",
+diff --git a/src/org.freedesktop.login1.xml b/src/org.freedesktop.login1.xml
+index 1ecfd976f..7db8f373c 100644
+--- a/src/org.freedesktop.login1.xml
++++ b/src/org.freedesktop.login1.xml
+@@ -46,6 +46,7 @@
+ 
+   <interface name="org.freedesktop.login1.Manager">
+     <method name="Inhibit">
++      <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
+       <arg name="what" type="s" direction="in"/>
+       <arg name="who" type="s" direction="in"/>
+       <arg name="why" type="s" direction="in"/>
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0003-remote-desktop-Do-not-leak-the-virtual-touchscreen.patch b/SOURCES/0003-remote-desktop-Do-not-leak-the-virtual-touchscreen.patch
deleted file mode 100644
index e63ce67..0000000
--- a/SOURCES/0003-remote-desktop-Do-not-leak-the-virtual-touchscreen.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 22c109d082c5403902bcc1afb6661f951246c5bd Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Mon, 19 Nov 2018 11:49:41 +0100
-Subject: [PATCH 03/12] remote-desktop: Do not leak the virtual touchscreen
-
-Virtual keyboard and pointer are freed on session close, but the
-virtual touchscreen isn't.
-
-Avoid a leak by freeing the virtual touchscreen along with the rest of
-virtual devices.
----
- src/backends/meta-remote-desktop-session.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/backends/meta-remote-desktop-session.c b/src/backends/meta-remote-desktop-session.c
-index 73bcf66..181b7ea 100644
---- a/src/backends/meta-remote-desktop-session.c
-+++ b/src/backends/meta-remote-desktop-session.c
-@@ -160,6 +160,7 @@ meta_remote_desktop_session_close (MetaRemoteDesktopSession *session)
- 
-   g_clear_object (&session->virtual_pointer);
-   g_clear_object (&session->virtual_keyboard);
-+  g_clear_object (&session->virtual_touchscreen);
- 
-   meta_dbus_session_notify_closed (META_DBUS_SESSION (session));
-   meta_dbus_remote_desktop_session_emit_closed (skeleton);
--- 
-2.19.2
-
diff --git a/SOURCES/0003-tests-Add-closed-transient-test.patch b/SOURCES/0003-tests-Add-closed-transient-test.patch
deleted file mode 100644
index c37787a..0000000
--- a/SOURCES/0003-tests-Add-closed-transient-test.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From 0a09a3c9063230d9a3f170371f93d2d2280d8e06 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Thu, 19 Jul 2018 11:47:12 +0200
-Subject: [PATCH 3/3] tests: Add "closed-transient" test
-
-When a transient window is destroyed, the expected behavior is that
-focus is passed to the ancestor if possible. This was broken for
-quite a while until the previous commit, so add a test case to make
-sure it doesn't happen again.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/15
-
-(cherry-picked from commit 137f22236cba5f2583d8db3d957e3926d1f7f668)
----
- src/Makefile-tests.am                        |  1 +
- src/tests/stacking/closed-transient.metatest | 19 +++++++++++++++++++
- 2 files changed, 20 insertions(+)
- create mode 100644 src/tests/stacking/closed-transient.metatest
-
-diff --git a/src/Makefile-tests.am b/src/Makefile-tests.am
-index 72706e2bd..4be832cc9 100644
---- a/src/Makefile-tests.am
-+++ b/src/Makefile-tests.am
-@@ -14,6 +14,7 @@ stackingdir = $(pkgdatadir)/tests/stacking
- dist_stacking_DATA =				\
- 	tests/stacking/basic-x11.metatest	\
- 	tests/stacking/basic-wayland.metatest	\
-+	tests/stacking/closed-transient.metatest	\
- 	tests/stacking/minimized.metatest   	\
- 	tests/stacking/mixed-windows.metatest   \
- 	tests/stacking/set-parent.metatest	\
-diff --git a/src/tests/stacking/closed-transient.metatest b/src/tests/stacking/closed-transient.metatest
-new file mode 100644
-index 000000000..5ca95ba0f
---- /dev/null
-+++ b/src/tests/stacking/closed-transient.metatest
-@@ -0,0 +1,19 @@
-+new_client 1 wayland
-+create 1/1
-+show 1/1
-+
-+new_client 2 wayland
-+create 2/1
-+show 2/1
-+
-+create 1/2
-+show 1/2
-+set_parent 1/2 1
-+
-+wait
-+assert_stacking 1/1 2/1 1/2
-+
-+destroy 1/2
-+
-+wait
-+assert_stacking 2/1 1/1
--- 
-2.19.0
-
diff --git a/SOURCES/0003-wayland-xdg-shell-Cache-pending-frame-callbacks-on-p.patch b/SOURCES/0003-wayland-xdg-shell-Cache-pending-frame-callbacks-on-p.patch
deleted file mode 100644
index 0b5abd3..0000000
--- a/SOURCES/0003-wayland-xdg-shell-Cache-pending-frame-callbacks-on-p.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From 0a85e6272e7d04edc6c754affeea8d66716cc9fb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 25 Jul 2018 11:53:17 +0200
-Subject: [PATCH 3/8] wayland/xdg-shell: Cache pending frame callbacks on popup
- reset
-
-A popup can be reset, and when that happens, window and actor are
-destroyed, and won't be created again unless it is reassigned the
-popup role.
-
-If a client queued frame callbacks when resetting a popup, the frame
-callbacks would be left in the pending state, as they were not queued on
-the actor, meaning we'd hit an assert about the frame callbacks not
-being handled. Fix this by caching them on the MetaWaylandSurface, so
-that they either are cleaned up on destruction, or queued on the actor
-would the surface be re-assigned the popup role.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit 407d62943c1c0bbb34df5943b6b2d91c5723b6c4)
----
- src/wayland/meta-wayland-xdg-shell.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
-index 4ab638f74..3cf6b5716 100644
---- a/src/wayland/meta-wayland-xdg-shell.c
-+++ b/src/wayland/meta-wayland-xdg-shell.c
-@@ -962,6 +962,7 @@ meta_wayland_xdg_popup_commit (MetaWaylandSurfaceRole  *surface_role,
-   if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
-     {
-       meta_wayland_xdg_surface_reset (xdg_surface);
-+      meta_wayland_surface_cache_pending_frame_callbacks (surface, pending);
-       return;
-     }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0004-screen-cast-src-Add-VideoCrop-support.patch b/SOURCES/0004-screen-cast-src-Add-VideoCrop-support.patch
deleted file mode 100644
index 354286d..0000000
--- a/SOURCES/0004-screen-cast-src-Add-VideoCrop-support.patch
+++ /dev/null
@@ -1,169 +0,0 @@
-From 20dbf18596feafc17341c330d573807b4940a636 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Thu, 22 Nov 2018 11:59:10 +0100
-Subject: [PATCH 04/12] screen-cast-src: Add VideoCrop support
-
-To be able to cast windows, which by definition can change in size
-dynamically, we need a way to specify the video crop meta to adjust to
-the window size whenever it changes.
-
-Add VideoCrop support with a new optional hook `get_videocrop()` in the
-`ScreenCastStreamSrcClass` which, if defined, can let the child specify
-a rectangle for the video cropping area.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit f64eba57ce3fb67a65a5c5755469d4b97067030f)
----
- src/backends/meta-screen-cast-stream-src.c | 56 ++++++++++++++++++++--
- src/backends/meta-screen-cast-stream-src.h |  3 ++
- 2 files changed, 55 insertions(+), 4 deletions(-)
-
-diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
-index 0c4f33b..673a464 100644
---- a/src/backends/meta-screen-cast-stream-src.c
-+++ b/src/backends/meta-screen-cast-stream-src.c
-@@ -91,6 +91,9 @@ typedef struct _MetaScreenCastStreamSrcPrivate
-   struct spa_video_info_raw video_format;
- 
-   uint64_t last_frame_timestamp_us;
-+
-+  int stream_width;
-+  int stream_height;
- } MetaScreenCastStreamSrcPrivate;
- 
- static void
-@@ -117,6 +120,19 @@ meta_screen_cast_stream_src_get_specs (MetaScreenCastStreamSrc *src,
-   klass->get_specs (src, width, height, frame_rate);
- }
- 
-+static gboolean
-+meta_screen_cast_stream_src_get_videocrop (MetaScreenCastStreamSrc *src,
-+                                           MetaRectangle           *crop_rect)
-+{
-+  MetaScreenCastStreamSrcClass *klass =
-+    META_SCREEN_CAST_STREAM_SRC_GET_CLASS (src);
-+
-+  if (klass->get_videocrop)
-+    return klass->get_videocrop (src, crop_rect);
-+
-+  return FALSE;
-+}
-+
- static void
- meta_screen_cast_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-                                           uint8_t                 *data)
-@@ -132,8 +148,10 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
- {
-   MetaScreenCastStreamSrcPrivate *priv =
-     meta_screen_cast_stream_src_get_instance_private (src);
-+  MetaRectangle crop_rect;
-   struct pw_buffer *buffer;
-   struct spa_buffer *spa_buffer;
-+  struct spa_meta_video_crop *spa_meta_video_crop;
-   uint8_t *map = NULL;
-   uint8_t *data;
-   uint64_t now_us;
-@@ -182,6 +200,27 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-     }
- 
-   meta_screen_cast_stream_src_record_frame (src, data);
-+
-+  /* Update VideoCrop if needed */
-+  spa_meta_video_crop = spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
-+  if (spa_meta_video_crop)
-+    {
-+      if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
-+        {
-+          spa_meta_video_crop->x = crop_rect.x;
-+          spa_meta_video_crop->y = crop_rect.y;
-+          spa_meta_video_crop->width = crop_rect.width;
-+          spa_meta_video_crop->height = crop_rect.height;
-+        }
-+      else
-+        {
-+          spa_meta_video_crop->x = 0;
-+          spa_meta_video_crop->y = 0;
-+          spa_meta_video_crop->width = priv->stream_width;
-+          spa_meta_video_crop->height = priv->stream_height;
-+        }
-+    }
-+
-   priv->last_frame_timestamp_us = now_us;
- 
-   if (map)
-@@ -275,7 +314,7 @@ on_stream_format_changed (void                 *data,
-   uint8_t params_buffer[1024];
-   int32_t width, height, stride, size;
-   struct spa_pod_builder pod_builder;
--  const struct spa_pod *params[1];
-+  const struct spa_pod *params[2];
-   const int bpp = 4;
- 
-   if (!format)
-@@ -303,6 +342,12 @@ on_stream_format_changed (void                 *data,
-     ":", pipewire_type->param_buffers.buffers, "iru", 16, PROP_RANGE (2, 16),
-     ":", pipewire_type->param_buffers.align, "i", 16);
- 
-+  params[1] = spa_pod_builder_object (
-+    &pod_builder,
-+    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
-+    ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
-+    ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
-+
-   pw_stream_finish_format (priv->pipewire_stream, 0,
-                            params, G_N_ELEMENTS (params));
- }
-@@ -325,7 +370,6 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
-     SPA_POD_BUILDER_INIT (buffer, sizeof (buffer));
-   MetaSpaType *spa_type = &priv->spa_type;
-   struct pw_type *pipewire_type = priv->pipewire_type;
--  int width, height;
-   float frame_rate;
-   MetaFraction frame_rate_fraction;
-   struct spa_fraction max_framerate;
-@@ -344,7 +388,10 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
-       return NULL;
-     }
- 
--  meta_screen_cast_stream_src_get_specs (src, &width, &height, &frame_rate);
-+  meta_screen_cast_stream_src_get_specs (src,
-+                                         &priv->stream_width,
-+                                         &priv->stream_height,
-+                                         &frame_rate);
-   frame_rate_fraction = meta_fraction_from_double (frame_rate);
- 
-   min_framerate = SPA_FRACTION (1, 1);
-@@ -357,7 +404,8 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
-     "I", spa_type->media_type.video,
-     "I", spa_type->media_subtype.raw,
-     ":", spa_type->format_video.format, "I", spa_type->video_format.BGRx,
--    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (width, height),
-+    ":", spa_type->format_video.size, "R", &SPA_RECTANGLE (priv->stream_width,
-+                                                           priv->stream_height),
-     ":", spa_type->format_video.framerate, "F", &SPA_FRACTION (0, 1),
-     ":", spa_type->format_video.max_framerate, "Fru", &max_framerate,
-                                                       PROP_RANGE (&min_framerate,
-diff --git a/src/backends/meta-screen-cast-stream-src.h b/src/backends/meta-screen-cast-stream-src.h
-index c7ac57b..f3b3fd7 100644
---- a/src/backends/meta-screen-cast-stream-src.h
-+++ b/src/backends/meta-screen-cast-stream-src.h
-@@ -26,6 +26,7 @@
- #include <glib-object.h>
- 
- #include "clutter/clutter.h"
-+#include "meta/boxes.h"
- 
- typedef struct _MetaScreenCastStream MetaScreenCastStream;
- 
-@@ -47,6 +48,8 @@ struct _MetaScreenCastStreamSrcClass
-   void (* disable) (MetaScreenCastStreamSrc *src);
-   void (* record_frame) (MetaScreenCastStreamSrc *src,
-                          uint8_t                 *data);
-+  gboolean (* get_videocrop) (MetaScreenCastStreamSrc *src,
-+                              MetaRectangle           *crop_rect);
- };
- 
- void meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src);
--- 
-2.19.2
-
diff --git a/SOURCES/0004-wayland-force-X-clients-to-redraw-on-resume.patch b/SOURCES/0004-wayland-force-X-clients-to-redraw-on-resume.patch
index 93a7bd2..d5a0e9f 100644
--- a/SOURCES/0004-wayland-force-X-clients-to-redraw-on-resume.patch
+++ b/SOURCES/0004-wayland-force-X-clients-to-redraw-on-resume.patch
@@ -1,4 +1,4 @@
-From d20f20c9d4c52b7a96d5c879df5fe322a0ca356c Mon Sep 17 00:00:00 2001
+From a4a703c75e208badf78c81558994a249797dbb0a Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Sat, 12 Jan 2019 12:38:01 -0500
 Subject: [PATCH 4/9] wayland: force X clients to redraw on resume
@@ -17,99 +17,18 @@ to get sent to all clients and get them to redraw.
  3 files changed, 55 insertions(+)
 
 diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
-index 438069110..f9a9e1c6d 100644
+index 9a0364441..7bcceee97 100644
 --- a/src/backends/native/meta-monitor-manager-kms.c
 +++ b/src/backends/native/meta-monitor-manager-kms.c
-@@ -7,60 +7,61 @@
-  * modify it under the terms of the GNU General Public License as
-  * published by the Free Software Foundation; either version 2 of the
-  * License, or (at your option) any later version.
-  *
-  * This program is distributed in the hope that it will be useful, but
-  * WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  * General Public License for more details.
-  *
-  * You should have received a copy of the GNU General Public License
-  * along with this program; if not, write to the Free Software
-  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-  * 02111-1307, USA.
-  *
-  * Author: Giovanni Campagna <gcampagn@redhat.com>
-  */
- 
- #include "config.h"
- 
- #include "meta-monitor-manager-kms.h"
- #include "meta-monitor-config-manager.h"
- #include "meta-backend-native.h"
- #include "meta-crtc.h"
- #include "meta-launcher.h"
- #include "meta-output.h"
- #include "meta-backend-private.h"
- #include "meta-renderer-native.h"
- #include "meta-crtc-kms.h"
- #include "meta-gpu-kms.h"
- #include "meta-output-kms.h"
+@@ -60,6 +60,7 @@
+ #include "clutter/clutter.h"
+ #include "meta/main.h"
+ #include "meta/meta-x11-errors.h"
 +#include "wayland/meta-wayland-outputs.h"
  
- #include <string.h>
- #include <stdlib.h>
- #include <clutter/clutter.h>
- 
- #include <drm.h>
- #include <errno.h>
- #include <sys/ioctl.h>
- #include <sys/mman.h>
- #include <unistd.h>
- 
- #include <meta/main.h>
- #include <meta/errors.h>
- 
- #include <gudev/gudev.h>
- 
  #define DRM_CARD_UDEV_DEVICE_TYPE "drm_minor"
  
- typedef struct
- {
-   GSource source;
- 
-   gpointer fd_tag;
-   MetaMonitorManagerKms *manager_kms;
- } MetaKmsSource;
- 
- struct _MetaMonitorManagerKms
- {
-   MetaMonitorManager parent_instance;
- 
-@@ -388,63 +389,69 @@ on_uevent (GUdevClient *client,
-   handle_hotplug_event (manager);
- }
- 
- static void
- meta_monitor_manager_kms_connect_uevent_handler (MetaMonitorManagerKms *manager_kms)
- {
-   manager_kms->uevent_handler_id = g_signal_connect (manager_kms->udev,
-                                                      "uevent",
-                                                      G_CALLBACK (on_uevent),
-                                                      manager_kms);
- }
- 
- static void
- meta_monitor_manager_kms_disconnect_uevent_handler (MetaMonitorManagerKms *manager_kms)
- {
-   g_signal_handler_disconnect (manager_kms->udev,
-                                manager_kms->uevent_handler_id);
-   manager_kms->uevent_handler_id = 0;
- }
- 
- void
- meta_monitor_manager_kms_pause (MetaMonitorManagerKms *manager_kms)
- {
-   meta_monitor_manager_kms_disconnect_uevent_handler (manager_kms);
- }
- 
- void
+@@ -505,9 +506,15 @@ void
  meta_monitor_manager_kms_resume (MetaMonitorManagerKms *manager_kms)
  {
    MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
@@ -125,65 +44,11 @@ index 438069110..f9a9e1c6d 100644
  }
  
  static gboolean
- meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager  *manager,
-                                                MetaCrtc            *crtc,
-                                                MetaMonitorTransform transform)
- {
-   return meta_crtc_kms_is_transform_handled (crtc, transform);
- }
- 
- static float
- meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager,
-                                                        MetaMonitor        *monitor,
-                                                        MetaMonitorMode    *monitor_mode)
- {
-   return meta_monitor_calculate_mode_scale (monitor, monitor_mode);
- }
- 
- static float *
- meta_monitor_manager_kms_calculate_supported_scales (MetaMonitorManager          *manager,
-                                                      MetaLogicalMonitorLayoutMode layout_mode,
-                                                      MetaMonitor                 *monitor,
-                                                      MetaMonitorMode             *monitor_mode,
-                                                      int                         *n_supported_scales)
- {
-   MetaMonitorScalesConstraint constraints =
-     META_MONITOR_SCALES_CONSTRAINT_NONE;
- 
-   switch (layout_mode)
-     {
 diff --git a/src/wayland/meta-wayland-outputs.c b/src/wayland/meta-wayland-outputs.c
-index 1f99a163d..450f5e484 100644
+index 099e87ab9..bc69d699d 100644
 --- a/src/wayland/meta-wayland-outputs.c
 +++ b/src/wayland/meta-wayland-outputs.c
-@@ -425,60 +425,107 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
- 
-       if (logical_monitor->winsys_id == 0)
-         continue;
- 
-       wayland_output =
-         g_hash_table_lookup (compositor->outputs,
-                              GSIZE_TO_POINTER (logical_monitor->winsys_id));
- 
-       if (wayland_output)
-         {
-           g_hash_table_steal (compositor->outputs,
-                               GSIZE_TO_POINTER (logical_monitor->winsys_id));
-         }
-       else
-         {
-           wayland_output = meta_wayland_output_new (compositor, logical_monitor);
-         }
- 
-       wayland_output_update_for_output (wayland_output, logical_monitor);
-       g_hash_table_insert (new_table,
-                            GSIZE_TO_POINTER (logical_monitor->winsys_id),
-                            wayland_output);
-     }
- 
-   g_hash_table_foreach (compositor->outputs, make_output_inert, NULL);
-   g_timeout_add_seconds (10, delayed_destroy_outputs, compositor->outputs);
- 
+@@ -496,6 +496,53 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
    return new_table;
  }
  
@@ -237,65 +102,11 @@ index 1f99a163d..450f5e484 100644
  static void
  on_monitors_changed (MetaMonitorManager    *monitors,
                       MetaWaylandCompositor *compositor)
- {
-   compositor->outputs = meta_wayland_compositor_update_outputs (compositor, monitors);
- }
- 
- static void
- meta_wayland_output_init (MetaWaylandOutput *wayland_output)
- {
- }
- 
- static void
- meta_wayland_output_finalize (GObject *object)
- {
-   MetaWaylandOutput *wayland_output = META_WAYLAND_OUTPUT (object);
-   GList *l;
- 
-   wl_global_destroy (wayland_output->global);
- 
-   /* Make sure the wl_output destructor doesn't try to access MetaWaylandOutput
-    * after we have freed it.
-    */
-   make_output_resources_inert (wayland_output);
- 
-   G_OBJECT_CLASS (meta_wayland_output_parent_class)->finalize (object);
- }
- 
- static void
- meta_wayland_output_class_init (MetaWaylandOutputClass *klass)
 diff --git a/src/wayland/meta-wayland-outputs.h b/src/wayland/meta-wayland-outputs.h
-index e6b60d5fa..d8c648174 100644
+index ff15a81bd..d649e0fa1 100644
 --- a/src/wayland/meta-wayland-outputs.h
 +++ b/src/wayland/meta-wayland-outputs.h
-@@ -20,32 +20,33 @@
-  *
-  * Written by:
-  *     Jasper St. Pierre <jstpierre@mecheye.net>
-  */
- 
- #ifndef META_WAYLAND_OUTPUTS_H
- #define META_WAYLAND_OUTPUTS_H
- 
- #include "backends/meta-monitor-manager-private.h"
- #include "meta-wayland-private.h"
- 
- #define META_TYPE_WAYLAND_OUTPUT (meta_wayland_output_get_type ())
- G_DECLARE_FINAL_TYPE (MetaWaylandOutput, meta_wayland_output,
-                       META, WAYLAND_OUTPUT, GObject)
- 
- struct _MetaWaylandOutput
- {
-   GObject                   parent;
- 
-   struct wl_global         *global;
-   MetaLogicalMonitor       *logical_monitor;
-   guint                     mode_flags;
-   float                     refresh_rate;
-   gint                      scale;
- 
-   GList                    *resources;
-   GList                    *xdg_output_resources;
+@@ -49,5 +49,6 @@ struct _MetaWaylandOutput
  };
  
  void meta_wayland_outputs_init (MetaWaylandCompositor *compositor);
@@ -303,5 +114,5 @@ index e6b60d5fa..d8c648174 100644
  
  #endif /* META_WAYLAND_OUTPUTS_H */
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0004-wayland-xdg-shell-Cache-frame-callbacks-if-toplevel-.patch b/SOURCES/0004-wayland-xdg-shell-Cache-frame-callbacks-if-toplevel-.patch
deleted file mode 100644
index bb9fed0..0000000
--- a/SOURCES/0004-wayland-xdg-shell-Cache-frame-callbacks-if-toplevel-.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From b5c2555601da7c8b347664e7ef34803e08a52697 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 27 Aug 2018 12:30:07 +0200
-Subject: [PATCH 4/8] wayland/xdg-shell: Cache frame callbacks if toplevel is
- unmanaged
-
-A toplevel window can be unmanaged without the client knowing it (e.g. a
-modal dialog being unmapped together with its parent. When this has
-happened, take frame callbacks queued on a commit and cache them on the
-generic surface queue. If the toplevel is to be remapped, either because
-the surface was reassigned the toplevel role, or if it was reset and
-remapped, the cached frame callbacks will be queued on the surface actor
-and dispatched accordingly.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit 80d420ff430e8e9495fd29d68084cb050600b26f)
----
- src/wayland/meta-wayland-xdg-shell.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
-index 3cf6b5716..9e300df6b 100644
---- a/src/wayland/meta-wayland-xdg-shell.c
-+++ b/src/wayland/meta-wayland-xdg-shell.c
-@@ -624,6 +624,13 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole  *surface_role,
-   MetaRectangle old_geometry;
-   gboolean geometry_changed;
- 
-+  window = surface->window;
-+  if (!window)
-+    {
-+      meta_wayland_surface_cache_pending_frame_callbacks (surface, pending);
-+      return;
-+    }
-+
-   if (!surface->buffer_ref.buffer && xdg_surface_priv->first_buffer_attached)
-     {
-       MetaWaylandActorSurface *actor_surface =
-@@ -635,7 +642,6 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole  *surface_role,
-       return;
-     }
- 
--  window = surface->window;
-   old_geometry = xdg_surface_priv->geometry;
- 
-   surface_role_class =
--- 
-2.19.0
-
diff --git a/SOURCES/0005-backends-native-emit-gl-video-memory-purged-when-bec.patch b/SOURCES/0005-backends-native-emit-gl-video-memory-purged-when-bec.patch
index 3ab2dce..0567862 100644
--- a/SOURCES/0005-backends-native-emit-gl-video-memory-purged-when-bec.patch
+++ b/SOURCES/0005-backends-native-emit-gl-video-memory-purged-when-bec.patch
@@ -1,4 +1,4 @@
-From 0af0c75dc60166d2755537b8499e9e4a1501e4a8 Mon Sep 17 00:00:00 2001
+From 122d7726e450712b8b2fc85db41e3c8ab7b6ad56 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Tue, 15 Jan 2019 10:29:55 -0500
 Subject: [PATCH 5/9] backends/native: emit gl-video-memory-purged when
@@ -16,37 +16,10 @@ by logind (which happens on VT switch and on resume).
  1 file changed, 7 insertions(+)
 
 diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
-index 042d96ec6..f87c5a066 100644
+index c473681cb..f593197e7 100644
 --- a/src/backends/native/meta-backend-native.c
 +++ b/src/backends/native/meta-backend-native.c
-@@ -618,44 +618,51 @@ meta_activate_session (void)
-       g_warning ("Could not activate session: %s\n", error->message);
-       g_error_free (error);
-       return FALSE;
-     }
- 
-   return TRUE;
- }
- 
- void
- meta_backend_native_pause (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
- 
-   clutter_evdev_release_devices ();
-   clutter_egl_freeze_master_clock ();
- 
-   meta_monitor_manager_kms_pause (monitor_manager_kms);
- }
- 
- void meta_backend_native_resume (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
+@@ -653,8 +653,15 @@ void meta_backend_native_resume (MetaBackendNative *native)
      meta_backend_get_monitor_manager (backend);
    MetaMonitorManagerKms *monitor_manager_kms =
      META_MONITOR_MANAGER_KMS (monitor_manager);
@@ -54,7 +27,6 @@ index 042d96ec6..f87c5a066 100644
 +  ClutterBackend *clutter_backend = clutter_get_default_backend ();
 +  CoglContext *cogl_context =
 +    clutter_backend_get_cogl_context (clutter_backend);
-   ClutterActor *stage;
    MetaIdleMonitor *idle_monitor;
  
 +  if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_UNSTABLE_TEXTURES))
@@ -63,14 +35,6 @@ index 042d96ec6..f87c5a066 100644
    meta_monitor_manager_kms_resume (monitor_manager_kms);
  
    clutter_evdev_reclaim_devices ();
-   clutter_egl_thaw_master_clock ();
- 
-   stage = meta_backend_get_stage (backend);
-   clutter_actor_queue_redraw (stage);
- 
-   idle_monitor = meta_backend_get_idle_monitor (backend, 0);
-   meta_idle_monitor_reset_idletime (idle_monitor);
- }
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0005-screen-cast-Add-screen-cast-window-interface.patch b/SOURCES/0005-screen-cast-Add-screen-cast-window-interface.patch
deleted file mode 100644
index 442e9e6..0000000
--- a/SOURCES/0005-screen-cast-Add-screen-cast-window-interface.patch
+++ /dev/null
@@ -1,204 +0,0 @@
-From be6ba9eb1e28cc339e691f02c7c1cb6ae627d87a Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Wed, 5 Dec 2018 08:48:41 +0100
-Subject: [PATCH 05/12] screen-cast: Add screen-cast-window interface
-
-Typically, to stream the content of a window, we need a way to copy the
-content of its window-actor into a buffer, transform relative input
-coordinates to relative position within the window-actor and a mean to
-get the window bounds within the buffer.
-
-For this purpose, add a new GType interface `MetaScreenCastWindow` with
-the methods needed for screen-cast window mode:
-
- * meta_screen_cast_window_get_buffer_bounds()
- * meta_screen_cast_window_get_frame_bounds()
- * meta_screen_cast_window_transform_relative_position()
- * meta_screen_cast_window_capture_into()
-
-This interface is meant to be implemented by `MetaWindowActor` which has
-access to all the necessary bits to implement them.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit 20c9ca25c01a9160d4a2ddfad29b48eb86a9142a)
----
- src/Makefile.am                        |  2 +
- src/backends/meta-screen-cast-window.c | 71 ++++++++++++++++++++++++
- src/backends/meta-screen-cast-window.h | 74 ++++++++++++++++++++++++++
- 3 files changed, 147 insertions(+)
- create mode 100644 src/backends/meta-screen-cast-window.c
- create mode 100644 src/backends/meta-screen-cast-window.h
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index bd879f2..93586a2 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -159,6 +159,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\
- 	backends/meta-output.h			\
- 	backends/meta-pointer-constraint.c	\
- 	backends/meta-pointer-constraint.h	\
-+	backends/meta-screen-cast-window.c	\
-+	backends/meta-screen-cast-window.h	\
- 	backends/meta-settings.c		\
- 	backends/meta-settings-private.h	\
- 	backends/meta-stage-private.h		\
-diff --git a/src/backends/meta-screen-cast-window.c b/src/backends/meta-screen-cast-window.c
-new file mode 100644
-index 0000000..21629a0
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window.c
-@@ -0,0 +1,71 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/meta-screen-cast-window.h"
-+
-+G_DEFINE_INTERFACE (MetaScreenCastWindow, meta_screen_cast_window, G_TYPE_OBJECT)
-+
-+static void
-+meta_screen_cast_window_default_init (MetaScreenCastWindowInterface *iface)
-+{
-+}
-+
-+void
-+meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                           MetaRectangle        *bounds)
-+{
-+  META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->get_buffer_bounds (screen_cast_window,
-+                                                                             bounds);
-+}
-+
-+void
-+meta_screen_cast_window_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                          MetaRectangle        *bounds)
-+{
-+  META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->get_frame_bounds (screen_cast_window,
-+                                                                            bounds);
-+}
-+
-+void
-+meta_screen_cast_window_transform_relative_position (MetaScreenCastWindow *screen_cast_window,
-+                                                     double                x,
-+                                                     double                y,
-+                                                     double               *x_out,
-+                                                     double               *y_out)
-+{
-+  META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->transform_relative_position (screen_cast_window,
-+                                                                                       x,
-+                                                                                       y,
-+                                                                                       x_out,
-+                                                                                       y_out);
-+}
-+
-+
-+void
-+meta_screen_cast_window_capture_into (MetaScreenCastWindow *screen_cast_window,
-+                                      MetaRectangle        *bounds,
-+                                      uint8_t              *data)
-+{
-+  META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->capture_into (screen_cast_window,
-+                                                                        bounds,
-+                                                                        data);
-+}
-diff --git a/src/backends/meta-screen-cast-window.h b/src/backends/meta-screen-cast-window.h
-new file mode 100644
-index 0000000..e023d3e
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window.h
-@@ -0,0 +1,74 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef META_SCREEN_CAST_WINDOW_H
-+#define META_SCREEN_CAST_WINDOW_H
-+
-+#include <stdint.h>
-+#include <glib-object.h>
-+
-+#include "meta/boxes.h"
-+
-+G_BEGIN_DECLS
-+
-+#define META_TYPE_SCREEN_CAST_WINDOW (meta_screen_cast_window_get_type ())
-+G_DECLARE_INTERFACE (MetaScreenCastWindow, meta_screen_cast_window,
-+                     META, SCREEN_CAST_WINDOW, GObject)
-+
-+struct _MetaScreenCastWindowInterface
-+{
-+  GTypeInterface parent_iface;
-+
-+  void (*get_buffer_bounds) (MetaScreenCastWindow *screen_cast_window,
-+                             MetaRectangle        *bounds);
-+
-+  void (*get_frame_bounds) (MetaScreenCastWindow *screen_cast_window,
-+                            MetaRectangle        *bounds);
-+
-+  void (*transform_relative_position) (MetaScreenCastWindow *screen_cast_window,
-+                                       double                x,
-+                                       double                y,
-+                                       double               *x_out,
-+                                       double               *y_out);
-+
-+  void (*capture_into) (MetaScreenCastWindow *screen_cast_window,
-+                        MetaRectangle        *bounds,
-+                        uint8_t              *data);
-+};
-+
-+void meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                                MetaRectangle        *bounds);
-+
-+void meta_screen_cast_window_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                               MetaRectangle        *bounds);
-+
-+void meta_screen_cast_window_transform_relative_position (MetaScreenCastWindow *screen_cast_window,
-+                                                          double                x,
-+                                                          double                y,
-+                                                          double               *x_out,
-+                                                          double               *y_out);
-+
-+void meta_screen_cast_window_capture_into (MetaScreenCastWindow *screen_cast_window,
-+                                           MetaRectangle        *bounds,
-+                                           uint8_t              *data);
-+
-+G_END_DECLS
-+
-+#endif /* META_SCREEN_CAST_WINDOW_H */
--- 
-2.19.2
-
diff --git a/SOURCES/0005-wayland-xdg-shell-Handle-requests-after-toplevel-was.patch b/SOURCES/0005-wayland-xdg-shell-Handle-requests-after-toplevel-was.patch
deleted file mode 100644
index eb02b27..0000000
--- a/SOURCES/0005-wayland-xdg-shell-Handle-requests-after-toplevel-was.patch
+++ /dev/null
@@ -1,234 +0,0 @@
-From 80f942773a29889094dbf83aece8d210bd22c73e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 25 Jul 2018 11:56:14 +0200
-Subject: [PATCH 5/8] wayland/xdg-shell: Handle requests after toplevel was
- unmanaged
-
-A window can be unmanaged without asking the client to do it, for
-example as a side effect of a parent window being unmanaged, if the
-child window was a attached dialog.
-
-This means that the client might still make requests post updates to it
-after that it was unmapped. Handle this gracefully by NULL-checking the
-surface's MetaWindow pointer. We're not loosing any state due to this,
-as if the client wants to map the same surface again, it needs to either
-reassign it the toplevel role, or reset the xdg-toplevel, both resulting
-in all state being lost anyway.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit 5fd0f62a62a194ffd8e64d177f389912a582f8e1)
----
- src/wayland/meta-wayland-xdg-shell.c | 81 +++++++++++++++++++++++-----
- 1 file changed, 68 insertions(+), 13 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
-index 9e300df6b..bfd8163f7 100644
---- a/src/wayland/meta-wayland-xdg-shell.c
-+++ b/src/wayland/meta-wayland-xdg-shell.c
-@@ -191,6 +191,11 @@ xdg_toplevel_set_parent (struct wl_client   *client,
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-   MetaWindow *transient_for = NULL;
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (parent_resource)
-     {
-@@ -200,7 +205,7 @@ xdg_toplevel_set_parent (struct wl_client   *client,
-       transient_for = parent_surface->window;
-     }
- 
--  meta_window_set_transient_for (surface->window, transient_for);
-+  meta_window_set_transient_for (window, transient_for);
- }
- 
- static void
-@@ -209,11 +214,16 @@ xdg_toplevel_set_title (struct wl_client   *client,
-                         const char         *title)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (!g_utf8_validate (title, -1, NULL))
-     title = "";
- 
--  meta_window_set_title (surface->window, title);
-+  meta_window_set_title (window, title);
- }
- 
- static void
-@@ -222,11 +232,16 @@ xdg_toplevel_set_app_id (struct wl_client   *client,
-                          const char         *app_id)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (!g_utf8_validate (app_id, -1, NULL))
-     app_id = "";
- 
--  meta_window_set_wm_class (surface->window, app_id, app_id);
-+  meta_window_set_wm_class (window, app_id, app_id);
- }
- 
- static void
-@@ -239,15 +254,20 @@ xdg_toplevel_show_window_menu (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   int monitor_scale;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
-     return;
- 
--  monitor_scale = surface->window->monitor->scale;
--  meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
--                         surface->window->buffer_rect.x + (x * monitor_scale),
--                         surface->window->buffer_rect.y + (y * monitor_scale));
-+  monitor_scale = window->monitor->scale;
-+  meta_window_show_menu (window, META_WINDOW_MENU_WM,
-+                         window->buffer_rect.x + (x * monitor_scale),
-+                         window->buffer_rect.y + (y * monitor_scale));
- }
- 
- static void
-@@ -258,8 +278,13 @@ xdg_toplevel_move (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   float x, y;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y))
-     return;
- 
-@@ -298,9 +323,14 @@ xdg_toplevel_resize (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   gfloat x, y;
-   MetaGrabOp grab_op;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y))
-     return;
- 
-@@ -357,7 +387,11 @@ xdg_toplevel_set_maximized (struct wl_client   *client,
-                             struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
--  MetaWindow *window = surface->window;
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   meta_window_force_placement (window, TRUE);
-   meta_window_maximize (window, META_MAXIMIZE_BOTH);
-@@ -368,8 +402,13 @@ xdg_toplevel_unset_maximized (struct wl_client   *client,
-                               struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
- 
--  meta_window_unmaximize (surface->window, META_MAXIMIZE_BOTH);
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-+  meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
- }
- 
- static void
-@@ -378,6 +417,11 @@ xdg_toplevel_set_fullscreen (struct wl_client   *client,
-                              struct wl_resource *output_resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (output_resource)
-     {
-@@ -385,12 +429,12 @@ xdg_toplevel_set_fullscreen (struct wl_client   *client,
- 
-       if (output)
-         {
--          meta_window_move_to_monitor (surface->window,
-+          meta_window_move_to_monitor (window,
-                                        output->logical_monitor->number);
-         }
-     }
- 
--  meta_window_make_fullscreen (surface->window);
-+  meta_window_make_fullscreen (window);
- }
- 
- static void
-@@ -398,8 +442,13 @@ xdg_toplevel_unset_fullscreen (struct wl_client   *client,
-                                struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
--  meta_window_unmake_fullscreen (surface->window);
-+  meta_window_unmake_fullscreen (window);
- }
- 
- static void
-@@ -407,8 +456,13 @@ xdg_toplevel_set_minimized (struct wl_client   *client,
-                             struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
- 
--  meta_window_minimize (surface->window);
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-+  meta_window_minimize (window);
- }
- 
- static const struct xdg_toplevel_interface meta_wayland_xdg_toplevel_interface = {
-@@ -639,6 +693,7 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole  *surface_role,
-       meta_wayland_xdg_surface_reset (xdg_surface);
-       meta_wayland_actor_surface_queue_frame_callbacks (actor_surface,
-                                                         pending);
-+
-       return;
-     }
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0006-backends-native-update-glyph-cache-on-resume.patch b/SOURCES/0006-backends-native-update-glyph-cache-on-resume.patch
index 4c93e85..3f4193b 100644
--- a/SOURCES/0006-backends-native-update-glyph-cache-on-resume.patch
+++ b/SOURCES/0006-backends-native-update-glyph-cache-on-resume.patch
@@ -1,4 +1,4 @@
-From 5134dd47c161a47d45e7742cbfba8a0e8cb67be5 Mon Sep 17 00:00:00 2001
+From 762ffddfa6157fe50bfa394ecbe4ba707d15f368 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Tue, 15 Jan 2019 10:29:55 -0500
 Subject: [PATCH 6/9] backends/native: update glyph cache on resume
@@ -15,37 +15,10 @@ the logind session becomes active (on VT switch and resume).
  1 file changed, 4 insertions(+), 1 deletion(-)
 
 diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
-index f87c5a066..0730a4acb 100644
+index f593197e7..db9b63ac4 100644
 --- a/src/backends/native/meta-backend-native.c
 +++ b/src/backends/native/meta-backend-native.c
-@@ -626,43 +626,46 @@ meta_activate_session (void)
- void
- meta_backend_native_pause (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
- 
-   clutter_evdev_release_devices ();
-   clutter_egl_freeze_master_clock ();
- 
-   meta_monitor_manager_kms_pause (monitor_manager_kms);
- }
- 
- void meta_backend_native_resume (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
-   MetaDisplay *display = meta_get_display ();
-   ClutterBackend *clutter_backend = clutter_get_default_backend ();
-   CoglContext *cogl_context =
-     clutter_backend_get_cogl_context (clutter_backend);
-   ClutterActor *stage;
+@@ -660,7 +660,10 @@ void meta_backend_native_resume (MetaBackendNative *native)
    MetaIdleMonitor *idle_monitor;
  
    if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_UNSTABLE_TEXTURES))
@@ -57,15 +30,6 @@ index f87c5a066..0730a4acb 100644
  
    meta_monitor_manager_kms_resume (monitor_manager_kms);
  
-   clutter_evdev_reclaim_devices ();
-   clutter_egl_thaw_master_clock ();
- 
-   stage = meta_backend_get_stage (backend);
-   clutter_actor_queue_redraw (stage);
- 
-   idle_monitor = meta_backend_get_idle_monitor (backend, 0);
-   meta_idle_monitor_reset_idletime (idle_monitor);
- }
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0006-wayland-legacy-xdg-shell-Cache-frame-callbacks-if-to.patch b/SOURCES/0006-wayland-legacy-xdg-shell-Cache-frame-callbacks-if-to.patch
deleted file mode 100644
index 3d42e7f..0000000
--- a/SOURCES/0006-wayland-legacy-xdg-shell-Cache-frame-callbacks-if-to.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 082efaca968aeefd4528ac6c8e28bf15e2f86ee5 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Mon, 27 Aug 2018 12:36:51 +0200
-Subject: [PATCH 6/8] wayland/legacy-xdg-shell: Cache frame callbacks if
- toplevel is unmanaged
-
-A toplevel window can be unmanaged without the client knowing it (e.g. a
-modal dialog being unmapped together with its parent. When this has
-happened, take frame callbacks queued on a commit and cache them on the
-generic surface queue. If the toplevel is to be remapped because the
-surface was reassigned the toplevel role, the cached frame callbacks
-will be queued on the surface actor and dispatched accordingly.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit a740f50cd7d05582a251c23a7025999e55e4aba1)
----
- src/wayland/meta-wayland-legacy-xdg-shell.c | 9 ++++++++-
- 1 file changed, 8 insertions(+), 1 deletion(-)
-
-diff --git a/src/wayland/meta-wayland-legacy-xdg-shell.c b/src/wayland/meta-wayland-legacy-xdg-shell.c
-index e871be972..861270193 100644
---- a/src/wayland/meta-wayland-legacy-xdg-shell.c
-+++ b/src/wayland/meta-wayland-legacy-xdg-shell.c
-@@ -598,11 +598,18 @@ meta_wayland_zxdg_toplevel_v6_commit (MetaWaylandSurfaceRole  *surface_role,
-   MetaWaylandSurfaceRoleClass *surface_role_class;
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (surface_role);
--  MetaWindow *window = surface->window;
-+  MetaWindow *window;
-   MetaRectangle window_geometry;
-   MetaRectangle old_geometry;
-   gboolean geometry_changed;
- 
-+  window = surface->window;
-+  if (!window)
-+    {
-+      meta_wayland_surface_cache_pending_frame_callbacks (surface, pending);
-+      return;
-+    }
-+
-   old_geometry = xdg_surface_priv->geometry;
- 
-   surface_role_class =
--- 
-2.19.0
-
diff --git a/SOURCES/0006-window-actor-Implement-MetaScreenCastWindow-interfac.patch b/SOURCES/0006-window-actor-Implement-MetaScreenCastWindow-interfac.patch
deleted file mode 100644
index 456aa3f..0000000
--- a/SOURCES/0006-window-actor-Implement-MetaScreenCastWindow-interfac.patch
+++ /dev/null
@@ -1,178 +0,0 @@
-From 5f2c181eda1b721b807e41130232714bacb823a9 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 4 Dec 2018 16:29:47 +0100
-Subject: [PATCH 06/12] window-actor: Implement MetaScreenCastWindow interface
-
-Implements the `MetaScreenCastWindow` interface for screen-cast
-`RecordWindow` mode.
-
-`meta_window_actor_capture_into()` implementation is still pretty crude
-and doesn't take into account subsurfaces and O-R windows so menus,
-popups and other tooltips won't show in the capture.
-
-This is left as a future improvement for now.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit 931934511c8e885d5f607ba90187286a0a7ec3a3)
----
- src/compositor/meta-window-actor.c | 132 ++++++++++++++++++++++++++++-
- 1 file changed, 131 insertions(+), 1 deletion(-)
-
-diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
-index 5078624..396fef1 100644
---- a/src/compositor/meta-window-actor.c
-+++ b/src/compositor/meta-window-actor.c
-@@ -24,6 +24,7 @@
- #include <meta/meta-shadow-factory.h>
- 
- #include "backends/meta-backend-private.h"
-+#include "backends/meta-screen-cast-window.h"
- #include "clutter/clutter-mutter.h"
- #include "compositor-private.h"
- #include "meta-shaped-texture-private.h"
-@@ -188,8 +189,11 @@ static void do_send_frame_timings (MetaWindowActor  *self,
- 
- static void cullable_iface_init (MetaCullableInterface *iface);
- 
-+static void screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface);
-+
- G_DEFINE_TYPE_WITH_CODE (MetaWindowActor, meta_window_actor, CLUTTER_TYPE_ACTOR,
--                         G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
-+                         G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init)
-+                         G_IMPLEMENT_INTERFACE (META_TYPE_SCREEN_CAST_WINDOW, screen_cast_window_iface_init));
- 
- static void
- frame_data_free (FrameData *frame)
-@@ -2181,3 +2185,129 @@ meta_window_actor_from_window (MetaWindow *window)
- {
-   return META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
- }
-+
-+static void
-+meta_window_actor_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                     MetaRectangle        *bounds)
-+{
-+  MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
-+  ClutterActor *clutter_actor;
-+
-+  clutter_actor = CLUTTER_ACTOR (meta_window_actor_get_texture (window_actor));
-+  bounds->x = 0;
-+  bounds->y = 0;
-+  bounds->width = (int) clutter_actor_get_width (clutter_actor);
-+  bounds->height = (int) clutter_actor_get_height (clutter_actor);
-+}
-+
-+static void
-+meta_window_actor_get_frame_bounds (MetaScreenCastWindow *screen_cast_window,
-+                                    MetaRectangle        *bounds)
-+{
-+  MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
-+  MetaWindow *window;
-+  MetaShapedTexture *stex;
-+  MetaRectangle buffer_rect;
-+  MetaRectangle frame_rect;
-+  double scale_x, scale_y;
-+
-+  stex = meta_surface_actor_get_texture (window_actor->priv->surface);
-+  clutter_actor_get_scale (CLUTTER_ACTOR (stex), &scale_x, &scale_y);
-+
-+  window = window_actor->priv->window;
-+  meta_window_get_buffer_rect (window, &buffer_rect);
-+  meta_window_get_frame_rect (window, &frame_rect);
-+
-+  bounds->x = (int) floor ((frame_rect.x - buffer_rect.x) / scale_x);
-+  bounds->y = (int) floor ((frame_rect.y - buffer_rect.y) / scale_y);
-+  bounds->width = (int) ceil (frame_rect.width / scale_x);
-+  bounds->height = (int) ceil (frame_rect.height / scale_y);
-+}
-+
-+static void
-+meta_window_actor_transform_relative_position (MetaScreenCastWindow *screen_cast_window,
-+                                               double                x,
-+                                               double                y,
-+                                               double               *x_out,
-+                                               double               *y_out)
-+
-+{
-+  MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
-+  MetaShapedTexture *stex;
-+  MetaRectangle bounds;
-+  ClutterVertex v1 = { 0.f, }, v2 = { 0.f, };
-+
-+  meta_window_actor_get_frame_bounds (screen_cast_window, &bounds);
-+
-+  v1.x = CLAMP ((float) x,
-+                bounds.x,
-+                bounds.x + bounds.width);
-+  v1.y = CLAMP ((float) y,
-+                bounds.y,
-+                bounds.y + bounds.height);
-+
-+  stex = meta_surface_actor_get_texture (window_actor->priv->surface);
-+  clutter_actor_apply_transform_to_point (CLUTTER_ACTOR (stex), &v1, &v2);
-+
-+  *x_out = (double) v2.x;
-+  *y_out = (double) v2.y;
-+}
-+
-+static void
-+meta_window_actor_capture_into (MetaScreenCastWindow *screen_cast_window,
-+                                MetaRectangle        *bounds,
-+                                uint8_t              *data)
-+{
-+  MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
-+  cairo_surface_t *image;
-+  MetaRectangle clip_rect;
-+  uint8_t *cr_data;
-+  int cr_stride;
-+  int bpp = 4;
-+
-+  if (meta_window_actor_is_destroyed (window_actor))
-+    return;
-+
-+  clip_rect = *bounds;
-+  image = meta_surface_actor_get_image (window_actor->priv->surface, &clip_rect);
-+  cr_data = cairo_image_surface_get_data (image);
-+  cr_stride = cairo_image_surface_get_stride (image);
-+
-+  if (clip_rect.width < bounds->width || clip_rect.height < bounds->height)
-+    {
-+      uint8_t *src, *dst;
-+      src = cr_data;
-+      dst = data;
-+
-+      for (int i = 0; i < clip_rect.height; i++)
-+        {
-+          memcpy (dst, src, cr_stride);
-+          if (clip_rect.width < bounds->width)
-+            memset (dst + cr_stride, 0, (bounds->width * bpp) - cr_stride);
-+
-+          src += cr_stride;
-+          dst += bounds->width * bpp;
-+        }
-+
-+      for (int i = clip_rect.height; i < bounds->height; i++)
-+        {
-+          memset (dst, 0, bounds->width * bpp);
-+          dst += bounds->width * bpp;
-+        }
-+    }
-+  else
-+    {
-+      memcpy (data, cr_data, clip_rect.height * cr_stride);
-+    }
-+
-+  cairo_surface_destroy (image);
-+}
-+
-+static void
-+screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
-+{
-+  iface->get_buffer_bounds = meta_window_actor_get_buffer_bounds;
-+  iface->get_frame_bounds = meta_window_actor_get_frame_bounds;
-+  iface->transform_relative_position = meta_window_actor_transform_relative_position;
-+  iface->capture_into = meta_window_actor_capture_into;
-+}
--- 
-2.19.2
-
diff --git a/SOURCES/0007-backends-native-update-cursor-on-resume.patch b/SOURCES/0007-backends-native-update-cursor-on-resume.patch
index 3f5b387..721996f 100644
--- a/SOURCES/0007-backends-native-update-cursor-on-resume.patch
+++ b/SOURCES/0007-backends-native-update-cursor-on-resume.patch
@@ -1,4 +1,4 @@
-From b5ea81b0356884dca6d362d61df4f68e9e84e0b3 Mon Sep 17 00:00:00 2001
+From 59ba24c09e5d2a3210ca3d259789f7ba5ae6266a Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Tue, 15 Jan 2019 10:29:55 -0500
 Subject: [PATCH 7/9] backends/native: update cursor on resume
@@ -10,167 +10,29 @@ the cursor gets corrupted on suspend.
 This commit forces the cursor to redraw itself when the
 logind session becomes active (on VT switch and resume).
 ---
- src/backends/native/meta-backend-native.c | 1 +
- src/core/screen-private.h                 | 2 --
- src/meta/screen.h                         | 3 +++
- 3 files changed, 4 insertions(+), 2 deletions(-)
+ src/backends/native/meta-backend-native.c | 2 ++
+ 1 file changed, 2 insertions(+)
 
 diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
-index 0730a4acb..fd95dfc11 100644
+index db9b63ac4..479e9326b 100644
 --- a/src/backends/native/meta-backend-native.c
 +++ b/src/backends/native/meta-backend-native.c
-@@ -628,44 +628,45 @@ meta_backend_native_pause (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
- 
-   clutter_evdev_release_devices ();
-   clutter_egl_freeze_master_clock ();
- 
-   meta_monitor_manager_kms_pause (monitor_manager_kms);
- }
- 
- void meta_backend_native_resume (MetaBackendNative *native)
- {
-   MetaBackend *backend = META_BACKEND (native);
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
-   MetaDisplay *display = meta_get_display ();
-   ClutterBackend *clutter_backend = clutter_get_default_backend ();
-   CoglContext *cogl_context =
-     clutter_backend_get_cogl_context (clutter_backend);
-   ClutterActor *stage;
-   MetaIdleMonitor *idle_monitor;
- 
+@@ -54,6 +54,7 @@
+ #include "backends/native/meta-renderer-native.h"
+ #include "backends/native/meta-stage-native.h"
+ #include "clutter/evdev/clutter-evdev.h"
++#include "core/display-private.h"
+ #include "core/meta-border.h"
+ #include "meta/main.h"
+ 
+@@ -662,6 +663,7 @@ void meta_backend_native_resume (MetaBackendNative *native)
    if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_UNSTABLE_TEXTURES))
      {
        clutter_clear_glyph_cache ();
-+      meta_screen_update_cursor (display->screen);
++      meta_display_update_cursor (display);
        g_signal_emit_by_name (display, "gl-video-memory-purged");
      }
  
-   meta_monitor_manager_kms_resume (monitor_manager_kms);
- 
-   clutter_evdev_reclaim_devices ();
-   clutter_egl_thaw_master_clock ();
- 
-   stage = meta_backend_get_stage (backend);
-   clutter_actor_queue_redraw (stage);
- 
-   idle_monitor = meta_backend_get_idle_monitor (backend, 0);
-   meta_idle_monitor_reset_idletime (idle_monitor);
- }
-diff --git a/src/core/screen-private.h b/src/core/screen-private.h
-index ff796f01a..37f2a01a1 100644
---- a/src/core/screen-private.h
-+++ b/src/core/screen-private.h
-@@ -95,62 +95,60 @@ struct _MetaScreen
-   int closing;
- 
-   /* Instead of unmapping withdrawn windows we can leave them mapped
-    * and restack them below a guard window. When using a compositor
-    * this allows us to provide live previews of unmapped windows */
-   Window guard_window;
- 
-   Window composite_overlay_window;
- };
- 
- struct _MetaScreenClass
- {
-   GObjectClass parent_class;
- 
-   void (*restacked)         (MetaScreen *);
-   void (*workareas_changed) (MetaScreen *);
-   void (*monitors_changed)  (MetaScreen *);
- };
- 
- MetaScreen*   meta_screen_new                 (MetaDisplay                *display,
-                                                guint32                     timestamp);
- void          meta_screen_free                (MetaScreen                 *screen,
-                                                guint32                     timestamp);
- void          meta_screen_init_workspaces     (MetaScreen                 *screen);
- void          meta_screen_manage_all_windows  (MetaScreen                 *screen);
- void          meta_screen_foreach_window      (MetaScreen                 *screen,
-                                                MetaListWindowsFlags        flags,
-                                                MetaScreenWindowFunc        func,
-                                                gpointer                    data);
- 
--void          meta_screen_update_cursor       (MetaScreen                 *screen);
--
- void          meta_screen_update_tile_preview          (MetaScreen    *screen,
-                                                         gboolean       delay);
- void          meta_screen_hide_tile_preview            (MetaScreen    *screen);
- 
- MetaWindow*   meta_screen_get_mouse_window     (MetaScreen                 *screen,
-                                                 MetaWindow                 *not_this_one);
- 
- void          meta_screen_update_workspace_layout (MetaScreen             *screen);
- void          meta_screen_update_workspace_names  (MetaScreen             *screen);
- void          meta_screen_queue_workarea_recalc   (MetaScreen             *screen);
- void          meta_screen_queue_check_fullscreen  (MetaScreen             *screen);
- 
- 
- Window meta_create_offscreen_window (Display *xdisplay,
-                                      Window   parent,
-                                      long     valuemask);
- 
- typedef struct MetaWorkspaceLayout MetaWorkspaceLayout;
- 
- struct MetaWorkspaceLayout
- {
-   int rows;
-   int cols;
-   int *grid;
-   int grid_area;
-   int current_row;
-   int current_col;
- };
- 
- void meta_screen_calc_workspace_layout (MetaScreen          *screen,
-diff --git a/src/meta/screen.h b/src/meta/screen.h
-index 13c92516e..36c397418 100644
---- a/src/meta/screen.h
-+++ b/src/meta/screen.h
-@@ -98,31 +98,34 @@ int meta_screen_get_monitor_neighbor_index (MetaScreen *screen,
-                                             int         which_monitor,
-                                             MetaScreenDirection dir);
- 
- void meta_screen_focus_default_window (MetaScreen *screen,
-                                        guint32     timestamp);
- 
- /**
-  * MetaScreenCorner:
-  * @META_SCREEN_TOPLEFT: top-left corner
-  * @META_SCREEN_TOPRIGHT: top-right corner
-  * @META_SCREEN_BOTTOMLEFT: bottom-left corner
-  * @META_SCREEN_BOTTOMRIGHT: bottom-right corner
-  */
- typedef enum
- {
-   META_SCREEN_TOPLEFT,
-   META_SCREEN_TOPRIGHT,
-   META_SCREEN_BOTTOMLEFT,
-   META_SCREEN_BOTTOMRIGHT
- } MetaScreenCorner;
- 
- void meta_screen_override_workspace_layout (MetaScreen      *screen,
-                                             MetaScreenCorner starting_corner,
-                                             gboolean         vertical_layout,
-                                             int              n_rows,
-                                             int              n_columns);
- 
- void          meta_screen_set_cursor          (MetaScreen                 *screen,
-                                                MetaCursor                  cursor);
- 
-+void          meta_screen_update_cursor       (MetaScreen                 *screen);
-+
-+
- #endif
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0007-screen-cast-session-Add-screen-cast-window-mode.patch b/SOURCES/0007-screen-cast-session-Add-screen-cast-window-mode.patch
deleted file mode 100644
index cc63492..0000000
--- a/SOURCES/0007-screen-cast-session-Add-screen-cast-window-mode.patch
+++ /dev/null
@@ -1,659 +0,0 @@
-From fab59c0866bd13b944f0e9a3a251ba1a70ca31d4 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Tue, 9 Oct 2018 15:35:14 +0200
-Subject: [PATCH 07/12] screen-cast-session: Add screen-cast window mode
-
-Window mode will cast the content of a single window using the
-`MetaScreenCastWindow` interface.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit dbe7279c7fe6fb793292cd6740c900e6f0c21975)
----
- src/Makefile.am                               |   4 +
- .../meta-screen-cast-window-stream-src.c      | 245 ++++++++++++++++
- .../meta-screen-cast-window-stream-src.h      |  37 +++
- src/backends/meta-screen-cast-window-stream.c | 270 ++++++++++++++++++
- src/backends/meta-screen-cast-window-stream.h |  43 +++
- 5 files changed, 599 insertions(+)
- create mode 100644 src/backends/meta-screen-cast-window-stream-src.c
- create mode 100644 src/backends/meta-screen-cast-window-stream-src.h
- create mode 100644 src/backends/meta-screen-cast-window-stream.c
- create mode 100644 src/backends/meta-screen-cast-window-stream.h
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 93586a2..0606efa 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -372,6 +372,10 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES +=	\
- 	backends/meta-screen-cast-monitor-stream.h	\
- 	backends/meta-screen-cast-monitor-stream-src.c	\
- 	backends/meta-screen-cast-monitor-stream-src.h	\
-+	backends/meta-screen-cast-window-stream-src.c	\
-+	backends/meta-screen-cast-window-stream-src.h	\
-+	backends/meta-screen-cast-window-stream.c	\
-+	backends/meta-screen-cast-window-stream.h	\
- 	backends/meta-screen-cast-session.c	\
- 	backends/meta-screen-cast-session.h	\
- 	backends/meta-screen-cast-stream.c	\
-diff --git a/src/backends/meta-screen-cast-window-stream-src.c b/src/backends/meta-screen-cast-window-stream-src.c
-new file mode 100644
-index 0000000..c3f9cf5
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window-stream-src.c
-@@ -0,0 +1,245 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/meta-screen-cast-window-stream-src.h"
-+
-+#include "backends/meta-backend-private.h"
-+#include "backends/meta-screen-cast-window.h"
-+#include "backends/meta-screen-cast-window-stream.h"
-+#include "compositor/meta-window-actor-private.h"
-+
-+struct _MetaScreenCastWindowStreamSrc
-+{
-+  MetaScreenCastStreamSrc parent;
-+
-+  MetaWindowActor *window_actor;
-+
-+  unsigned long actor_painted_handler_id;
-+  unsigned long actor_destroyed_handler_id;
-+};
-+
-+G_DEFINE_TYPE (MetaScreenCastWindowStreamSrc,
-+               meta_screen_cast_window_stream_src,
-+               META_TYPE_SCREEN_CAST_STREAM_SRC)
-+
-+static MetaScreenCastWindowStream *
-+get_window_stream (MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  MetaScreenCastStreamSrc *src;
-+  MetaScreenCastStream *stream;
-+
-+  src = META_SCREEN_CAST_STREAM_SRC (window_src);
-+  stream = meta_screen_cast_stream_src_get_stream (src);
-+
-+  return META_SCREEN_CAST_WINDOW_STREAM (stream);
-+}
-+
-+static MetaWindow *
-+get_window (MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  MetaScreenCastWindowStream *window_stream;
-+
-+  window_stream = get_window_stream (window_src);
-+
-+  return meta_screen_cast_window_stream_get_window (window_stream);
-+}
-+
-+static int
-+get_stream_width (MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  MetaScreenCastWindowStream *window_stream;
-+
-+  window_stream = get_window_stream (window_src);
-+
-+  return meta_screen_cast_window_stream_get_width (window_stream);
-+}
-+
-+static int
-+get_stream_height (MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  MetaScreenCastWindowStream *window_stream;
-+
-+  window_stream = get_window_stream (window_src);
-+
-+  return meta_screen_cast_window_stream_get_height (window_stream);
-+}
-+
-+static gboolean
-+capture_into (MetaScreenCastWindowStreamSrc *window_src,
-+              uint8_t                       *data)
-+{
-+  MetaRectangle stream_rect;
-+  MetaScreenCastWindow *screen_cast_window;
-+
-+  stream_rect.x = 0;
-+  stream_rect.y = 0;
-+  stream_rect.width = get_stream_width (window_src);
-+  stream_rect.height = get_stream_height (window_src);
-+
-+  screen_cast_window = META_SCREEN_CAST_WINDOW (window_src->window_actor);
-+  meta_screen_cast_window_capture_into (screen_cast_window, &stream_rect, data);
-+
-+  return TRUE;
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_get_specs (MetaScreenCastStreamSrc *src,
-+                                              int                     *width,
-+                                              int                     *height,
-+                                              float                   *frame_rate)
-+{
-+  MetaScreenCastWindowStreamSrc *window_src =
-+    META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
-+
-+  *width = get_stream_width (window_src);
-+  *height = get_stream_height (window_src);
-+  *frame_rate = 60.0f;
-+}
-+
-+static gboolean
-+meta_screen_cast_window_stream_src_get_videocrop (MetaScreenCastStreamSrc *src,
-+                                                  MetaRectangle           *crop_rect)
-+{
-+  MetaScreenCastWindowStreamSrc *window_src =
-+    META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
-+  MetaScreenCastWindow *screen_cast_window;
-+  MetaRectangle stream_rect;
-+
-+  screen_cast_window = META_SCREEN_CAST_WINDOW (window_src->window_actor);
-+  meta_screen_cast_window_get_frame_bounds (screen_cast_window, crop_rect);
-+
-+  stream_rect.x = 0;
-+  stream_rect.y = 0;
-+  stream_rect.width = get_stream_width (window_src);
-+  stream_rect.height = get_stream_height (window_src);
-+
-+  meta_rectangle_intersect (crop_rect, &stream_rect, crop_rect);
-+
-+  return TRUE;
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_src)
-+
-+{
-+  if (!window_src->window_actor)
-+    return;
-+
-+  if (window_src->actor_painted_handler_id)
-+    g_signal_handler_disconnect (window_src->window_actor,
-+                                 window_src->actor_painted_handler_id);
-+  window_src->actor_painted_handler_id = 0;
-+
-+  if (window_src->actor_destroyed_handler_id)
-+    g_signal_handler_disconnect (window_src->window_actor,
-+                                 window_src->actor_destroyed_handler_id);
-+  window_src->actor_destroyed_handler_id = 0;
-+}
-+
-+static void
-+window_actor_painted (MetaWindowActor               *actor,
-+                      MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
-+
-+  meta_screen_cast_stream_src_maybe_record_frame (src);
-+}
-+
-+static void
-+window_actor_destroyed (MetaWindowActor               *actor,
-+                        MetaScreenCastWindowStreamSrc *window_src)
-+{
-+  meta_screen_cast_window_stream_src_stop (window_src);
-+  window_src->window_actor = NULL;
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_enable (MetaScreenCastStreamSrc *src)
-+{
-+  MetaScreenCastWindowStreamSrc *window_src =
-+    META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
-+  MetaWindowActor *window_actor;
-+
-+  window_actor = meta_window_actor_from_window (get_window (window_src));
-+  if (!window_actor)
-+    return;
-+
-+  window_src->window_actor = window_actor;
-+
-+  window_src->actor_painted_handler_id =
-+    g_signal_connect_after (window_src->window_actor,
-+                            "paint",
-+                            G_CALLBACK (window_actor_painted),
-+                            window_src);
-+
-+  window_src->actor_destroyed_handler_id =
-+    g_signal_connect (window_src->window_actor,
-+                      "destroy",
-+                      G_CALLBACK (window_actor_destroyed),
-+                      window_src);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_disable (MetaScreenCastStreamSrc *src)
-+{
-+  MetaScreenCastWindowStreamSrc *window_src =
-+    META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
-+
-+  meta_screen_cast_window_stream_src_stop (window_src);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-+                                                 uint8_t                 *data)
-+{
-+  MetaScreenCastWindowStreamSrc *window_src =
-+    META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
-+
-+  capture_into (window_src, data);
-+}
-+
-+MetaScreenCastWindowStreamSrc *
-+meta_screen_cast_window_stream_src_new (MetaScreenCastWindowStream  *window_stream,
-+                                        GError                     **error)
-+{
-+  return g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM_SRC, NULL, error,
-+                         "stream", window_stream,
-+                         NULL);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_init (MetaScreenCastWindowStreamSrc *window_src)
-+{
-+}
-+
-+static void
-+meta_screen_cast_window_stream_src_class_init (MetaScreenCastWindowStreamSrcClass *klass)
-+{
-+  MetaScreenCastStreamSrcClass *src_class =
-+    META_SCREEN_CAST_STREAM_SRC_CLASS (klass);
-+
-+  src_class->get_specs = meta_screen_cast_window_stream_src_get_specs;
-+  src_class->enable = meta_screen_cast_window_stream_src_enable;
-+  src_class->disable = meta_screen_cast_window_stream_src_disable;
-+  src_class->record_frame = meta_screen_cast_window_stream_src_record_frame;
-+  src_class->get_videocrop = meta_screen_cast_window_stream_src_get_videocrop;
-+}
-diff --git a/src/backends/meta-screen-cast-window-stream-src.h b/src/backends/meta-screen-cast-window-stream-src.h
-new file mode 100644
-index 0000000..37f7869
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window-stream-src.h
-@@ -0,0 +1,37 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef META_SCREEN_CAST_WINDOW_STREAM_SRC_H
-+#define META_SCREEN_CAST_WINDOW_STREAM_SRC_H
-+
-+#include "backends/meta-screen-cast-stream-src.h"
-+
-+typedef struct _MetaScreenCastWindowStream MetaScreenCastWindowStream;
-+
-+#define META_TYPE_SCREEN_CAST_WINDOW_STREAM_SRC (meta_screen_cast_window_stream_src_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaScreenCastWindowStreamSrc,
-+                      meta_screen_cast_window_stream_src,
-+                      META, SCREEN_CAST_WINDOW_STREAM_SRC,
-+                      MetaScreenCastStreamSrc)
-+
-+MetaScreenCastWindowStreamSrc * meta_screen_cast_window_stream_src_new (MetaScreenCastWindowStream  *window_stream,
-+                                                                        GError                     **error);
-+
-+#endif /* META_SCREEN_CAST_WINDOW_STREAM_SRC_H */
-diff --git a/src/backends/meta-screen-cast-window-stream.c b/src/backends/meta-screen-cast-window-stream.c
-new file mode 100644
-index 0000000..1200a39
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window-stream.c
-@@ -0,0 +1,270 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/meta-screen-cast-window-stream.h"
-+
-+#include "backends/meta-logical-monitor.h"
-+#include "backends/meta-monitor-manager-private.h"
-+#include "backends/meta-screen-cast-window.h"
-+#include "backends/meta-screen-cast-window-stream-src.h"
-+#include "compositor/meta-window-actor-private.h"
-+#include "core/window-private.h"
-+
-+enum
-+{
-+  PROP_0,
-+
-+  PROP_WINDOW,
-+};
-+
-+struct _MetaScreenCastWindowStream
-+{
-+  MetaScreenCastStream parent;
-+
-+  MetaWindow *window;
-+
-+  int stream_width;
-+  int stream_height;
-+
-+  unsigned long window_unmanaged_handler_id;
-+};
-+
-+G_DEFINE_TYPE (MetaScreenCastWindowStream,
-+               meta_screen_cast_window_stream,
-+               META_TYPE_SCREEN_CAST_STREAM)
-+
-+MetaWindow *
-+meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream)
-+{
-+  return window_stream->window;
-+}
-+
-+int
-+meta_screen_cast_window_stream_get_width (MetaScreenCastWindowStream *window_stream)
-+{
-+  return window_stream->stream_width;
-+}
-+
-+int
-+meta_screen_cast_window_stream_get_height (MetaScreenCastWindowStream *window_stream)
-+{
-+  return window_stream->stream_height;
-+}
-+
-+MetaScreenCastWindowStream *
-+meta_screen_cast_window_stream_new (GDBusConnection  *connection,
-+                                    MetaWindow       *window,
-+                                    GError          **error)
-+{
-+  MetaScreenCastWindowStream *window_stream;
-+  MetaLogicalMonitor *logical_monitor;
-+  int scale;
-+
-+  logical_monitor = meta_window_get_main_logical_monitor (window);
-+  if (!logical_monitor)
-+    {
-+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-+                   "Main logical monitor not found");
-+      return NULL;
-+    }
-+
-+  window_stream = g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
-+                                  NULL,
-+                                  error,
-+                                  "connection", connection,
-+                                  "window", window,
-+                                  NULL);
-+  if (!window_stream)
-+    return NULL;
-+
-+  window_stream->window = window;
-+  /* We cannot set the stream size to the exact size of the window, because
-+   * windows can be resized, whereas streams cannot.
-+   * So we set a size equals to the size of the logical monitor for the window.
-+   */
-+  scale = (int) ceil (meta_logical_monitor_get_scale (logical_monitor));
-+  window_stream->stream_width = logical_monitor->rect.width * scale;
-+  window_stream->stream_height = logical_monitor->rect.height * scale;
-+
-+  return window_stream;
-+}
-+
-+static MetaScreenCastStreamSrc *
-+meta_screen_cast_window_stream_create_src (MetaScreenCastStream  *stream,
-+                                           GError               **error)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (stream);
-+  MetaScreenCastWindowStreamSrc *window_stream_src;
-+
-+  window_stream_src = meta_screen_cast_window_stream_src_new (window_stream,
-+                                                              error);
-+  if (!window_stream_src)
-+    return NULL;
-+
-+  return META_SCREEN_CAST_STREAM_SRC (window_stream_src);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_set_parameters (MetaScreenCastStream *stream,
-+                                               GVariantBuilder      *parameters_builder)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (stream);
-+  MetaScreenCastWindow *screen_cast_window =
-+    META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window_stream->window));
-+  MetaRectangle bounds;
-+
-+  meta_screen_cast_window_get_buffer_bounds (screen_cast_window, &bounds);
-+
-+  g_variant_builder_add (parameters_builder, "{sv}",
-+                         "position",
-+                         g_variant_new ("(ii)",
-+                                        bounds.x, bounds.y));
-+
-+  g_variant_builder_add (parameters_builder, "{sv}",
-+                         "size",
-+                         g_variant_new ("(ii)",
-+                                        bounds.width,
-+                                        bounds.height));
-+}
-+
-+static void
-+meta_screen_cast_window_stream_transform_position (MetaScreenCastStream *stream,
-+                                                   double                stream_x,
-+                                                   double                stream_y,
-+                                                   double               *x,
-+                                                   double               *y)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (stream);
-+  MetaScreenCastWindow *screen_cast_window =
-+    META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window_stream->window));
-+
-+  meta_screen_cast_window_transform_relative_position (screen_cast_window,
-+                                                       stream_x,
-+                                                       stream_y,
-+                                                       x,
-+                                                       y);
-+}
-+
-+static void
-+on_window_unmanaged (MetaScreenCastWindowStream *window_stream)
-+{
-+  meta_screen_cast_stream_close (META_SCREEN_CAST_STREAM (window_stream));
-+}
-+
-+static void
-+meta_screen_cast_window_stream_constructed (GObject *object)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (object);
-+
-+  window_stream->window_unmanaged_handler_id =
-+    g_signal_connect_swapped (window_stream->window, "unmanaged",
-+                              G_CALLBACK (on_window_unmanaged),
-+                              window_stream);
-+
-+  G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->constructed (object);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_set_property (GObject      *object,
-+                                             guint         prop_id,
-+                                             const GValue *value,
-+                                             GParamSpec   *pspec)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (object);
-+
-+  switch (prop_id)
-+    {
-+    case PROP_WINDOW:
-+      window_stream->window = g_value_get_object (value);
-+      break;
-+    default:
-+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+    }
-+}
-+
-+static void
-+meta_screen_cast_window_stream_get_property (GObject    *object,
-+                                             guint       prop_id,
-+                                             GValue     *value,
-+                                             GParamSpec *pspec)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (object);
-+
-+  switch (prop_id)
-+    {
-+    case PROP_WINDOW:
-+      g_value_set_object (value, window_stream->window);
-+      break;
-+    default:
-+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+    }
-+}
-+
-+static void
-+meta_screen_cast_window_stream_finalize (GObject *object)
-+{
-+  MetaScreenCastWindowStream *window_stream =
-+    META_SCREEN_CAST_WINDOW_STREAM (object);
-+
-+  g_signal_handler_disconnect (window_stream->window,
-+                               window_stream->window_unmanaged_handler_id);
-+
-+  G_OBJECT_CLASS (meta_screen_cast_window_stream_parent_class)->finalize (object);
-+}
-+
-+static void
-+meta_screen_cast_window_stream_init (MetaScreenCastWindowStream *window_stream)
-+{
-+}
-+
-+static void
-+meta_screen_cast_window_stream_class_init (MetaScreenCastWindowStreamClass *klass)
-+{
-+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+  MetaScreenCastStreamClass *stream_class =
-+    META_SCREEN_CAST_STREAM_CLASS (klass);
-+
-+  object_class->constructed = meta_screen_cast_window_stream_constructed;
-+  object_class->set_property = meta_screen_cast_window_stream_set_property;
-+  object_class->get_property = meta_screen_cast_window_stream_get_property;
-+  object_class->finalize = meta_screen_cast_window_stream_finalize;
-+
-+  stream_class->create_src = meta_screen_cast_window_stream_create_src;
-+  stream_class->set_parameters = meta_screen_cast_window_stream_set_parameters;
-+  stream_class->transform_position = meta_screen_cast_window_stream_transform_position;
-+
-+  g_object_class_install_property (object_class,
-+                                   PROP_WINDOW,
-+                                   g_param_spec_object ("window",
-+                                                        "window",
-+                                                        "MetaWindow",
-+                                                        META_TYPE_WINDOW,
-+                                                        G_PARAM_READWRITE |
-+                                                        G_PARAM_CONSTRUCT_ONLY |
-+                                                        G_PARAM_STATIC_STRINGS));
-+}
-diff --git a/src/backends/meta-screen-cast-window-stream.h b/src/backends/meta-screen-cast-window-stream.h
-new file mode 100644
-index 0000000..6726ef8
---- /dev/null
-+++ b/src/backends/meta-screen-cast-window-stream.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Copyright (C) 2018 Red Hat Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ *
-+ */
-+
-+#ifndef META_SCREEN_CAST_WINDOW_STREAM_H
-+#define META_SCREEN_CAST_WINDOW_STREAM_H
-+
-+#include <glib-object.h>
-+
-+#include "backends/meta-screen-cast-stream.h"
-+#include "meta/window.h"
-+
-+#define META_TYPE_SCREEN_CAST_WINDOW_STREAM (meta_screen_cast_window_stream_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaScreenCastWindowStream,
-+                      meta_screen_cast_window_stream,
-+                      META, SCREEN_CAST_WINDOW_STREAM,
-+                      MetaScreenCastStream)
-+
-+MetaScreenCastWindowStream * meta_screen_cast_window_stream_new (GDBusConnection  *connection,
-+                                                                 MetaWindow       *window,
-+                                                                 GError          **error);
-+
-+MetaWindow  * meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream);
-+int           meta_screen_cast_window_stream_get_width  (MetaScreenCastWindowStream *window_stream);
-+int           meta_screen_cast_window_stream_get_height (MetaScreenCastWindowStream *window_stream);
-+
-+#endif /* META_SCREEN_CAST_WINDOW_STREAM_H */
--- 
-2.19.2
-
diff --git a/SOURCES/0007-wayland-legacy-xdg-shell-Handle-requests-after-tople.patch b/SOURCES/0007-wayland-legacy-xdg-shell-Handle-requests-after-tople.patch
deleted file mode 100644
index aeb9517..0000000
--- a/SOURCES/0007-wayland-legacy-xdg-shell-Handle-requests-after-tople.patch
+++ /dev/null
@@ -1,246 +0,0 @@
-From a22cb8832de7ff7323f87888afd91a3b94629530 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 25 Jul 2018 13:24:20 +0200
-Subject: [PATCH 7/8] wayland/legacy-xdg-shell: Handle requests after toplevel
- was unmanaged
-
-As with xdg-toplevel proper, a legacy xdg-toplevel can be unmanaged by
-the compositor without the client knowing about it, meaning the client
-may still send updates and make requests. Handle this gracefully by
-ignoring them. The client needs to reassign the surface the legacy
-xdg-toplevel role again, if it wants to remap the same surface, meaning
-all state would be reset anyway.
-
-Closes: https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit 64df6276881c5f42c6d2054d556d8cd391f7ee70)
----
- src/wayland/meta-wayland-legacy-xdg-shell.c | 93 +++++++++++++++++----
- 1 file changed, 79 insertions(+), 14 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-legacy-xdg-shell.c b/src/wayland/meta-wayland-legacy-xdg-shell.c
-index 861270193..addd0855f 100644
---- a/src/wayland/meta-wayland-legacy-xdg-shell.c
-+++ b/src/wayland/meta-wayland-legacy-xdg-shell.c
-@@ -185,6 +185,11 @@ zxdg_toplevel_v6_set_parent (struct wl_client   *client,
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-   MetaWindow *transient_for = NULL;
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (parent_resource)
-     {
-@@ -194,7 +199,7 @@ zxdg_toplevel_v6_set_parent (struct wl_client   *client,
-       transient_for = parent_surface->window;
-     }
- 
--  meta_window_set_transient_for (surface->window, transient_for);
-+  meta_window_set_transient_for (window, transient_for);
- }
- 
- static void
-@@ -203,11 +208,16 @@ zxdg_toplevel_v6_set_title (struct wl_client   *client,
-                             const char         *title)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (!g_utf8_validate (title, -1, NULL))
-     title = "";
- 
--  meta_window_set_title (surface->window, title);
-+  meta_window_set_title (window, title);
- }
- 
- static void
-@@ -216,11 +226,16 @@ zxdg_toplevel_v6_set_app_id (struct wl_client   *client,
-                              const char         *app_id)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (!g_utf8_validate (app_id, -1, NULL))
-     app_id = "";
- 
--  meta_window_set_wm_class (surface->window, app_id, app_id);
-+  meta_window_set_wm_class (window, app_id, app_id);
- }
- 
- static void
-@@ -233,15 +248,20 @@ zxdg_toplevel_v6_show_window_menu (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   int monitor_scale;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
-     return;
- 
--  monitor_scale = surface->window->monitor->scale;
--  meta_window_show_menu (surface->window, META_WINDOW_MENU_WM,
--                         surface->window->buffer_rect.x + (x * monitor_scale),
--                         surface->window->buffer_rect.y + (y * monitor_scale));
-+  monitor_scale = window->monitor->scale;
-+  meta_window_show_menu (window, META_WINDOW_MENU_WM,
-+                         window->buffer_rect.x + (x * monitor_scale),
-+                         window->buffer_rect.y + (y * monitor_scale));
- }
- 
- static void
-@@ -252,8 +272,13 @@ zxdg_toplevel_v6_move (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   gfloat x, y;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y))
-     return;
- 
-@@ -292,9 +317,14 @@ zxdg_toplevel_v6_resize (struct wl_client   *client,
- {
-   MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-   gfloat x, y;
-   MetaGrabOp grab_op;
- 
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-   if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y))
-     return;
- 
-@@ -309,6 +339,11 @@ zxdg_toplevel_v6_set_max_size (struct wl_client   *client,
-                                int32_t             height)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (width < 0 || height < 0)
-     {
-@@ -331,6 +366,11 @@ zxdg_toplevel_v6_set_min_size (struct wl_client   *client,
-                                int32_t             height)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (width < 0 || height < 0)
-     {
-@@ -351,9 +391,14 @@ zxdg_toplevel_v6_set_maximized (struct wl_client   *client,
-                                 struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
- 
--  meta_window_force_placement (surface->window, TRUE);
--  meta_window_maximize (surface->window, META_MAXIMIZE_BOTH);
-+  window = surface->window;
-+  if (!window)
-+    return;
-+
-+  meta_window_force_placement (window, TRUE);
-+  meta_window_maximize (window, META_MAXIMIZE_BOTH);
- }
- 
- static void
-@@ -361,8 +406,13 @@ zxdg_toplevel_v6_unset_maximized (struct wl_client   *client,
-                                   struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
--  meta_window_unmaximize (surface->window, META_MAXIMIZE_BOTH);
-+  meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
- }
- 
- static void
-@@ -371,15 +421,20 @@ zxdg_toplevel_v6_set_fullscreen (struct wl_client   *client,
-                                  struct wl_resource *output_resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (output_resource)
-     {
-       MetaWaylandOutput *output = wl_resource_get_user_data (output_resource);
-       if (output)
--        meta_window_move_to_monitor (surface->window, output->logical_monitor->number);
-+        meta_window_move_to_monitor (window, output->logical_monitor->number);
-     }
- 
--  meta_window_make_fullscreen (surface->window);
-+  meta_window_make_fullscreen (window);
- }
- 
- static void
-@@ -387,8 +442,13 @@ zxdg_toplevel_v6_unset_fullscreen (struct wl_client   *client,
-                                    struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
--  meta_window_unmake_fullscreen (surface->window);
-+  meta_window_unmake_fullscreen (window);
- }
- 
- static void
-@@ -396,8 +456,13 @@ zxdg_toplevel_v6_set_minimized (struct wl_client   *client,
-                                 struct wl_resource *resource)
- {
-   MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
--  meta_window_minimize (surface->window);
-+  meta_window_minimize (window);
- }
- 
- static const struct zxdg_toplevel_v6_interface meta_wayland_zxdg_toplevel_v6_interface = {
--- 
-2.19.0
-
diff --git a/SOURCES/0008-background-purge-all-background-textures-on-suspend.patch b/SOURCES/0008-background-purge-all-background-textures-on-suspend.patch
index 03aeef8..1034111 100644
--- a/SOURCES/0008-background-purge-all-background-textures-on-suspend.patch
+++ b/SOURCES/0008-background-purge-all-background-textures-on-suspend.patch
@@ -1,4 +1,4 @@
-From 6bf00273a995597c22b3e98d9f4752fbb238f5ea Mon Sep 17 00:00:00 2001
+From c78a614b0d45a4bc8101a93c7138c9fb6102d13c Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Wed, 9 Jan 2019 16:57:05 -0500
 Subject: [PATCH 8/9] background: purge all background textures on suspend
@@ -7,42 +7,15 @@ This commit makes sure all background textures get purged
 on suspend, which is important for nvidia.
 ---
  src/compositor/meta-background-image.c | 28 ++++++++++++++++++++++++++
- src/compositor/meta-background.c       | 19 ++++++++++++++++-
+ src/compositor/meta-background.c       | 17 +++++++++++++++-
  src/meta/meta-background-image.h       |  2 ++
- 3 files changed, 48 insertions(+), 1 deletion(-)
+ 3 files changed, 46 insertions(+), 1 deletion(-)
 
 diff --git a/src/compositor/meta-background-image.c b/src/compositor/meta-background-image.c
-index b06066422..995e588fa 100644
+index 14d3baf57..98909cb53 100644
 --- a/src/compositor/meta-background-image.c
 +++ b/src/compositor/meta-background-image.c
-@@ -252,60 +252,88 @@ meta_background_image_cache_load (MetaBackgroundImageCache *cache,
-   g_object_unref (task);
- 
-   return image;
- }
- 
- /**
-  * meta_background_image_cache_purge:
-  * @cache: a #MetaBackgroundImageCache
-  * @file: file to remove from the cache
-  *
-  * Remove an entry from the cache; this would be used if monitoring
-  * showed that the file changed.
-  */
- void
- meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
-                                    GFile                    *file)
- {
-   MetaBackgroundImage *image;
- 
-   g_return_if_fail (META_IS_BACKGROUND_IMAGE_CACHE (cache));
-   g_return_if_fail (file != NULL);
- 
-   image = g_hash_table_lookup (cache->images, file);
-   if (image == NULL)
-     return;
- 
-   g_hash_table_remove (cache->images, image->file);
+@@ -283,6 +283,34 @@ meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
    image->in_cache = FALSE;
  }
  
@@ -77,78 +50,22 @@ index b06066422..995e588fa 100644
  G_DEFINE_TYPE (MetaBackgroundImage, meta_background_image, G_TYPE_OBJECT);
  
  static void
- meta_background_image_init (MetaBackgroundImage *image)
- {
- }
- 
- static void
- meta_background_image_finalize (GObject *object)
- {
-   MetaBackgroundImage *image = META_BACKGROUND_IMAGE (object);
- 
-   if (image->in_cache)
-     g_hash_table_remove (image->cache->images, image->file);
- 
-   if (image->texture)
-     cogl_object_unref (image->texture);
-   if (image->file)
-     g_object_unref (image->file);
- 
-   G_OBJECT_CLASS (meta_background_image_parent_class)->finalize (object);
- }
- 
- static void
- meta_background_image_class_init (MetaBackgroundImageClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
- 
-   object_class->finalize = meta_background_image_finalize;
- 
 diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c
-index 61dd12095..3d23f1fdc 100644
+index c033395fe..abdfcc7df 100644
 --- a/src/compositor/meta-background.c
 +++ b/src/compositor/meta-background.c
-@@ -290,70 +290,84 @@ set_file (MetaBackground       *self,
-                             G_CALLBACK (on_background_loaded), self);
-         }
-     }
- }
- 
- static void
- meta_background_dispose (GObject *object)
- {
-   MetaBackground        *self = META_BACKGROUND (object);
-   MetaBackgroundPrivate *priv = self->priv;
- 
-   free_color_texture (self);
-   free_wallpaper_texture (self);
- 
-   set_file (self, &priv->file1, &priv->background_image1, NULL);
-   set_file (self, &priv->file2, &priv->background_image2, NULL);
- 
-   set_screen (self, NULL);
- 
-   G_OBJECT_CLASS (meta_background_parent_class)->dispose (object);
- }
- 
- static void
- meta_background_finalize (GObject *object)
- {
-   all_backgrounds = g_slist_remove (all_backgrounds, object);
- 
+@@ -303,6 +303,18 @@ meta_background_finalize (GObject *object)
    G_OBJECT_CLASS (meta_background_parent_class)->finalize (object);
  }
  
 +static void
 +free_textures (MetaBackground *self)
 +{
-+  MetaBackgroundPrivate *priv = self->priv;
-+
 +  free_color_texture (self);
 +  free_wallpaper_texture (self);
 +
-+  set_file (self, &priv->file1, &priv->background_image1, NULL);
-+  set_file (self, &priv->file2, &priv->background_image2, NULL);
++  set_file (self, &self->file1, &self->background_image1, NULL);
++  set_file (self, &self->file2, &self->background_image2, NULL);
 +
 +  mark_changed (self);
 +}
@@ -156,72 +73,16 @@ index 61dd12095..3d23f1fdc 100644
  static void
  meta_background_constructed (GObject *object)
  {
-   MetaBackground        *self = META_BACKGROUND (object);
-   MetaBackgroundPrivate *priv = self->priv;
- 
+@@ -312,7 +324,7 @@ meta_background_constructed (GObject *object)
    G_OBJECT_CLASS (meta_background_parent_class)->constructed (object);
  
-   g_signal_connect_object (meta_screen_get_display (priv->screen), "gl-video-memory-purged",
+   g_signal_connect_object (self->display, "gl-video-memory-purged",
 -                           G_CALLBACK (mark_changed), object, G_CONNECT_SWAPPED);
 +                           G_CALLBACK (free_textures), object, G_CONNECT_SWAPPED);
- }
- 
- static void
- meta_background_class_init (MetaBackgroundClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-   GParamSpec *param_spec;
- 
-   g_type_class_add_private (klass, sizeof (MetaBackgroundPrivate));
- 
-   object_class->dispose = meta_background_dispose;
-   object_class->finalize = meta_background_finalize;
-   object_class->constructed = meta_background_constructed;
-   object_class->set_property = meta_background_set_property;
-   object_class->get_property = meta_background_get_property;
- 
-   signals[CHANGED] =
-     g_signal_new ("changed",
-                   G_TYPE_FROM_CLASS (object_class),
-                   G_SIGNAL_RUN_LAST,
-                   0,
-                   NULL, NULL, NULL,
-                   G_TYPE_NONE, 0);
- 
-   param_spec = g_param_spec_object ("meta-screen",
-                                     "MetaScreen",
-                                     "MetaScreen",
-                                     META_TYPE_SCREEN,
-                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
- 
-@@ -933,35 +947,38 @@ meta_background_set_file (MetaBackground            *self,
-   meta_background_set_blend (self, file, NULL, 0.0, style);
- }
- 
- void
- meta_background_set_blend (MetaBackground          *self,
-                            GFile                   *file1,
-                            GFile                   *file2,
-                            double                   blend_factor,
-                            GDesktopBackgroundStyle  style)
- {
-   MetaBackgroundPrivate *priv;
- 
-   g_return_if_fail (META_IS_BACKGROUND (self));
-   g_return_if_fail (blend_factor >= 0.0 && blend_factor <= 1.0);
- 
-   priv = self->priv;
- 
-   set_file (self, &priv->file1, &priv->background_image1, file1);
-   set_file (self, &priv->file2, &priv->background_image2, file2);
- 
-   priv->blend_factor = blend_factor;
-   priv->style = style;
- 
-   free_wallpaper_texture (self);
-   mark_changed (self);
- }
  
+   g_signal_connect_object (monitor_manager, "monitors-changed",
+                            G_CALLBACK (on_monitors_changed), self,
+@@ -950,8 +962,11 @@ meta_background_set_blend (MetaBackground          *self,
  void
  meta_background_refresh_all (void)
  {
@@ -234,37 +95,10 @@ index 61dd12095..3d23f1fdc 100644
      mark_changed (l->data);
  }
 diff --git a/src/meta/meta-background-image.h b/src/meta/meta-background-image.h
-index fa67b42cf..5ecfb9753 100644
+index 137a6ff8e..87e40d251 100644
 --- a/src/meta/meta-background-image.h
 +++ b/src/meta/meta-background-image.h
-@@ -46,31 +46,33 @@ GType meta_background_image_get_type (void);
- gboolean     meta_background_image_is_loaded   (MetaBackgroundImage *image);
- gboolean     meta_background_image_get_success (MetaBackgroundImage *image);
- CoglTexture *meta_background_image_get_texture (MetaBackgroundImage *image);
- 
- #define META_TYPE_BACKGROUND_IMAGE_CACHE            (meta_background_image_cache_get_type ())
- #define META_BACKGROUND_IMAGE_CACHE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKGROUND_IMAGE_CACHE, MetaBackgroundImageCache))
- #define META_BACKGROUND_IMAGE_CACHE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_BACKGROUND_IMAGE_CACHE, MetaBackgroundImageCacheClass))
- #define META_IS_BACKGROUND_IMAGE_CACHE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKGROUND_IMAGE_CACHE))
- #define META_IS_BACKGROUND_IMAGE_CACHE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_BACKGROUND_IMAGE_CACHE))
- #define META_BACKGROUND_IMAGE_CACHE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_BACKGROUND_IMAGE_CACHE, MetaBackgroundImageCacheClass))
- 
- /**
-  * MetaBackgroundImageCache:
-  *
-  * #MetaBackgroundImageCache caches loading of textures for backgrounds; there's actually
-  * nothing background specific about it, other than it is tuned to work well for
-  * large images as typically are used for backgrounds.
-  */
- typedef struct _MetaBackgroundImageCache      MetaBackgroundImageCache;
- typedef struct _MetaBackgroundImageCacheClass MetaBackgroundImageCacheClass;
- 
- MetaBackgroundImageCache *meta_background_image_cache_get_default (void);
- 
- GType meta_background_image_cache_get_type (void);
- 
- MetaBackgroundImage *meta_background_image_cache_load  (MetaBackgroundImageCache *cache,
-                                                         GFile                    *file);
+@@ -66,4 +66,6 @@ META_EXPORT
  void                 meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
                                                          GFile                    *file);
  
@@ -272,5 +106,5 @@ index fa67b42cf..5ecfb9753 100644
 +
  #endif /* __META_BACKGROUND_IMAGE_H__ */
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0008-screen-cast-session-Add-support-for-RecordWindow.patch b/SOURCES/0008-screen-cast-session-Add-support-for-RecordWindow.patch
deleted file mode 100644
index 9c5fbec..0000000
--- a/SOURCES/0008-screen-cast-session-Add-support-for-RecordWindow.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-From c4e07c78940aa873a0258d45da7f417f483b8873 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Fri, 28 Sep 2018 10:48:31 +0200
-Subject: [PATCH 08/12] screen-cast-session: Add support for RecordWindow
-
-Add support for the RecordWindow screencast method, casting the
-currently focused window.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit ec25f3a6b7923627484c6c1c65f8af0bebe56423)
----
- src/backends/meta-screen-cast-session.c | 52 +++++++++++++++++++++++--
- 1 file changed, 48 insertions(+), 4 deletions(-)
-
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index e1b6393..3ee02c5 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -26,9 +26,11 @@
- 
- #include "backends/meta-backend-private.h"
- #include "backends/meta-dbus-session-watcher.h"
-+#include "backends/meta-remote-access-controller-private.h"
- #include "backends/meta-screen-cast-monitor-stream.h"
- #include "backends/meta-screen-cast-stream.h"
--#include "backends/meta-remote-access-controller-private.h"
-+#include "backends/meta-screen-cast-window-stream.h"
-+#include "core/display-private.h"
- 
- #define META_SCREEN_CAST_SESSION_DBUS_PATH "/org/gnome/Mutter/ScreenCast/Session"
- 
-@@ -333,6 +335,14 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
-                       GVariant                  *properties_variant)
- {
-   MetaScreenCastSession *session = META_SCREEN_CAST_SESSION (skeleton);
-+  GDBusInterfaceSkeleton *interface_skeleton;
-+  GDBusConnection *connection;
-+  MetaWindow *window;
-+  GError *error = NULL;
-+  MetaDisplay *display;
-+  MetaScreenCastWindowStream *window_stream;
-+  MetaScreenCastStream *stream;
-+  char *stream_path;
- 
-   if (!check_permission (session, invocation))
-     {
-@@ -342,9 +352,43 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
-       return TRUE;
-     }
- 
--  g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
--                                         G_DBUS_ERROR_FAILED,
--                                         "Recording a window not yet supported");
-+  display = meta_get_display ();
-+  window = meta_display_get_focus_window (display);
-+  if (!window)
-+    {
-+      g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
-+                                             G_DBUS_ERROR_FAILED,
-+                                             "Window not found");
-+      return TRUE;
-+    }
-+
-+  interface_skeleton = G_DBUS_INTERFACE_SKELETON (skeleton);
-+  connection = g_dbus_interface_skeleton_get_connection (interface_skeleton);
-+
-+  window_stream = meta_screen_cast_window_stream_new (connection,
-+                                                      window,
-+                                                      &error);
-+  if (!window_stream)
-+    {
-+      g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
-+                                             G_DBUS_ERROR_FAILED,
-+                                             "Failed to record window: %s",
-+                                             error->message);
-+      g_error_free (error);
-+      return TRUE;
-+    }
-+
-+  stream = META_SCREEN_CAST_STREAM (window_stream);
-+  stream_path = meta_screen_cast_stream_get_object_path (stream);
-+
-+  session->streams = g_list_append (session->streams, stream);
-+
-+  g_signal_connect (stream, "closed", G_CALLBACK (on_stream_closed), session);
-+
-+  meta_dbus_screen_cast_session_complete_record_window (skeleton,
-+                                                        invocation,
-+                                                        stream_path);
-+
-   return TRUE;
- }
- 
--- 
-2.19.2
-
diff --git a/SOURCES/0008-wayland-gtk-shell-Handle-requests-after-toplevel-was.patch b/SOURCES/0008-wayland-gtk-shell-Handle-requests-after-toplevel-was.patch
deleted file mode 100644
index ea648bd..0000000
--- a/SOURCES/0008-wayland-gtk-shell-Handle-requests-after-toplevel-was.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From 8ddbe9d98bb02145fea898a2a85bbb49f2e85f5b Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 25 Jul 2018 12:20:57 +0200
-Subject: [PATCH 8/8] wayland/gtk-shell: Handle requests after toplevel was
- unmanaged
-
-As with xdg-toplevel, a gtk-surface can be unmanaged by the compositor
-without the client knowing about it, meaning the client may still send
-updates and make requests. Handle this gracefully by ignoring them. The
-client needs to reset all the state anyway, if it wants to remap the
-same surface.
-
-https://gitlab.gnome.org/GNOME/mutter/issues/240
-(cherry picked from commit ca5b27baf517f00354ff8811ba204fd90f1ddb38)
----
- src/wayland/meta-wayland-gtk-shell.c | 29 ++++++++++++++++++----------
- 1 file changed, 19 insertions(+), 10 deletions(-)
-
-diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
-index 0ef9b83ff..474595b18 100644
---- a/src/wayland/meta-wayland-gtk-shell.c
-+++ b/src/wayland/meta-wayland-gtk-shell.c
-@@ -71,15 +71,13 @@ gtk_surface_set_dbus_properties (struct wl_client   *client,
- {
-   MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
-   MetaWaylandSurface *surface = gtk_surface->surface;
-+  MetaWindow *window;
- 
--  /* Broken client, let it die instead of us */
--  if (!surface->window)
--    {
--      meta_warning ("meta-wayland-surface: set_dbus_properties called with invalid window!\n");
--      return;
--    }
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
--  meta_window_set_gtk_dbus_properties (surface->window,
-+  meta_window_set_gtk_dbus_properties (window,
-                                        application_id,
-                                        unique_bus_name,
-                                        app_menu_path,
-@@ -94,12 +92,17 @@ gtk_surface_set_modal (struct wl_client   *client,
- {
-   MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
-   MetaWaylandSurface *surface = gtk_surface->surface;
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (gtk_surface->is_modal)
-     return;
- 
-   gtk_surface->is_modal = TRUE;
--  meta_window_set_type (surface->window, META_WINDOW_MODAL_DIALOG);
-+  meta_window_set_type (window, META_WINDOW_MODAL_DIALOG);
- }
- 
- static void
-@@ -108,12 +111,17 @@ gtk_surface_unset_modal (struct wl_client   *client,
- {
-   MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
-   MetaWaylandSurface *surface = gtk_surface->surface;
-+  MetaWindow *window;
-+
-+  window = surface->window;
-+  if (!window)
-+    return;
- 
-   if (!gtk_surface->is_modal)
-     return;
- 
-   gtk_surface->is_modal = FALSE;
--  meta_window_set_type (surface->window, META_WINDOW_NORMAL);
-+  meta_window_set_type (window, META_WINDOW_NORMAL);
- }
- 
- static void
-@@ -123,8 +131,9 @@ gtk_surface_present (struct wl_client   *client,
- {
-   MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
-   MetaWaylandSurface *surface = gtk_surface->surface;
--  MetaWindow *window = surface->window;
-+  MetaWindow *window;
- 
-+  window = surface->window;
-   if (!window)
-     return;
- 
--- 
-2.19.0
-
diff --git a/SOURCES/0009-MetaShapedTexture-save-and-restore-textures-on-suspe.patch b/SOURCES/0009-MetaShapedTexture-save-and-restore-textures-on-suspe.patch
index 4d17828..4b38154 100644
--- a/SOURCES/0009-MetaShapedTexture-save-and-restore-textures-on-suspe.patch
+++ b/SOURCES/0009-MetaShapedTexture-save-and-restore-textures-on-suspe.patch
@@ -1,4 +1,4 @@
-From 04b7954c7f04e7348f139fdf5c38e7702b387ee3 Mon Sep 17 00:00:00 2001
+From d8cc418899276b45cb1a787493e0998e3b008fe5 Mon Sep 17 00:00:00 2001
 From: Ray Strode <rstrode@redhat.com>
 Date: Thu, 10 Jan 2019 10:48:02 -0500
 Subject: [PATCH 9/9] MetaShapedTexture: save and restore textures on suspend
@@ -16,70 +16,25 @@ This commit addresses that complication by keeping a local texture
 around for those external textures, and using it instead for parts
 of the window that haven't been redrawn since resume.
 ---
- src/compositor/meta-shaped-texture.c | 494 +++++++++++++++++++++++++--
+ src/compositor/meta-shaped-texture.c | 487 +++++++++++++++++++++++++--
  src/meta/meta-shaped-texture.h       |   2 +
- 2 files changed, 475 insertions(+), 21 deletions(-)
+ 2 files changed, 468 insertions(+), 21 deletions(-)
 
 diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index d8c250fc9..8de173bf7 100644
+index d64e214e5..ea8daa03d 100644
 --- a/src/compositor/meta-shaped-texture.c
 +++ b/src/compositor/meta-shaped-texture.c
-@@ -2,166 +2,203 @@
-  * Authored By Neil Roberts  <neil@linux.intel.com>
-  * and Jasper St. Pierre <jstpierre@mecheye.net>
-  *
-  * Copyright (C) 2008 Intel Corporation
-  * Copyright (C) 2012 Red Hat, Inc.
-  *
-  * This program is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU General Public License as
-  * published by the Free Software Foundation; either version 2 of the
-  * License, or (at your option) any later version.
-  *
-  * This program is distributed in the hope that it will be useful, but
-  * WITHOUT ANY WARRANTY; without even the implied warranty of
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-  * General Public License for more details.
-  *
-  * You should have received a copy of the GNU General Public License
-  * along with this program; if not, see <http://www.gnu.org/licenses/>.
-  */
- 
- /**
-  * SECTION:meta-shaped-texture
-  * @title: MetaShapedTexture
-  * @short_description: An actor to draw a masked texture.
-  */
- 
- #include <config.h>
- 
- #include <meta/meta-shaped-texture.h>
- #include "meta-shaped-texture-private.h"
-+#include "meta-texture-rectangle.h"
- 
- #include <cogl/cogl.h>
- #include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
- 
- #include "clutter-utils.h"
- #include "meta-texture-tower.h"
+@@ -40,7 +40,9 @@
+ #include "compositor/meta-texture-tower.h"
+ #include "compositor/region-utils.h"
  #include "core/boxes-private.h"
- 
- #include "meta-cullable.h"
 +#include <meta/meta-backend.h>
+ #include "meta/meta-shaped-texture.h"
++#include "meta-texture-rectangle.h"
  
- static void meta_shaped_texture_dispose  (GObject    *object);
- 
- static void meta_shaped_texture_paint (ClutterActor       *actor);
- 
- static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
-                                                      gfloat        for_height,
-                                                      gfloat       *min_width_p,
-                                                      gfloat       *natural_width_p);
- 
- static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
-                                                       gfloat        for_width,
-                                                       gfloat       *min_height_p,
-                                                       gfloat       *natural_height_p);
+ /* MAX_MIPMAPPING_FPS needs to be as small as possible for the best GPU
+  * performance, but higher than the refresh rate of commonly slow updating
+@@ -72,8 +74,12 @@ static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
  
  static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
  
@@ -89,18 +44,10 @@ index d8c250fc9..8de173bf7 100644
  
 +static gboolean meta_debug_show_backing_store = FALSE;
 +
- G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_ACTOR,
-                          G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
- 
- #define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
-                                 MetaShapedTexturePrivate))
- 
- enum {
+ enum
+ {
    SIZE_CHANGED,
- 
-   LAST_SIGNAL,
- };
+@@ -83,6 +89,14 @@ enum
  
  static guint signals[LAST_SIGNAL];
  
@@ -112,26 +59,12 @@ index d8c250fc9..8de173bf7 100644
 +  cairo_region_t *region;
 +} MetaTextureBackingStore;
 +
- struct _MetaShapedTexturePrivate
+ struct _MetaShapedTexture
  {
-   MetaTextureTower *paint_tower;
- 
-   CoglTexture *texture;
-   CoglTexture *mask_texture;
-   CoglSnippet *snippet;
- 
-   CoglPipeline *base_pipeline;
-   CoglPipeline *masked_pipeline;
-   CoglPipeline *unblended_pipeline;
- 
-   gboolean is_y_inverted;
- 
-   /* The region containing only fully opaque pixels */
-   cairo_region_t *opaque_region;
- 
-   /* MetaCullable regions, see that documentation for more details */
-   cairo_region_t *clip_region;
-   cairo_region_t *unobscured_region;
+   ClutterActor parent;
+@@ -114,6 +128,16 @@ struct _MetaShapedTexture
+   int viewport_dst_width;
+   int viewport_dst_height;
  
 +  /* textures get corrupted on suspend, so save them */
 +  cairo_surface_t *saved_base_surface;
@@ -143,119 +76,45 @@ index d8c250fc9..8de173bf7 100644
 +   * saved snapshot */
 +  MetaTextureBackingStore *backing_store;
 +
-   guint tex_width, tex_height;
-   guint fallback_width, fallback_height;
- 
-   guint create_mipmaps : 1;
- };
- 
- static void
- meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
- {
-   GObjectClass *gobject_class = (GObjectClass *) klass;
-   ClutterActorClass *actor_class = (ClutterActorClass *) klass;
- 
-   gobject_class->dispose = meta_shaped_texture_dispose;
- 
-   actor_class->get_preferred_width = meta_shaped_texture_get_preferred_width;
-   actor_class->get_preferred_height = meta_shaped_texture_get_preferred_height;
-   actor_class->paint = meta_shaped_texture_paint;
-   actor_class->get_paint_volume = meta_shaped_texture_get_paint_volume;
- 
-   signals[SIZE_CHANGED] = g_signal_new ("size-changed",
-                                         G_TYPE_FROM_CLASS (gobject_class),
-                                         G_SIGNAL_RUN_LAST,
+   int tex_width, tex_height;
+   int fallback_width, fallback_height;
+   int dst_width, dst_height;
+@@ -148,6 +172,9 @@ meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
                                          0,
                                          NULL, NULL, NULL,
                                          G_TYPE_NONE, 0);
- 
-   g_type_class_add_private (klass, sizeof (MetaShapedTexturePrivate));
 +
 +  if (g_getenv ("MUTTER_DEBUG_BACKING_STORE"))
 +    meta_debug_show_backing_store = TRUE;
  }
  
  static void
- meta_shaped_texture_init (MetaShapedTexture *self)
+@@ -159,6 +186,11 @@ invalidate_size (MetaShapedTexture *stex)
+ static void
+ meta_shaped_texture_init (MetaShapedTexture *stex)
  {
-   MetaShapedTexturePrivate *priv;
 +  MetaBackend *backend = meta_get_backend ();
 +  ClutterBackend *clutter_backend = clutter_get_default_backend ();
 +  CoglContext *cogl_context =
 +    clutter_backend_get_cogl_context (clutter_backend);
++
+   stex->paint_tower = meta_texture_tower_new ();
  
-   priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
- 
-   priv->paint_tower = meta_texture_tower_new ();
- 
-   priv->texture = NULL;
-   priv->mask_texture = NULL;
-   priv->create_mipmaps = TRUE;
-   priv->is_y_inverted = TRUE;
+   stex->texture = NULL;
+@@ -171,6 +203,12 @@ meta_shaped_texture_init (MetaShapedTexture *stex)
+                     "notify::scale-x",
+                     G_CALLBACK (invalidate_size),
+                     stex);
 +
 +  if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_UNSTABLE_TEXTURES))
 +    {
-+      g_signal_connect_object (backend, "suspending", G_CALLBACK (meta_shaped_texture_save), self, G_CONNECT_SWAPPED);
-+      g_signal_connect_object (backend, "resuming", G_CALLBACK (meta_shaped_texture_restore), self, G_CONNECT_SWAPPED);
++      g_signal_connect_object (backend, "suspending", G_CALLBACK (meta_shaped_texture_save), stex, G_CONNECT_SWAPPED);
++      g_signal_connect_object (backend, "resuming", G_CALLBACK (meta_shaped_texture_restore), stex, G_CONNECT_SWAPPED);
 +    }
  }
  
  static void
- set_unobscured_region (MetaShapedTexture *self,
-                        cairo_region_t    *unobscured_region)
- {
-   MetaShapedTexturePrivate *priv = self->priv;
- 
-   g_clear_pointer (&priv->unobscured_region, (GDestroyNotify) cairo_region_destroy);
-   if (unobscured_region)
-     {
-       guint width, height;
- 
-       if (priv->texture)
-         {
-           width = priv->tex_width;
-           height = priv->tex_height;
-         }
-       else
-         {
-           width = priv->fallback_width;
-           height = priv->fallback_height;
-         }
- 
-       cairo_rectangle_int_t bounds = { 0, 0, width, height };
-       priv->unobscured_region = cairo_region_copy (unobscured_region);
-       cairo_region_intersect_rectangle (priv->unobscured_region, &bounds);
-     }
- }
- 
-@@ -183,116 +220,183 @@ meta_shaped_texture_reset_pipelines (MetaShapedTexture *stex)
- 
-   g_clear_pointer (&priv->base_pipeline, cogl_object_unref);
-   g_clear_pointer (&priv->masked_pipeline, cogl_object_unref);
-   g_clear_pointer (&priv->unblended_pipeline, cogl_object_unref);
- }
- 
- static void
- meta_shaped_texture_dispose (GObject *object)
- {
-   MetaShapedTexture *self = (MetaShapedTexture *) object;
-   MetaShapedTexturePrivate *priv = self->priv;
- 
-   if (priv->paint_tower)
-     meta_texture_tower_free (priv->paint_tower);
-   priv->paint_tower = NULL;
- 
-   g_clear_pointer (&priv->texture, cogl_object_unref);
-   g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
- 
-   meta_shaped_texture_set_mask_texture (self, NULL);
-   set_unobscured_region (self, NULL);
-   set_clip_region (self, NULL);
- 
-   meta_shaped_texture_reset_pipelines (self);
- 
-   g_clear_pointer (&priv->snippet, cogl_object_unref);
- 
+@@ -311,24 +349,72 @@ meta_shaped_texture_dispose (GObject *object)
    G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
  }
  
@@ -266,7 +125,6 @@ index d8c250fc9..8de173bf7 100644
 +                   int               *backing_layer_index,
 +                   int               *mask_layer_index)
 +{
-+  MetaShapedTexturePrivate *priv = stex->priv;
 +  int next_layer_index = 0;
 +
 +  if (main_layer_index)
@@ -274,7 +132,7 @@ index d8c250fc9..8de173bf7 100644
 +
 +  next_layer_index++;
 +
-+  if (priv->backing_store)
++  if (stex->backing_store)
 +    {
 +      if (backing_mask_layer_index)
 +        *backing_mask_layer_index = next_layer_index;
@@ -301,15 +159,14 @@ index d8c250fc9..8de173bf7 100644
  get_base_pipeline (MetaShapedTexture *stex,
                     CoglContext       *ctx)
  {
-   MetaShapedTexturePrivate *priv = stex->priv;
    CoglPipeline *pipeline;
 +  int main_layer_index;
 +  int backing_layer_index;
 +  int backing_mask_layer_index;
 +  int i, number_of_layers;
  
-   if (priv->base_pipeline)
-     return priv->base_pipeline;
+   if (stex->base_pipeline)
+     return stex->base_pipeline;
  
    pipeline = cogl_pipeline_new (ctx);
 -  cogl_pipeline_set_layer_wrap_mode_s (pipeline, 0,
@@ -335,10 +192,10 @@ index d8c250fc9..8de173bf7 100644
 +                                           COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE);
 +    }
 +
-   if (!priv->is_y_inverted)
+   if (!stex->is_y_inverted)
      {
        CoglMatrix matrix;
- 
+@@ -336,7 +422,22 @@ get_base_pipeline (MetaShapedTexture *stex,
        cogl_matrix_init_identity (&matrix);
        cogl_matrix_scale (&matrix, 1, -1, 1);
        cogl_matrix_translate (&matrix, 0, -1, 0);
@@ -346,7 +203,7 @@ index d8c250fc9..8de173bf7 100644
 +      cogl_pipeline_set_layer_matrix (pipeline, main_layer_index, &matrix);
 +    }
 +
-+  if (priv->backing_store)
++  if (stex->backing_store)
 +    {
 +      g_autofree char *backing_description = NULL;
 +      cogl_pipeline_set_layer_combine (pipeline, backing_mask_layer_index,
@@ -361,32 +218,24 @@ index d8c250fc9..8de173bf7 100644
 +                                       NULL);
      }
  
-   if (priv->snippet)
--    cogl_pipeline_add_layer_snippet (pipeline, 0, priv->snippet);
-+    cogl_pipeline_add_layer_snippet (pipeline, main_layer_index, priv->snippet);
- 
-   priv->base_pipeline = pipeline;
+   if (stex->transform != META_MONITOR_TRANSFORM_NORMAL)
+@@ -379,7 +480,7 @@ get_base_pipeline (MetaShapedTexture *stex,
+     }
  
-   return priv->base_pipeline;
- }
+   if (stex->snippet)
+-    cogl_pipeline_add_layer_snippet (pipeline, 0, stex->snippet);
++    cogl_pipeline_add_layer_snippet (pipeline, main_layer_index, stex->snippet);
  
- static CoglPipeline *
- get_unmasked_pipeline (MetaShapedTexture *stex,
-                        CoglContext       *ctx)
- {
-   return get_base_pipeline (stex, ctx);
- }
+   stex->base_pipeline = pipeline;
  
- static CoglPipeline *
- get_masked_pipeline (MetaShapedTexture *stex,
+@@ -398,12 +499,15 @@ get_masked_pipeline (MetaShapedTexture *stex,
                       CoglContext       *ctx)
  {
-   MetaShapedTexturePrivate *priv = stex->priv;
    CoglPipeline *pipeline;
 +  int mask_layer_index;
  
-   if (priv->masked_pipeline)
-     return priv->masked_pipeline;
+   if (stex->masked_pipeline)
+     return stex->masked_pipeline;
  
 +  get_layer_indices (stex, NULL, NULL, NULL, &mask_layer_index);
 +
@@ -396,108 +245,16 @@ index d8c250fc9..8de173bf7 100644
                                     "RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
                                     NULL);
  
-   priv->masked_pipeline = pipeline;
- 
-   return pipeline;
- }
- 
- static CoglPipeline *
- get_unblended_pipeline (MetaShapedTexture *stex,
-                         CoglContext       *ctx)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
-   CoglPipeline *pipeline;
-   CoglColor color;
- 
-   if (priv->unblended_pipeline)
-     return priv->unblended_pipeline;
- 
-   pipeline = cogl_pipeline_copy (get_base_pipeline (stex, ctx));
-   cogl_color_init_from_4ub (&color, 255, 255, 255, 255);
-   cogl_pipeline_set_blend (pipeline,
-                            "RGBA = ADD (SRC_COLOR, 0)",
-                            NULL);
-   cogl_pipeline_set_color (pipeline, &color);
- 
-   priv->unblended_pipeline = pipeline;
- 
-   return pipeline;
- }
-@@ -313,105 +417,111 @@ paint_clipped_rectangle (CoglFramebuffer       *fb,
- 
-   coords[0] = rect->x / (alloc->x2 - alloc->x1);
-   coords[1] = rect->y / (alloc->y2 - alloc->y1);
-   coords[2] = (rect->x + rect->width) / (alloc->x2 - alloc->x1);
-   coords[3] = (rect->y + rect->height) / (alloc->y2 - alloc->y1);
- 
-   coords[4] = coords[0];
-   coords[5] = coords[1];
-   coords[6] = coords[2];
-   coords[7] = coords[3];
- 
-   cogl_framebuffer_draw_multitextured_rectangle (fb, pipeline,
-                                                  x1, y1, x2, y2,
-                                                  &coords[0], 8);
- }
+@@ -517,6 +621,8 @@ set_cogl_texture (MetaShapedTexture *stex,
+   if (stex->texture)
+     cogl_object_unref (stex->texture);
  
- static void
- set_cogl_texture (MetaShapedTexture *stex,
-                   CoglTexture       *cogl_tex)
- {
-   MetaShapedTexturePrivate *priv;
-   guint width, height;
- 
-   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
- 
-   priv = stex->priv;
- 
-   if (priv->texture)
-     cogl_object_unref (priv->texture);
- 
-+  g_clear_pointer (&priv->saved_base_surface, cairo_surface_destroy);
++  g_clear_pointer (&stex->saved_base_surface, cairo_surface_destroy);
 +
-   priv->texture = cogl_tex;
+   stex->texture = cogl_tex;
  
    if (cogl_tex != NULL)
-     {
-       cogl_object_ref (cogl_tex);
-       width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
-       height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
-     }
-   else
-     {
-       width = 0;
-       height = 0;
-     }
- 
-   if (priv->tex_width != width ||
-       priv->tex_height != height)
-     {
-       priv->tex_width = width;
-       priv->tex_height = height;
-       meta_shaped_texture_set_mask_texture (stex, NULL);
-       clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
-       g_signal_emit (stex, signals[SIZE_CHANGED], 0);
-     }
- 
-   /* NB: We don't queue a redraw of the actor here because we don't
-    * know how much of the buffer has changed with respect to the
-    * previous buffer. We only queue a redraw in response to surface
-    * damage. */
- 
-   if (priv->create_mipmaps)
-     meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex);
- }
- 
- static void
- do_paint (MetaShapedTexture *stex,
-           CoglFramebuffer   *fb,
-           CoglTexture       *paint_tex,
-           cairo_region_t    *clip_region)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
-   guint tex_width, tex_height;
-   guchar opacity;
+@@ -579,6 +685,10 @@ do_paint (MetaShapedTexture *stex,
    CoglContext *ctx;
    ClutterActorBox alloc;
    CoglPipelineFilter filter;
@@ -506,63 +263,9 @@ index d8c250fc9..8de173bf7 100644
 +  int backing_layer_index;
 +  int mask_layer_index;
  
-   tex_width = priv->tex_width;
-   tex_height = priv->tex_height;
- 
-   if (tex_width == 0 || tex_height == 0) /* no contents yet */
-     return;
- 
-   cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
- 
-   /* Use nearest-pixel interpolation if the texture is unscaled. This
-    * improves performance, especially with software rendering.
-    */
- 
-   filter = COGL_PIPELINE_FILTER_LINEAR;
- 
-   if (meta_actor_painting_untransformed (fb,
-                                          tex_width, tex_height,
-                                          NULL, NULL))
-     filter = COGL_PIPELINE_FILTER_NEAREST;
- 
-   ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
- 
-   opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (stex));
-   clutter_actor_get_allocation_box (CLUTTER_ACTOR (stex), &alloc);
- 
-   cairo_region_t *blended_region;
-   gboolean use_opaque_region = (priv->opaque_region != NULL && opacity == 255);
- 
-   if (use_opaque_region)
-     {
-@@ -420,123 +530,161 @@ do_paint (MetaShapedTexture *stex,
-       else
-         blended_region = cairo_region_create_rectangle (&tex_rect);
- 
-       cairo_region_subtract (blended_region, priv->opaque_region);
-     }
-   else
-     {
-       if (priv->clip_region != NULL)
-         blended_region = cairo_region_reference (priv->clip_region);
-       else
-         blended_region = NULL;
-     }
- 
-   /* Limit to how many separate rectangles we'll draw; beyond this just
-    * fall back and draw the whole thing */
- #define MAX_RECTS 16
- 
-   if (blended_region != NULL)
-     {
-       int n_rects = cairo_region_num_rectangles (blended_region);
-       if (n_rects > MAX_RECTS)
-         {
-           /* Fall back to taking the fully blended path. */
-           use_opaque_region = FALSE;
- 
-           cairo_region_destroy (blended_region);
-           blended_region = NULL;
+   clutter_actor_get_scale (CLUTTER_ACTOR (stex), &tex_scale, NULL);
+   ensure_size_valid (stex);
+@@ -665,6 +775,12 @@ do_paint (MetaShapedTexture *stex,
          }
      }
  
@@ -575,21 +278,7 @@ index d8c250fc9..8de173bf7 100644
    /* First, paint the unblended parts, which are part of the opaque region. */
    if (use_opaque_region)
      {
-       CoglPipeline *opaque_pipeline;
-       cairo_region_t *region;
-       int n_rects;
-       int i;
- 
-       if (priv->clip_region != NULL)
-         {
-           region = cairo_region_copy (priv->clip_region);
-           cairo_region_intersect (region, priv->opaque_region);
-         }
-       else
-         {
-           region = cairo_region_reference (priv->opaque_region);
-         }
- 
+@@ -686,8 +802,24 @@ do_paint (MetaShapedTexture *stex,
        if (!cairo_region_is_empty (region))
          {
            opaque_pipeline = get_unblended_pipeline (stex, ctx);
@@ -598,17 +287,17 @@ index d8c250fc9..8de173bf7 100644
 +          cogl_pipeline_set_layer_texture (opaque_pipeline, main_layer_index, paint_tex);
 +          cogl_pipeline_set_layer_filters (opaque_pipeline, main_layer_index, filter, filter);
 +
-+          if (priv->backing_store)
++          if (stex->backing_store)
 +            {
 +              cogl_pipeline_set_layer_texture (opaque_pipeline,
 +                                               backing_mask_layer_index,
-+                                               priv->backing_store->mask_texture);
++                                               stex->backing_store->mask_texture);
 +              cogl_pipeline_set_layer_filters (opaque_pipeline,
 +                                               backing_mask_layer_index,
 +                                               filter, filter);
 +              cogl_pipeline_set_layer_texture (opaque_pipeline,
 +                                               backing_layer_index,
-+                                               priv->backing_store->texture);
++                                               stex->backing_store->texture);
 +              cogl_pipeline_set_layer_filters (opaque_pipeline,
 +                                               backing_layer_index,
 +                                               filter, filter);
@@ -616,40 +305,13 @@ index d8c250fc9..8de173bf7 100644
  
            n_rects = cairo_region_num_rectangles (region);
            for (i = 0; i < n_rects; i++)
-             {
-               cairo_rectangle_int_t rect;
-               cairo_region_get_rectangle (region, i, &rect);
-               paint_clipped_rectangle (fb, opaque_pipeline, &rect, &alloc);
-             }
-         }
- 
-       cairo_region_destroy (region);
-     }
- 
-   /* Now, go ahead and paint the blended parts. */
- 
-   /* We have three cases:
-    *   1) blended_region has rectangles - paint the rectangles.
-    *   2) blended_region is empty - don't paint anything
-    *   3) blended_region is NULL - paint fully-blended.
-    *
-    *   1) and 3) are the times where we have to paint stuff. This tests
-    *   for 1) and 3).
-    */
-   if (blended_region == NULL || !cairo_region_is_empty (blended_region))
-     {
-       CoglPipeline *blended_pipeline;
- 
-       if (priv->mask_texture == NULL)
-         {
-           blended_pipeline = get_unmasked_pipeline (stex, ctx);
-         }
+@@ -726,12 +858,28 @@ do_paint (MetaShapedTexture *stex,
        else
          {
            blended_pipeline = get_masked_pipeline (stex, ctx);
--          cogl_pipeline_set_layer_texture (blended_pipeline, 1, priv->mask_texture);
+-          cogl_pipeline_set_layer_texture (blended_pipeline, 1, stex->mask_texture);
 -          cogl_pipeline_set_layer_filters (blended_pipeline, 1, filter, filter);
-+          cogl_pipeline_set_layer_texture (blended_pipeline, mask_layer_index, priv->mask_texture);
++          cogl_pipeline_set_layer_texture (blended_pipeline, mask_layer_index, stex->mask_texture);
 +          cogl_pipeline_set_layer_filters (blended_pipeline, mask_layer_index, filter, filter);
          }
  
@@ -658,17 +320,17 @@ index d8c250fc9..8de173bf7 100644
 +      cogl_pipeline_set_layer_texture (blended_pipeline, main_layer_index, paint_tex);
 +      cogl_pipeline_set_layer_filters (blended_pipeline, main_layer_index, filter, filter);
 +
-+      if (priv->backing_store)
++      if (stex->backing_store)
 +        {
 +          cogl_pipeline_set_layer_texture (blended_pipeline,
 +                                           backing_mask_layer_index,
-+                                           priv->backing_store->mask_texture);
++                                           stex->backing_store->mask_texture);
 +          cogl_pipeline_set_layer_filters (blended_pipeline,
 +                                           backing_mask_layer_index,
 +                                           filter, filter);
 +          cogl_pipeline_set_layer_texture (blended_pipeline,
 +                                           backing_layer_index,
-+                                           priv->backing_store->texture);
++                                           stex->backing_store->texture);
 +          cogl_pipeline_set_layer_filters (blended_pipeline,
 +                                           backing_layer_index,
 +                                           filter, filter);
@@ -676,83 +338,15 @@ index d8c250fc9..8de173bf7 100644
  
        CoglColor color;
        cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
-       cogl_pipeline_set_color (blended_pipeline, &color);
- 
-       if (blended_region != NULL)
-         {
-           /* 1) blended_region is not empty. Paint the rectangles. */
-           int i;
-           int n_rects = cairo_region_num_rectangles (blended_region);
- 
-           for (i = 0; i < n_rects; i++)
-             {
-               cairo_rectangle_int_t rect;
-               cairo_region_get_rectangle (blended_region, i, &rect);
- 
-               if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
-                 continue;
- 
-               paint_clipped_rectangle (fb, blended_pipeline, &rect, &alloc);
-             }
-         }
-       else
-         {
-           /* 3) blended_region is NULL. Do a full paint. */
-           cogl_framebuffer_draw_rectangle (fb, blended_pipeline,
-                                            0, 0,
-                                            alloc.x2 - alloc.x1,
-                                            alloc.y2 - alloc.y1);
-         }
-@@ -698,110 +846,173 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
- 					gboolean           create_mipmaps)
- {
-   MetaShapedTexturePrivate *priv;
- 
-   g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
- 
-   priv = stex->priv;
- 
-   create_mipmaps = create_mipmaps != FALSE;
- 
-   if (create_mipmaps != priv->create_mipmaps)
-     {
-       CoglTexture *base_texture;
-       priv->create_mipmaps = create_mipmaps;
-       base_texture = create_mipmaps ? priv->texture : NULL;
-       meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
-     }
- }
- 
- void
- meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
-                                       CoglTexture       *mask_texture)
- {
-   MetaShapedTexturePrivate *priv;
- 
+@@ -925,6 +1073,7 @@ meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
    g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
  
-   priv = stex->priv;
- 
-   g_clear_pointer (&priv->mask_texture, cogl_object_unref);
-+  g_clear_pointer (&priv->saved_mask_surface, cairo_surface_destroy);
+   g_clear_pointer (&stex->mask_texture, cogl_object_unref);
++  g_clear_pointer (&stex->saved_mask_surface, cairo_surface_destroy);
  
    if (mask_texture != NULL)
      {
-       priv->mask_texture = mask_texture;
-       cogl_object_ref (priv->mask_texture);
-     }
- 
-   clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
- }
- 
- gboolean
- meta_shaped_texture_is_obscured (MetaShapedTexture *self)
- {
-   cairo_region_t *unobscured_region = effective_unobscured_region (self);
- 
-   if (unobscured_region)
-     return cairo_region_is_empty (unobscured_region);
-   else
+@@ -946,6 +1095,65 @@ meta_shaped_texture_is_obscured (MetaShapedTexture *stex)
      return FALSE;
  }
  
@@ -803,14 +397,13 @@ index d8c250fc9..8de173bf7 100644
 +shrink_backing_region (MetaShapedTexture           *stex,
 +                       const cairo_rectangle_int_t *area)
 +{
-+  MetaShapedTexturePrivate *priv = stex->priv;
 +  gboolean still_backing_texture;
 +
-+  if (!priv->backing_store)
++  if (!stex->backing_store)
 +    return;
 +
 +  still_backing_texture =
-+      meta_texture_backing_store_shrink (priv->backing_store, area);
++      meta_texture_backing_store_shrink (stex->backing_store, area);
 +
 +  if (!still_backing_texture)
 +    disable_backing_store (stex);
@@ -819,92 +412,16 @@ index d8c250fc9..8de173bf7 100644
  /**
   * meta_shaped_texture_update_area:
   * @stex: #MetaShapedTexture
-  * @x: the x coordinate of the damaged area
-  * @y: the y coordinate of the damaged area
-  * @width: the width of the damaged area
-  * @height: the height of the damaged area
-  *
-  * Repairs the damaged area indicated by @x, @y, @width and @height
-  * and potentially queues a redraw.
-  *
-  * Return value: Whether a redraw have been queued or not
-  */
- gboolean
- meta_shaped_texture_update_area (MetaShapedTexture *stex,
- 				 int                x,
- 				 int                y,
- 				 int                width,
- 				 int                height)
- {
-   MetaShapedTexturePrivate *priv;
-   cairo_region_t *unobscured_region;
-   const cairo_rectangle_int_t clip = { x, y, width, height };
- 
-   priv = stex->priv;
- 
-   if (priv->texture == NULL)
-     return FALSE;
+@@ -1041,6 +1249,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
+                                      &clip);
+     }
  
 +  shrink_backing_region (stex, &clip);
 +
-   meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
- 
-   unobscured_region = effective_unobscured_region (stex);
-   if (unobscured_region)
-     {
-       cairo_region_t *intersection;
- 
-       if (cairo_region_is_empty (unobscured_region))
-         return FALSE;
- 
-       intersection = cairo_region_copy (unobscured_region);
-       cairo_region_intersect_rectangle (intersection, &clip);
- 
-       if (!cairo_region_is_empty (intersection))
-         {
-           cairo_rectangle_int_t damage_rect;
-           cairo_region_get_extents (intersection, &damage_rect);
-           clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &damage_rect);
-           cairo_region_destroy (intersection);
-           return TRUE;
-         }
- 
-       cairo_region_destroy (intersection);
-       return FALSE;
-     }
-   else
-     {
-       clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
-       return TRUE;
-     }
-@@ -892,62 +1103,63 @@ meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
-   priv = stex->priv;
- 
-   if (priv->opaque_region)
-     cairo_region_destroy (priv->opaque_region);
- 
-   if (opaque_region)
-     priv->opaque_region = cairo_region_reference (opaque_region);
-   else
-     priv->opaque_region = NULL;
- }
- 
- cairo_region_t *
- meta_shaped_texture_get_opaque_region (MetaShapedTexture *stex)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
-   return priv->opaque_region;
- }
- 
- static gboolean
- should_get_via_offscreen (MetaShapedTexture *stex)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
- 
-   if (!cogl_texture_is_get_data_supported (priv->texture))
-     return TRUE;
- 
-   return FALSE;
+   meta_texture_tower_update_area (stex->paint_tower,
+                                   clip.x,
+                                   clip.y,
+@@ -1268,8 +1478,9 @@ should_get_via_offscreen (MetaShapedTexture *stex)
  }
  
  static cairo_surface_t *
@@ -914,63 +431,9 @@ index d8c250fc9..8de173bf7 100644
 +                         cairo_rectangle_int_t  *clip,
 +                         CoglTexture           **texture)
  {
-   MetaShapedTexturePrivate *priv = stex->priv;
    ClutterBackend *clutter_backend = clutter_get_default_backend ();
    CoglContext *cogl_context =
-     clutter_backend_get_cogl_context (clutter_backend);
-   CoglTexture *image_texture;
-   GError *error = NULL;
-   CoglOffscreen *offscreen;
-   CoglFramebuffer *fb;
-   CoglMatrix projection_matrix;
-   unsigned int fb_width, fb_height;
-   cairo_rectangle_int_t fallback_clip;
-   CoglColor clear_color;
-   cairo_surface_t *surface;
- 
-   if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_TEXTURE_NPOT))
-     {
-       fb_width = priv->tex_width;
-       fb_height = priv->tex_height;
-     }
-   else
-     {
-       fb_width = clutter_util_next_p2 (priv->tex_width);
-       fb_height = clutter_util_next_p2 (priv->tex_height);
-     }
- 
-   if (!clip)
-     {
-       fallback_clip = (cairo_rectangle_int_t) {
-         .width = priv->tex_width,
-@@ -988,184 +1200,424 @@ get_image_via_offscreen (MetaShapedTexture     *stex,
-       g_error_free (error);
-       cogl_object_unref (fb);
-       return FALSE;
-     }
- 
-   cogl_framebuffer_push_matrix (fb);
-   cogl_matrix_init_identity (&projection_matrix);
-   cogl_matrix_scale (&projection_matrix,
-                      1.0 / (priv->tex_width / 2.0),
-                      -1.0 / (priv->tex_height / 2.0), 0);
-   cogl_matrix_translate (&projection_matrix,
-                          -(priv->tex_width / 2.0),
-                          -(priv->tex_height / 2.0), 0);
- 
-   cogl_framebuffer_set_projection_matrix (fb, &projection_matrix);
- 
-   cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
-   cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
- 
-   do_paint (stex, fb, priv->texture, NULL);
- 
-   cogl_framebuffer_pop_matrix (fb);
- 
-   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-                                         clip->width, clip->height);
-   cogl_framebuffer_read_pixels (fb,
-                                 clip->x, clip->y,
+@@ -1340,9 +1551,29 @@ get_image_via_offscreen (MetaShapedTexture     *stex,
                                  clip->width, clip->height,
                                  CLUTTER_CAIRO_FORMAT_ARGB32,
                                  cairo_image_surface_get_data (surface));
@@ -1001,60 +464,7 @@ index d8c250fc9..8de173bf7 100644
  
    return surface;
  }
- 
- /**
-  * meta_shaped_texture_get_image:
-  * @stex: A #MetaShapedTexture
-  * @clip: A clipping rectangle, to help prevent extra processing.
-  * In the case that the clipping rectangle is partially or fully
-  * outside the bounds of the texture, the rectangle will be clipped.
-  *
-  * Flattens the two layers of the shaped texture into one ARGB32
-  * image by alpha blending the two images, and returns the flattened
-  * image.
-  *
-  * Returns: (transfer full): a new cairo surface to be freed with
-  * cairo_surface_destroy().
-  */
- cairo_surface_t *
- meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-                                cairo_rectangle_int_t *clip)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
-   cairo_rectangle_int_t *transformed_clip = NULL;
-   CoglTexture *texture, *mask_texture;
-   cairo_surface_t *surface;
- 
-   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
- 
-   texture = COGL_TEXTURE (priv->texture);
- 
-   if (texture == NULL)
-     return NULL;
- 
-   if (priv->tex_width == 0 || priv->tex_height == 0)
-     return NULL;
- 
-   if (clip != NULL)
-     {
-       double tex_scale;
-       cairo_rectangle_int_t tex_rect;
- 
-       transformed_clip = alloca (sizeof (cairo_rectangle_int_t));
-       *transformed_clip = *clip;
- 
-       clutter_actor_get_scale (CLUTTER_ACTOR (stex), &tex_scale, NULL);
-       meta_rectangle_scale_double (transformed_clip, 1.0 / tex_scale,
-                                    META_ROUNDING_STRATEGY_GROW);
- 
-       tex_rect = (cairo_rectangle_int_t) {
-         .width = priv->tex_width,
-         .height = priv->tex_height,
-       };
- 
-       if (!meta_rectangle_intersect (&tex_rect, transformed_clip,
-                                      transformed_clip))
-         return NULL;
+@@ -1404,7 +1635,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
      }
  
    if (should_get_via_offscreen (stex))
@@ -1063,60 +473,7 @@ index d8c250fc9..8de173bf7 100644
  
    if (transformed_clip)
      texture = cogl_texture_new_from_sub_texture (texture,
-                                                  transformed_clip->x,
-                                                  transformed_clip->y,
-                                                  transformed_clip->width,
-                                                  transformed_clip->height);
- 
-   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-                                         cogl_texture_get_width (texture),
-                                         cogl_texture_get_height (texture));
- 
-   cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
-                          cairo_image_surface_get_stride (surface),
-                          cairo_image_surface_get_data (surface));
- 
-   cairo_surface_mark_dirty (surface);
- 
-   if (transformed_clip)
-     cogl_object_unref (texture);
- 
-   mask_texture = priv->mask_texture;
-   if (mask_texture != NULL)
-     {
-       cairo_t *cr;
-       cairo_surface_t *mask_surface;
- 
-       if (transformed_clip)
-         mask_texture =
-           cogl_texture_new_from_sub_texture (mask_texture,
-                                              transformed_clip->x,
-                                              transformed_clip->y,
-                                              transformed_clip->width,
-                                              transformed_clip->height);
- 
-       mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
-                                                  cogl_texture_get_width (mask_texture),
-                                                  cogl_texture_get_height (mask_texture));
- 
-       cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
-                              cairo_image_surface_get_stride (mask_surface),
-                              cairo_image_surface_get_data (mask_surface));
- 
-       cairo_surface_mark_dirty (mask_surface);
- 
-       cr = cairo_create (surface);
-       cairo_set_source_surface (cr, mask_surface, 0, 0);
-       cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
-       cairo_paint (cr);
-       cairo_destroy (cr);
- 
-       cairo_surface_destroy (mask_surface);
- 
-       if (transformed_clip)
-         cogl_object_unref (mask_texture);
-     }
- 
+@@ -1465,6 +1696,220 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
    return surface;
  }
  
@@ -1211,11 +568,9 @@ index d8c250fc9..8de173bf7 100644
 +enable_backing_store (MetaShapedTexture *stex,
 +                      CoglTexture       *texture)
 +{
-+  MetaShapedTexturePrivate *priv = stex->priv;
++  g_clear_pointer (&stex->backing_store, meta_texture_backing_store_free);
 +
-+  g_clear_pointer (&priv->backing_store, meta_texture_backing_store_free);
-+
-+  priv->backing_store = meta_texture_backing_store_new (texture);
++  stex->backing_store = meta_texture_backing_store_new (texture);
 +
 +  meta_shaped_texture_reset_pipelines (stex);
 +}
@@ -1223,9 +578,7 @@ index d8c250fc9..8de173bf7 100644
 +static void
 +disable_backing_store (MetaShapedTexture *stex)
 +{
-+  MetaShapedTexturePrivate *priv = stex->priv;
-+
-+  g_clear_pointer (&priv->backing_store, meta_texture_backing_store_free);
++  g_clear_pointer (&stex->backing_store, meta_texture_backing_store_free);
 +
 +  meta_shaped_texture_reset_pipelines (stex);
 +}
@@ -1235,19 +588,18 @@ index d8c250fc9..8de173bf7 100644
 +{
 +
 +  CoglTexture *texture, *mask_texture;
-+  MetaShapedTexturePrivate *priv = stex->priv;
 +  cairo_surface_t *surface;
 +
 +  g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
 +
-+  texture = COGL_TEXTURE (priv->texture);
++  texture = COGL_TEXTURE (stex->texture);
 +
 +  if (texture == NULL)
 +    return;
 +
-+  g_clear_pointer (&priv->saved_base_surface, cairo_surface_destroy);
-+  g_clear_pointer (&priv->saved_mask_surface, cairo_surface_destroy);
-+  g_clear_pointer (&priv->backing_store, meta_texture_backing_store_free);
++  g_clear_pointer (&stex->saved_base_surface, cairo_surface_destroy);
++  g_clear_pointer (&stex->saved_mask_surface, cairo_surface_destroy);
++  g_clear_pointer (&stex->backing_store, meta_texture_backing_store_free);
 +
 +  if (should_get_via_offscreen (stex))
 +    {
@@ -1271,9 +623,9 @@ index d8c250fc9..8de173bf7 100644
 +                             cairo_image_surface_get_data (surface));
 +    }
 +
-+  priv->saved_base_surface = surface;
++  stex->saved_base_surface = surface;
 +
-+  mask_texture = stex->priv->mask_texture;
++  mask_texture = stex->mask_texture;
 +  if (mask_texture != NULL)
 +    {
 +      cairo_surface_t *mask_surface;
@@ -1288,14 +640,13 @@ index d8c250fc9..8de173bf7 100644
 +
 +      cairo_surface_mark_dirty (mask_surface);
 +
-+      priv->saved_mask_surface = mask_surface;
++      stex->saved_mask_surface = mask_surface;
 +    }
 +}
 +
 +void
 +meta_shaped_texture_restore (MetaShapedTexture *stex)
 +{
-+  MetaShapedTexturePrivate *priv = stex->priv;
 +  CoglTexture *texture;
 +  CoglError *error = NULL;
 +
@@ -1304,104 +655,50 @@ index d8c250fc9..8de173bf7 100644
 +  if (texture == NULL)
 +    return;
 +
-+  if (priv->mask_texture)
++  if (stex->mask_texture)
 +    {
-+      if (!cogl_texture_set_data (priv->mask_texture, CLUTTER_CAIRO_FORMAT_ARGB32,
-+                                  cairo_image_surface_get_stride (priv->saved_mask_surface),
-+                                  cairo_image_surface_get_data (priv->saved_mask_surface), 0,
++      if (!cogl_texture_set_data (stex->mask_texture, CLUTTER_CAIRO_FORMAT_ARGB32,
++                                  cairo_image_surface_get_stride (stex->saved_mask_surface),
++                                  cairo_image_surface_get_data (stex->saved_mask_surface), 0,
 +                                  &error))
 +        {
 +          g_warning ("Failed to restore mask texture");
 +          g_clear_pointer (&error, cogl_error_free);
 +        }
-+      g_clear_pointer (&priv->saved_mask_surface, cairo_surface_destroy);
++      g_clear_pointer (&stex->saved_mask_surface, cairo_surface_destroy);
 +    }
 +
 +  /* if the main texture doesn't support direct writes, then
 +   * write to the local backing texture instead, and blend old
 +   * versus new at paint time.
 +   */
-+  if (priv->backing_store)
++  if (stex->backing_store)
 +    {
-+      meta_texture_backing_store_redraw_mask (priv->backing_store);
-+      texture = priv->backing_store->texture;
++      meta_texture_backing_store_redraw_mask (stex->backing_store);
++      texture = stex->backing_store->texture;
 +    }
 +
 +  if (!cogl_texture_set_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
-+                              cairo_image_surface_get_stride (priv->saved_base_surface),
-+                              cairo_image_surface_get_data (priv->saved_base_surface), 0,
++                              cairo_image_surface_get_stride (stex->saved_base_surface),
++                              cairo_image_surface_get_data (stex->saved_base_surface), 0,
 +                              &error))
 +    {
 +      g_warning ("Failed to restore texture");
 +      g_clear_pointer (&error, cogl_error_free);
 +    }
-+  g_clear_pointer (&priv->saved_base_surface, cairo_surface_destroy);
++  g_clear_pointer (&stex->saved_base_surface, cairo_surface_destroy);
 +
 +  clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
 +}
 +
  void
- meta_shaped_texture_set_fallback_size (MetaShapedTexture *self,
-                                        guint              fallback_width,
-                                        guint              fallback_height)
- {
-   MetaShapedTexturePrivate *priv = self->priv;
- 
-   priv->fallback_width = fallback_width;
-   priv->fallback_height = fallback_height;
- }
- 
- static void
- meta_shaped_texture_cull_out (MetaCullable   *cullable,
-                               cairo_region_t *unobscured_region,
-                               cairo_region_t *clip_region)
- {
-   MetaShapedTexture *self = META_SHAPED_TEXTURE (cullable);
-   MetaShapedTexturePrivate *priv = self->priv;
- 
-   set_unobscured_region (self, unobscured_region);
-   set_clip_region (self, clip_region);
- 
-   if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) == 0xff)
-     {
-       if (priv->opaque_region)
-         {
-           if (unobscured_region)
-             cairo_region_subtract (unobscured_region, priv->opaque_region);
-           if (clip_region)
-             cairo_region_subtract (clip_region, priv->opaque_region);
+ meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex,
+                                        int                fallback_width,
 diff --git a/src/meta/meta-shaped-texture.h b/src/meta/meta-shaped-texture.h
-index 80b23f2ea..fc0567c9f 100644
+index c36b8547f..22b4fbd53 100644
 --- a/src/meta/meta-shaped-texture.h
 +++ b/src/meta/meta-shaped-texture.h
-@@ -54,33 +54,35 @@ struct _MetaShapedTextureClass
-  */
- struct _MetaShapedTexture
- {
-   /*< private >*/
-   ClutterActor parent;
- 
-   MetaShapedTexturePrivate *priv;
- };
- 
- GType meta_shaped_texture_get_type (void) G_GNUC_CONST;
- 
- void meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
- 					     gboolean           create_mipmaps);
- 
- gboolean meta_shaped_texture_update_area (MetaShapedTexture *stex,
-                                           int                x,
-                                           int                y,
-                                           int                width,
-                                           int                height);
- 
- CoglTexture * meta_shaped_texture_get_texture (MetaShapedTexture *stex);
- 
- void meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
-                                            CoglTexture       *mask_texture);
- void meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
-                                             cairo_region_t    *opaque_region);
- 
+@@ -66,6 +66,8 @@ META_EXPORT
  cairo_surface_t * meta_shaped_texture_get_image (MetaShapedTexture     *stex,
                                                   cairo_rectangle_int_t *clip);
  
@@ -1411,5 +708,5 @@ index 80b23f2ea..fc0567c9f 100644
  
  #endif /* __META_SHAPED_TEXTURE_H__ */
 -- 
-2.18.1
+2.21.0
 
diff --git a/SOURCES/0009-window-Add-window-id.patch b/SOURCES/0009-window-Add-window-id.patch
deleted file mode 100644
index aa3fceb..0000000
--- a/SOURCES/0009-window-Add-window-id.patch
+++ /dev/null
@@ -1,128 +0,0 @@
-From ca78984a92c84e8684455c80efb5a86c65061f96 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Fri, 21 Sep 2018 17:49:36 +0200
-Subject: [PATCH 09/12] window: Add window id
-
-Generate a unique 64bit window-id which is unrelated to any windowing
-backend.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit bbcb66ddf4f5eeff379f250b361de0366459b4a3)
----
- src/core/display-private.h |  4 ++++
- src/core/display.c         | 32 ++++++++++++++++++++++++++++++++
- src/core/window-private.h  |  1 +
- src/core/window.c          | 16 ++++++++++++++++
- src/meta/window.h          |  2 ++
- 5 files changed, 55 insertions(+)
-
-diff --git a/src/core/display-private.h b/src/core/display-private.h
-index 9e4518b..d24ee00 100644
---- a/src/core/display-private.h
-+++ b/src/core/display-private.h
-@@ -507,4 +507,8 @@ void meta_display_notify_pad_group_switch (MetaDisplay        *display,
-                                            guint               n_mode,
-                                            guint               n_modes);
- 
-+MetaWindow *meta_display_get_window_from_id (MetaDisplay *display,
-+                                             uint64_t     window_id);
-+uint64_t    meta_display_generate_window_id (MetaDisplay *display);
-+
- #endif
-diff --git a/src/core/display.c b/src/core/display.c
-index e7dd453..d09f119 100644
---- a/src/core/display.c
-+++ b/src/core/display.c
-@@ -3269,3 +3269,35 @@ meta_display_notify_pad_group_switch (MetaDisplay        *display,
- 
-   g_string_free (message, TRUE);
- }
-+
-+MetaWindow *
-+meta_display_get_window_from_id (MetaDisplay *display,
-+                                 uint64_t     window_id)
-+{
-+  g_autoptr (GSList) windows = NULL;
-+  GSList *l;
-+
-+  windows = meta_display_list_windows (display, META_LIST_DEFAULT);
-+  for (l = windows; l; l = l->next)
-+    {
-+      MetaWindow *window = l->data;
-+
-+      if (window->id == window_id)
-+        return window;
-+    }
-+
-+  return NULL;
-+}
-+
-+uint64_t
-+meta_display_generate_window_id (MetaDisplay *display)
-+{
-+  static uint64_t base_window_id;
-+  static uint64_t last_window_id;
-+
-+  if (!base_window_id)
-+    base_window_id = g_random_int () + 1;
-+
-+  /* We can overflow here, that's fine */
-+  return (base_window_id + last_window_id++);
-+}
-diff --git a/src/core/window-private.h b/src/core/window-private.h
-index 8552829..0f652b9 100644
---- a/src/core/window-private.h
-+++ b/src/core/window-private.h
-@@ -153,6 +153,7 @@ struct _MetaWindow
- 
-   MetaDisplay *display;
-   MetaScreen *screen;
-+  uint64_t id;
-   guint64 stamp;
-   MetaLogicalMonitor *monitor;
-   MetaWorkspace *workspace;
-diff --git a/src/core/window.c b/src/core/window.c
-index a1f4aa4..00b2e4d 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -1142,6 +1142,8 @@ _meta_window_shared_new (MetaDisplay         *display,
-       window->has_resize_func = FALSE;
-     }
- 
-+  window->id = meta_display_generate_window_id (display);
-+
-   META_WINDOW_GET_CLASS (window)->manage (window);
- 
-   if (!window->override_redirect)
-@@ -8466,3 +8468,17 @@ meta_window_is_stackable (MetaWindow *window)
- {
-   return META_WINDOW_GET_CLASS (window)->is_stackable (window);
- }
-+
-+/**
-+ * meta_window_get_id:
-+ * @window: a #MetaWindow
-+ *
-+ * Returns the window id associated with window.
-+ *
-+ * Returns: (transfer none): The window id
-+ */
-+uint64_t
-+meta_window_get_id (MetaWindow *window)
-+{
-+  return window->id;
-+}
-diff --git a/src/meta/window.h b/src/meta/window.h
-index 09317e6..364d541 100644
---- a/src/meta/window.h
-+++ b/src/meta/window.h
-@@ -260,4 +260,6 @@ gboolean meta_window_is_client_decorated (MetaWindow *window);
- gboolean meta_window_titlebar_is_onscreen    (MetaWindow *window);
- void     meta_window_shove_titlebar_onscreen (MetaWindow *window);
- 
-+uint64_t meta_window_get_id (MetaWindow *window);
-+
- #endif
--- 
-2.19.2
-
diff --git a/SOURCES/0010-screen-cast-session-Add-window-id-support.patch b/SOURCES/0010-screen-cast-session-Add-window-id-support.patch
deleted file mode 100644
index 4324078..0000000
--- a/SOURCES/0010-screen-cast-session-Add-window-id-support.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From 4487b25d277e9ef73b464eb6e2e8971e4e5b13ae Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Mon, 15 Oct 2018 12:08:29 +0200
-Subject: [PATCH 10/12] screen-cast-session: Add window-id support
-
-Use the "window-id" property to select the window to cast using
-RecordWindow.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit c786b6c13cf9cb1bb9d7f7d2ca0ead0bf28a5fcd)
----
- src/backends/meta-screen-cast-session.c | 19 ++++++++++++++++++-
- src/org.gnome.Mutter.ScreenCast.xml     |  5 ++++-
- 2 files changed, 22 insertions(+), 2 deletions(-)
-
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index 3ee02c5..d0f5a79 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -340,6 +340,7 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
-   MetaWindow *window;
-   GError *error = NULL;
-   MetaDisplay *display;
-+  GVariant *window_id_variant = NULL;
-   MetaScreenCastWindowStream *window_stream;
-   MetaScreenCastStream *stream;
-   char *stream_path;
-@@ -352,8 +353,24 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
-       return TRUE;
-     }
- 
-+  if (properties_variant)
-+    window_id_variant = g_variant_lookup_value (properties_variant,
-+                                                "window-id",
-+                                                G_VARIANT_TYPE ("t"));
-+
-   display = meta_get_display ();
--  window = meta_display_get_focus_window (display);
-+  if (window_id_variant)
-+    {
-+      uint64_t window_id;
-+
-+      g_variant_get (window_id_variant, "t", &window_id);
-+      window = meta_display_get_window_from_id (display, window_id);
-+    }
-+  else
-+    {
-+      window = meta_display_get_focus_window (display);
-+    }
-+
-   if (!window)
-     {
-       g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
-diff --git a/src/org.gnome.Mutter.ScreenCast.xml b/src/org.gnome.Mutter.ScreenCast.xml
-index 6134556..3cd02b6 100644
---- a/src/org.gnome.Mutter.ScreenCast.xml
-+++ b/src/org.gnome.Mutter.ScreenCast.xml
-@@ -86,7 +86,10 @@
- 
- 	Record a single window.
- 
--	Available @properties include: (none)
-+	Available @properties include:
-+
-+	* "window-id" (t): Id of the window to record.
-+
-     -->
-     <method name="RecordWindow">
-       <arg name="properties" type="a{sv}" direction="in" />
--- 
-2.19.2
-
diff --git a/SOURCES/0011-window-Expose-the-client-type-in-the-API.patch b/SOURCES/0011-window-Expose-the-client-type-in-the-API.patch
deleted file mode 100644
index 33a3216..0000000
--- a/SOURCES/0011-window-Expose-the-client-type-in-the-API.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From bc7d794d3a605342f384e2ff13ab241a5eb2f468 Mon Sep 17 00:00:00 2001
-From: Olivier Fourdan <ofourdan@redhat.com>
-Date: Wed, 12 Dec 2018 13:05:21 +0100
-Subject: [PATCH 11/12] window: Expose the client type in the API
-
-We already have the enum exposed, but no accessor function.
-
-Add `meta_window_get_client_type()` which returns the
-`MetaWindowClientType` of a window.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
-(cherry picked from commit 7a5e0c78244b31052edfe3ea4ce1a1f48c94f93f)
----
- src/core/window.c | 14 ++++++++++++++
- src/meta/window.h |  2 ++
- 2 files changed, 16 insertions(+)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index 00b2e4d..4dd8bd6 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -8482,3 +8482,17 @@ meta_window_get_id (MetaWindow *window)
- {
-   return window->id;
- }
-+
-+/**
-+ * meta_window_get_client_type:
-+ * @window: a #MetaWindow
-+ *
-+ * Returns the #MetaWindowClientType of the window.
-+ *
-+ * Returns: (transfer none): The root ancestor window
-+ */
-+MetaWindowClientType
-+meta_window_get_client_type (MetaWindow *window)
-+{
-+  return window->client_type;
-+}
-diff --git a/src/meta/window.h b/src/meta/window.h
-index 364d541..8a56afc 100644
---- a/src/meta/window.h
-+++ b/src/meta/window.h
-@@ -262,4 +262,6 @@ void     meta_window_shove_titlebar_onscreen (MetaWindow *window);
- 
- uint64_t meta_window_get_id (MetaWindow *window);
- 
-+MetaWindowClientType meta_window_get_client_type (MetaWindow *window);
-+
- #endif
--- 
-2.19.2
-
diff --git a/SOURCES/0012-window-Fix-introspection-warnings.patch b/SOURCES/0012-window-Fix-introspection-warnings.patch
deleted file mode 100644
index 845931f..0000000
--- a/SOURCES/0012-window-Fix-introspection-warnings.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 527f6e642a0ece477ae3a2c43421ad4101e34c57 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 14 Dec 2018 15:55:36 +0100
-Subject: [PATCH 12/12] window: Fix introspection warnings
-
-(transfer none) was added for fundamental types, which can't be
-transfered.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/356
-(cherry picked from commit 781ec74fd2bb505de7abde6e0641a62ab6ef728a)
----
- src/core/window.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/core/window.c b/src/core/window.c
-index 4dd8bd6..c79d266 100644
---- a/src/core/window.c
-+++ b/src/core/window.c
-@@ -8475,7 +8475,7 @@ meta_window_is_stackable (MetaWindow *window)
-  *
-  * Returns the window id associated with window.
-  *
-- * Returns: (transfer none): The window id
-+ * Returns: The window id
-  */
- uint64_t
- meta_window_get_id (MetaWindow *window)
-@@ -8489,7 +8489,7 @@ meta_window_get_id (MetaWindow *window)
-  *
-  * Returns the #MetaWindowClientType of the window.
-  *
-- * Returns: (transfer none): The root ancestor window
-+ * Returns: The root ancestor window
-  */
- MetaWindowClientType
- meta_window_get_client_type (MetaWindow *window)
--- 
-2.19.2
-
diff --git a/SOURCES/add-support-for-plain-old-x-device-configuration.patch b/SOURCES/add-support-for-plain-old-x-device-configuration.patch
index 003fe08..beefaf2 100644
--- a/SOURCES/add-support-for-plain-old-x-device-configuration.patch
+++ b/SOURCES/add-support-for-plain-old-x-device-configuration.patch
@@ -1,4 +1,4 @@
-From 210dfadcf0a2ae99bf4e2846118e4b22887551b8 Mon Sep 17 00:00:00 2001
+From 3f7ba6739773f43a3ad2a5d26cb8c3365f77cc00 Mon Sep 17 00:00:00 2001
 From: Rui Matos <tiagomatos@gmail.com>
 Date: Mon, 9 Oct 2017 18:39:52 +0200
 Subject: [PATCH 1/3] backends/x11: Add a synaptics check for two finger scroll
@@ -13,10 +13,10 @@ isn't.
  1 file changed, 11 insertions(+)
 
 diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
-index 1d84dfccf..5a82edbe6 100644
+index 051a1c605..887bc8b42 100644
 --- a/src/backends/x11/meta-input-settings-x11.c
 +++ b/src/backends/x11/meta-input-settings-x11.c
-@@ -625,6 +625,17 @@ meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings  *settings,
+@@ -630,6 +630,17 @@ meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings  *settings,
    guchar *available = NULL;
    gboolean has_two_finger = TRUE;
  
@@ -35,10 +35,10 @@ index 1d84dfccf..5a82edbe6 100644
                              XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
    if (!available || !available[SCROLL_METHOD_FIELD_2FG])
 -- 
-2.20.1
+2.21.0
 
 
-From e2b5d9c65699ace1f00273bb9860a0fe66f662ee Mon Sep 17 00:00:00 2001
+From 717561b28f35e05d40fb941baba781436a0abf68 Mon Sep 17 00:00:00 2001
 From: Rui Matos <tiagomatos@gmail.com>
 Date: Mon, 9 Oct 2017 18:55:56 +0200
 Subject: [PATCH 2/3] backends/x11: Add disable while typing support for
@@ -51,7 +51,7 @@ syndaemon when the synaptics driver is being used.
  1 file changed, 112 insertions(+)
 
 diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
-index 5a82edbe6..33abd0c72 100644
+index 887bc8b42..12a592c75 100644
 --- a/src/backends/x11/meta-input-settings-x11.c
 +++ b/src/backends/x11/meta-input-settings-x11.c
 @@ -35,6 +35,9 @@
@@ -62,9 +62,9 @@ index 5a82edbe6..33abd0c72 100644
 +#include <sys/prctl.h>
 +#endif
  
- #include <meta/errors.h>
  #include "backends/meta-logical-monitor.h"
-@@ -44,6 +47,8 @@ typedef struct _MetaInputSettingsX11Private
+ #include "backends/x11/meta-backend-x11.h"
+@@ -46,6 +49,8 @@ typedef struct _MetaInputSettingsX11Private
  #ifdef HAVE_LIBGUDEV
    GUdevClient *udev_client;
  #endif
@@ -73,7 +73,7 @@ index 5a82edbe6..33abd0c72 100644
  } MetaInputSettingsX11Private;
  
  G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
-@@ -332,6 +337,107 @@ change_synaptics_speed (ClutterInputDevice *device,
+@@ -337,6 +342,107 @@ change_synaptics_speed (ClutterInputDevice *device,
    XCloseDevice (xdisplay, xdevice);
  }
  
@@ -142,12 +142,12 @@ index 5a82edbe6..33abd0c72 100644
 +
 +      args = g_ptr_array_new ();
 +
-+      g_ptr_array_add (args, "syndaemon");
-+      g_ptr_array_add (args, "-i");
-+      g_ptr_array_add (args, "1.0");
-+      g_ptr_array_add (args, "-t");
-+      g_ptr_array_add (args, "-K");
-+      g_ptr_array_add (args, "-R");
++      g_ptr_array_add (args, (gpointer)"syndaemon");
++      g_ptr_array_add (args, (gpointer)"-i");
++      g_ptr_array_add (args, (gpointer)"1.0");
++      g_ptr_array_add (args, (gpointer)"-t");
++      g_ptr_array_add (args, (gpointer)"-K");
++      g_ptr_array_add (args, (gpointer)"-R");
 +      g_ptr_array_add (args, NULL);
 +
 +      /* we must use G_SPAWN_DO_NOT_REAP_CHILD to avoid
@@ -181,7 +181,7 @@ index 5a82edbe6..33abd0c72 100644
  static void
  meta_input_settings_x11_set_send_events (MetaInputSettings        *settings,
                                           ClutterInputDevice       *device,
-@@ -456,6 +562,12 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings  *settings,
+@@ -461,6 +567,12 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings  *settings,
  {
    guchar value = (enabled) ? 1 : 0;
  
@@ -195,10 +195,10 @@ index 5a82edbe6..33abd0c72 100644
                     XA_INTEGER, 8, &value, 1);
  }
 -- 
-2.20.1
+2.21.0
 
 
-From 8c1d608c499a2038b0715f9cbf37e1bba87ef6e1 Mon Sep 17 00:00:00 2001
+From 0afa6d0940ca4f5ffafd24effd2c414963a44277 Mon Sep 17 00:00:00 2001
 From: Rui Matos <tiagomatos@gmail.com>
 Date: Tue, 10 Oct 2017 19:07:27 +0200
 Subject: [PATCH 3/3] backends/x11: Support plain old X device configuration
@@ -210,10 +210,10 @@ bits specific for xorg-x11-drv-evdev devices.
  1 file changed, 74 insertions(+), 23 deletions(-)
 
 diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
-index 33abd0c72..906f504f8 100644
+index 12a592c75..80e5ed10e 100644
 --- a/src/backends/x11/meta-input-settings-x11.c
 +++ b/src/backends/x11/meta-input-settings-x11.c
-@@ -179,35 +179,35 @@ is_device_synaptics (ClutterInputDevice *device)
+@@ -182,36 +182,36 @@ is_device_synaptics (ClutterInputDevice *device)
    return TRUE;
  }
  
@@ -239,6 +239,7 @@ index 33abd0c72..906f504f8 100644
 +                             gboolean            left_handed)
  {
    MetaDisplay *display = meta_get_display ();
+   MetaX11Display *x11_display = display ? display->x11_display : NULL;
    MetaBackend *backend = meta_get_backend ();
    Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
    XDevice *xdevice;
@@ -263,12 +264,12 @@ index 33abd0c72..906f504f8 100644
 -                   XA_INTEGER, 8, tap_action, 7);
 -  meta_XFree (tap_action);
 -
-   if (display)
-     meta_error_trap_push (display);
+   if (x11_display)
+     meta_x11_error_trap_push (x11_display);
    buttons = g_new (guchar, buttons_capacity);
-@@ -231,17 +231,39 @@ change_synaptics_tap_left_handed (ClutterInputDevice *device,
+@@ -235,17 +235,39 @@ change_synaptics_tap_left_handed (ClutterInputDevice *device,
  
-   if (display && meta_error_trap_pop_with_return (display))
+   if (x11_display && meta_x11_error_trap_pop_with_return (x11_display))
      {
 -      g_warning ("Could not set synaptics touchpad left-handed for %s",
 +      g_warning ("Could not set left-handed for %s",
@@ -309,8 +310,8 @@ index 33abd0c72..906f504f8 100644
 +                       gdouble             speed)
  {
    MetaDisplay *display = meta_get_display ();
-   MetaBackend *backend = meta_get_backend ();
-@@ -337,6 +359,23 @@ change_synaptics_speed (ClutterInputDevice *device,
+   MetaX11Display *x11_display = display ? display->x11_display : NULL;
+@@ -342,6 +364,23 @@ change_synaptics_speed (ClutterInputDevice *device,
    XCloseDevice (xdisplay, xdevice);
  }
  
@@ -334,7 +335,7 @@ index 33abd0c72..906f504f8 100644
  /* Ensure that syndaemon dies together with us, to avoid running several of
   * them */
  static void
-@@ -505,9 +544,10 @@ meta_input_settings_x11_set_speed (MetaInputSettings  *settings,
+@@ -510,9 +549,10 @@ meta_input_settings_x11_set_speed (MetaInputSettings  *settings,
    Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
    gfloat value = speed;
  
@@ -347,11 +348,11 @@ index 33abd0c72..906f504f8 100644
        return;
      }
  
-@@ -549,6 +589,11 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings  *settings,
+@@ -554,6 +594,11 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings  *settings,
            g_object_unref (settings);
            return;
          }
-+      else if (!is_device_libinput (device))
++      else if (!is_device_libinput (device) && device_type != CLUTTER_PAD_DEVICE)
 +        {
 +          change_x_device_left_handed (device, enabled);
 +          return;
@@ -359,7 +360,7 @@ index 33abd0c72..906f504f8 100644
  
        change_property (device, "libinput Left Handed Enabled",
                         XA_INTEGER, 8, &value, 1);
-@@ -762,6 +807,12 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings  *settings,
+@@ -767,6 +812,12 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings  *settings,
                                             ClutterInputDevice *device,
                                             guint               button)
  {
@@ -373,5 +374,5 @@ index 33abd0c72..906f504f8 100644
                     XA_INTEGER, 32, &button, 1);
  }
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/covscan-fixes.patch b/SOURCES/covscan-fixes.patch
new file mode 100644
index 0000000..25bfe3c
--- /dev/null
+++ b/SOURCES/covscan-fixes.patch
@@ -0,0 +1,246 @@
+From 55417eea4294210495eceebd6dd4b832f371f054 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= <verdre@v0yd.nl>
+Date: Sun, 14 Apr 2019 17:15:06 +0200
+Subject: [PATCH 1/5] display: Fix a possible bug in
+ meta_display_sync_wayland_focus
+
+The check for the focus xwindow is called, but not used. Fix that by
+renaming the variable to reflect better what it does and actually using
+the return value of the check.
+
+This was the original intention of the author in commit
+05899596d10918df5359d89baa82e6fedd0ae208 and got broken in commit
+8e7e1eeef59c4f74046e6783b6334c1432255c5a.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/535
+---
+ src/core/display.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/core/display.c b/src/core/display.c
+index 0de99edb2..4c8907f40 100644
+--- a/src/core/display.c
++++ b/src/core/display.c
+@@ -1208,15 +1208,15 @@ meta_display_sync_wayland_input_focus (MetaDisplay *display)
+   MetaWindow *focus_window = NULL;
+   MetaBackend *backend = meta_get_backend ();
+   MetaStage *stage = META_STAGE (meta_backend_get_stage (backend));
+-  gboolean is_focus_xwindow = FALSE;
++  gboolean is_no_focus_xwindow = FALSE;
+ 
+   if (display->x11_display)
+-    meta_x11_display_xwindow_is_a_no_focus_window (display->x11_display,
+-                                                   display->x11_display->focus_xwindow);
++    is_no_focus_xwindow = meta_x11_display_xwindow_is_a_no_focus_window (display->x11_display,
++                                                                         display->x11_display->focus_xwindow);
+ 
+   if (!meta_display_windows_are_interactable (display))
+     focus_window = NULL;
+-  else if (is_focus_xwindow)
++  else if (is_no_focus_xwindow)
+     focus_window = NULL;
+   else if (display->focus_window && display->focus_window->surface)
+     focus_window = display->focus_window;
+-- 
+2.21.0
+
+
+From 17cc0a2a21c504b8631bf2ce0f508f611f9b1d3e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 20:03:25 +0000
+Subject: [PATCH 2/5] renderer-x11-nested: Fix copy-and-paste error
+
+The rounding added in commit c5471e5b8b1 mixed up some variables,
+whoops.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/598
+---
+ src/backends/x11/nested/meta-renderer-x11-nested.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c b/src/backends/x11/nested/meta-renderer-x11-nested.c
+index 71a85a8c2..5000bf357 100644
+--- a/src/backends/x11/nested/meta-renderer-x11-nested.c
++++ b/src/backends/x11/nested/meta-renderer-x11-nested.c
+@@ -203,7 +203,7 @@ meta_renderer_x11_nested_create_view (MetaRenderer       *renderer,
+       height = logical_monitor->rect.height;
+     }
+   width = roundf (width * view_scale);
+-  height = roundf (width * view_scale);
++  height = roundf (height * view_scale);
+ 
+   fake_onscreen = create_offscreen (cogl_context, width, height);
+ 
+-- 
+2.21.0
+
+
+From a58fabbb0e3173359d3374b931815c21ce65032d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 19:59:53 +0000
+Subject: [PATCH 3/5] input-mapper: Remove unnecessary return value
+
+Since commit ae6d9e35bd, there is a fallback to META_MATCH_IS_BUILTIN,
+so the condition for returning FALSE is never met.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/598
+---
+ src/backends/meta-input-mapper.c | 15 +++------------
+ 1 file changed, 3 insertions(+), 12 deletions(-)
+
+diff --git a/src/backends/meta-input-mapper.c b/src/backends/meta-input-mapper.c
+index acc9b1618..fc4f3bd59 100644
+--- a/src/backends/meta-input-mapper.c
++++ b/src/backends/meta-input-mapper.c
+@@ -353,7 +353,7 @@ find_builtin_output (MetaInputMapper  *mapper,
+   return panel != NULL;
+ }
+ 
+-static gboolean
++static void
+ guess_candidates (MetaInputMapper     *mapper,
+                   MetaMapperInputInfo *input,
+                   DeviceCandidates    *info)
+@@ -387,15 +387,7 @@ guess_candidates (MetaInputMapper     *mapper,
+       find_builtin_output (mapper, &info->candidates[META_MATCH_IS_BUILTIN]);
+     }
+ 
+-  if (best < N_OUTPUT_MATCHES)
+-    {
+-      info->best = best;
+-      return TRUE;
+-    }
+-  else
+-    {
+-      return FALSE;
+-    }
++  info->best = best;
+ }
+ 
+ static void
+@@ -408,8 +400,7 @@ mapping_helper_add (MappingHelper       *helper,
+ 
+   info.input = input;
+ 
+-  if (!guess_candidates (mapper, input, &info))
+-    return;
++  guess_candidates (mapper, input, &info);
+ 
+   for (i = 0; i < helper->device_maps->len; i++)
+     {
+-- 
+2.21.0
+
+
+From 4eb025cf36a9118cc496ae9143ee2eb510b6228c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 20:22:50 +0000
+Subject: [PATCH 4/5] workspace-manager: Remove unnecessary assignment
+
+The initialization to -1 is never used, instead the variables are
+re-initialized to 0 before the loop that uses them.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/598
+---
+ src/core/meta-workspace-manager.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/src/core/meta-workspace-manager.c b/src/core/meta-workspace-manager.c
+index af7344709..8e1f03fe8 100644
+--- a/src/core/meta-workspace-manager.c
++++ b/src/core/meta-workspace-manager.c
+@@ -600,8 +600,6 @@ meta_workspace_manager_calc_workspace_layout (MetaWorkspaceManager *workspace_ma
+ 
+   grid = g_new (int, grid_area);
+ 
+-  current_row = -1;
+-  current_col = -1;
+   i = 0;
+ 
+   switch (workspace_manager->starting_corner)
+-- 
+2.21.0
+
+
+From a854a337ac8807f310ac2c474f9be290089f79f3 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 20:43:21 +0000
+Subject: [PATCH 5/5] x11-display: Simplify bell handling
+
+Since commit 956ab4bd made libcanberra mandatory, we never use
+the system bell for handling the `audible-bell` setting. So
+instead of reacting to settings changes with the exact same call
+to XkbChangeEnabledControls(), just call it once when initializing.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/598
+---
+ src/x11/meta-x11-display.c | 39 +++++++-------------------------------
+ 1 file changed, 7 insertions(+), 32 deletions(-)
+
+diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
+index 8ce12b994..065ffcdda 100644
+--- a/src/x11/meta-x11-display.c
++++ b/src/x11/meta-x11-display.c
+@@ -463,6 +463,13 @@ init_x11_bell (MetaX11Display *x11_display)
+                                    &mask);
+         }
+     }
++
++  /* We are playing sounds using libcanberra support, we handle the
++   * bell whether its an audible bell or a visible bell */
++  XkbChangeEnabledControls (x11_display->xdisplay,
++                            XkbUseCoreKbd,
++                            XkbAudibleBellMask,
++                            0);
+ }
+ 
+ /*
+@@ -480,32 +487,6 @@ shutdown_x11_bell (MetaX11Display *x11_display)
+                             XkbAudibleBellMask);
+ }
+ 
+-/*
+- * Turns the bell to audible or visual. This tells X what to do, but
+- * not Mutter; you will need to set the "visual bell" pref for that.
+- */
+-static void
+-set_x11_bell_is_audible (MetaX11Display *x11_display,
+-                         gboolean is_audible)
+-{
+-  /* When we are playing sounds using libcanberra support, we handle the
+-   * bell whether its an audible bell or a visible bell */
+-  gboolean enable_system_bell = FALSE;
+-
+-  XkbChangeEnabledControls (x11_display->xdisplay,
+-                            XkbUseCoreKbd,
+-                            XkbAudibleBellMask,
+-                            enable_system_bell ? XkbAudibleBellMask : 0);
+-}
+-
+-static void
+-on_is_audible_changed (MetaBell       *bell,
+-                       gboolean        is_audible,
+-                       MetaX11Display *x11_display)
+-{
+-  set_x11_bell_is_audible (x11_display, is_audible);
+-}
+-
+ static void
+ set_desktop_geometry_hint (MetaX11Display *x11_display)
+ {
+@@ -1320,12 +1301,6 @@ meta_x11_display_new (MetaDisplay *display, GError **error)
+ 
+   init_x11_bell (x11_display);
+ 
+-  g_signal_connect_object (display->bell, "is-audible-changed",
+-                           G_CALLBACK (on_is_audible_changed),
+-                           x11_display, 0);
+-
+-  set_x11_bell_is_audible (x11_display, meta_prefs_bell_is_audible ());
+-
+   meta_x11_startup_notification_init (x11_display);
+ 
+   return x11_display;
+-- 
+2.21.0
+
diff --git a/SOURCES/deal-more-gracefully-with-oversized-windows.patch b/SOURCES/deal-more-gracefully-with-oversized-windows.patch
index 0e8807a..9a7a36d 100644
--- a/SOURCES/deal-more-gracefully-with-oversized-windows.patch
+++ b/SOURCES/deal-more-gracefully-with-oversized-windows.patch
@@ -1,4 +1,4 @@
-From af23f59757579b26296f967395c6e0ae1547a6c7 Mon Sep 17 00:00:00 2001
+From 575490895047e0709bc84826fe6d6a73028d7bbc Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
 Date: Wed, 12 Mar 2014 02:04:13 +0100
 Subject: [PATCH] constraints: Enforce X11 size limits
@@ -10,10 +10,10 @@ to keep insanely huge windows from crashing the WM.
  1 file changed, 42 insertions(+)
 
 diff --git a/src/core/constraints.c b/src/core/constraints.c
-index 57cfb73ed..026dd82c0 100644
+index 117131b15..379372245 100644
 --- a/src/core/constraints.c
 +++ b/src/core/constraints.c
-@@ -106,6 +106,7 @@ typedef enum
+@@ -109,6 +109,7 @@ typedef enum
    PRIORITY_TITLEBAR_VISIBLE = 4,
    PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
    PRIORITY_CUSTOM_RULE = 4,
@@ -21,7 +21,7 @@ index 57cfb73ed..026dd82c0 100644
    PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
  } ConstraintPriority;
  
-@@ -196,6 +197,10 @@ static gboolean constrain_partially_onscreen (MetaWindow         *window,
+@@ -201,6 +202,10 @@ static gboolean constrain_partially_onscreen (MetaWindow         *window,
                                                ConstraintInfo     *info,
                                                ConstraintPriority  priority,
                                                gboolean            check_only);
@@ -32,7 +32,7 @@ index 57cfb73ed..026dd82c0 100644
  
  static void setup_constraint_info        (ConstraintInfo      *info,
                                            MetaWindow          *window,
-@@ -231,6 +236,7 @@ static const Constraint all_constraints[] = {
+@@ -236,6 +241,7 @@ static const Constraint all_constraints[] = {
    {constrain_fully_onscreen,     "constrain_fully_onscreen"},
    {constrain_titlebar_visible,   "constrain_titlebar_visible"},
    {constrain_partially_onscreen, "constrain_partially_onscreen"},
@@ -40,7 +40,7 @@ index 57cfb73ed..026dd82c0 100644
    {NULL,                         NULL}
  };
  
-@@ -1675,3 +1681,39 @@ constrain_partially_onscreen (MetaWindow         *window,
+@@ -1780,3 +1786,39 @@ constrain_partially_onscreen (MetaWindow         *window,
  
    return retval;
  }
@@ -81,5 +81,5 @@ index 57cfb73ed..026dd82c0 100644
 +  return TRUE;
 +}
 -- 
-2.20.1
+2.21.0
 
diff --git a/SOURCES/eglstream-mailbox-mode.patch b/SOURCES/eglstream-mailbox-mode.patch
deleted file mode 100644
index 3c48d20..0000000
--- a/SOURCES/eglstream-mailbox-mode.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 6cfab9d2140aecff2f7e267bfb97c810c38823f2 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 11 Jan 2019 16:05:09 +0100
-Subject: [PATCH 1/2] renderer/native: Make EGLStream page flip errors
- non-fatal
-
-Just continue rendering; we don't care if we were busy once, as it'll most
-likely work when we flip the next time.
----
- src/backends/native/meta-renderer-native.c | 8 +-------
- 1 file changed, 1 insertion(+), 7 deletions(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index 470da8845..130ca5268 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -96,8 +96,6 @@ typedef struct _MetaRendererNativeGpuData
- #ifdef HAVE_EGL_DEVICE
-   struct {
-     EGLDeviceEXT device;
--
--    gboolean no_egl_output_drm_flip_event;
-   } egl;
- #endif
- 
-@@ -1293,8 +1291,6 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
-   renderer_gpu_data =
-     meta_renderer_native_get_gpu_data (onscreen_native->renderer_native,
-                                        onscreen_native->render_gpu);
--  if (renderer_gpu_data->egl.no_egl_output_drm_flip_event)
--    return FALSE;
- 
-   closure_container =
-     meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu, flip_closure);
-@@ -1315,9 +1311,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
-       if (error->domain != META_EGL_ERROR ||
-           error->code != EGL_RESOURCE_BUSY_EXT)
-         {
--          g_warning ("Failed to flip EGL stream (%s), relying on clock from "
--                     "now on", error->message);
--          renderer_gpu_data->egl.no_egl_output_drm_flip_event = TRUE;
-+          g_warning ("Failed to flip EGL stream: %s", error->message);
-         }
-       g_error_free (error);
-       meta_gpu_kms_flip_closure_container_free (closure_container);
--- 
-2.19.2
-
-
-From 7c22e8434348b16ff433494026a69d2892f3e48d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 11 Jan 2019 16:03:37 +0100
-Subject: [PATCH 2/2] renderer/native: Make the EGLStreams operate in mailbox
- mode
-
-This means eglSwapBuffers() wont dead lock if there is an old buffer pending
-page flip. This could happen after e.g. mode changes or for other reasons.
----
- src/backends/native/meta-renderer-native.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
-index 130ca5268..af5693b6e 100644
---- a/src/backends/native/meta-renderer-native.c
-+++ b/src/backends/native/meta-renderer-native.c
-@@ -2122,7 +2122,7 @@ meta_renderer_native_create_surface_egl_device (CoglOnscreen       *onscreen,
-   EGLOutputLayerEXT output_layer;
-   EGLAttrib output_attribs[3];
-   EGLint stream_attribs[] = {
--    EGL_STREAM_FIFO_LENGTH_KHR, 1,
-+    EGL_STREAM_FIFO_LENGTH_KHR, 0,
-     EGL_CONSUMER_AUTO_ACQUIRE_EXT, EGL_FALSE,
-     EGL_NONE
-   };
--- 
-2.19.2
-
diff --git a/SOURCES/fix-text-selection-drawing.patch b/SOURCES/fix-text-selection-drawing.patch
new file mode 100644
index 0000000..11554aa
--- /dev/null
+++ b/SOURCES/fix-text-selection-drawing.patch
@@ -0,0 +1,138 @@
+From 30d6e3abe2a0251b11513d66d15a59cd0705a828 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 17:48:41 +0000
+Subject: [PATCH 1/2] clutter-text: Fix selection color drawing
+
+Commit cabcad185 removed the call to cogl_set_source_color4ub() before
+cogl_fill_path(), so instead of the previously assigned selection color,
+the background is drawn with the last set source.
+
+In order to honour the newly added framebuffer parameter and still apply
+the correct color, switch from cogl_fill_path() to the (deprecated!)
+cogl_framebuffer_fill_path() method.
+
+https://gitlab.gnome.org/GNOME/mutter/issues/494
+---
+ clutter/clutter/clutter-text.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/clutter/clutter/clutter-text.c b/clutter/clutter/clutter-text.c
+index fb9d926df..000bbbbd4 100644
+--- a/clutter/clutter/clutter-text.c
++++ b/clutter/clutter/clutter-text.c
+@@ -1975,6 +1975,7 @@ selection_paint (ClutterText     *self,
+   else
+     {
+       /* Paint selection background first */
++      CoglPipeline *color_pipeline = cogl_pipeline_copy (default_color_pipeline);
+       PangoLayout *layout = clutter_text_get_layout (self);
+       CoglPath *selection_path = cogl_path_new ();
+       CoglColor cogl_color = { 0, };
+@@ -1987,11 +1988,19 @@ selection_paint (ClutterText     *self,
+       else
+         color = &priv->text_color;
+ 
++      cogl_color_init_from_4ub (&cogl_color,
++                                color->red,
++                                color->green,
++                                color->blue,
++                                paint_opacity * color->alpha / 255);
++      cogl_color_premultiply (&cogl_color);
++      cogl_pipeline_set_color (color_pipeline, &cogl_color);
++
+       clutter_text_foreach_selection_rectangle_prescaled (self,
+                                                           add_selection_rectangle_to_path,
+                                                           selection_path);
+ 
+-      cogl_path_fill (selection_path);
++      cogl_framebuffer_fill_path (fb, color_pipeline, selection_path);
+ 
+       /* Paint selected text */
+       cogl_framebuffer_push_path_clip (fb, selection_path);
+-- 
+2.21.0
+
+
+From 13a1624c1050c91cd4d8a298f7a10fafe56fe9e5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Mon, 27 May 2019 22:40:47 +0000
+Subject: [PATCH 2/2] cogl-path: Undeprecate framebuffer functions
+
+It looks like deprecating the functions with explicit framebuffer/pipeline
+arguments made it to (cogl) master by mistake:
+
+https://mail.gnome.org/archives/clutter-list/2016-April/msg00008.html
+
+We now use one of them, so this is a good time to undeprecate the lot.
+
+https://gitlab.gnome.org/GNOME/mutter/merge_requests/597
+---
+ cogl/cogl-path/cogl-path-functions.h | 6 ------
+ cogl/cogl-path/cogl-path.c           | 3 ---
+ 2 files changed, 9 deletions(-)
+
+diff --git a/cogl/cogl-path/cogl-path-functions.h b/cogl/cogl-path/cogl-path-functions.h
+index d4ef328d2..318fed028 100644
+--- a/cogl/cogl-path/cogl-path-functions.h
++++ b/cogl/cogl-path/cogl-path-functions.h
+@@ -460,9 +460,7 @@ cogl_path_fill (CoglPath *path);
+  * use while filling a path.</note>
+  *
+  * Stability: unstable
+- * Deprecated: 1.16: Use cogl_path_fill() instead
+  */
+-COGL_DEPRECATED_FOR (cogl_path_fill)
+ void
+ cogl_framebuffer_fill_path (CoglFramebuffer *framebuffer,
+                             CoglPipeline *pipeline,
+@@ -492,9 +490,7 @@ cogl_path_stroke (CoglPath *path);
+  * regardless of the current transformation matrix.
+  *
+  * Stability: unstable
+- * Deprecated: 1.16: Use cogl_path_stroke() instead
+  */
+-COGL_DEPRECATED_FOR (cogl_path_stroke)
+ void
+ cogl_framebuffer_stroke_path (CoglFramebuffer *framebuffer,
+                               CoglPipeline *pipeline,
+@@ -529,9 +525,7 @@ cogl_framebuffer_push_path_clip (CoglFramebuffer *framebuffer,
+  *
+  * Since: 1.8
+  * Stability: Unstable
+- * Deprecated: 1.16: Use cogl_framebuffer_push_path_clip() instead
+  */
+-COGL_DEPRECATED_FOR (cogl_framebuffer_push_path_clip)
+ void
+ cogl_clip_push_from_path (CoglPath *path);
+ 
+diff --git a/cogl/cogl-path/cogl-path.c b/cogl/cogl-path/cogl-path.c
+index 4d86c6fb5..8774406f8 100644
+--- a/cogl/cogl-path/cogl-path.c
++++ b/cogl/cogl-path/cogl-path.c
+@@ -1504,7 +1504,6 @@ cogl_framebuffer_push_path_clip (CoglFramebuffer *framebuffer,
+       COGL_FRAMEBUFFER_STATE_CLIP;
+ }
+ 
+-/* XXX: deprecated */
+ void
+ cogl_clip_push_from_path (CoglPath *path)
+ {
+@@ -1575,7 +1574,6 @@ _cogl_path_build_stroke_attribute_buffer (CoglPath *path)
+   data->stroke_n_attributes = n_attributes;
+ }
+ 
+-/* XXX: deprecated */
+ void
+ cogl_framebuffer_fill_path (CoglFramebuffer *framebuffer,
+                             CoglPipeline *pipeline,
+@@ -1588,7 +1586,6 @@ cogl_framebuffer_fill_path (CoglFramebuffer *framebuffer,
+   _cogl_path_fill_nodes (path, framebuffer, pipeline, 0 /* flags */);
+ }
+ 
+-/* XXX: deprecated */
+ void
+ cogl_framebuffer_stroke_path (CoglFramebuffer *framebuffer,
+                               CoglPipeline *pipeline,
+-- 
+2.21.0
+
diff --git a/SOURCES/hw-cursor-on-demand-gnome-3-28.patch b/SOURCES/hw-cursor-on-demand-gnome-3-28.patch
deleted file mode 100644
index ae3db81..0000000
--- a/SOURCES/hw-cursor-on-demand-gnome-3-28.patch
+++ /dev/null
@@ -1,3006 +0,0 @@
-diff --git a/src/Makefile.am b/src/Makefile.am
-index bcb3505c7..5bbac70e8 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -114,6 +114,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\
- 	backends/meta-cursor-tracker-private.h	\
- 	backends/meta-cursor-renderer.c		\
- 	backends/meta-cursor-renderer.h		\
-+	backends/meta-cursor-sprite-xcursor.c	\
-+	backends/meta-cursor-sprite-xcursor.h	\
- 	backends/meta-dnd-private.h		\
- 	backends/meta-egl.c			\
- 	backends/meta-egl.h			\
-@@ -176,6 +178,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES =	\
- 	backends/x11/meta-gpu-xrandr.h			\
- 	backends/x11/cm/meta-backend-x11-cm.c		\
- 	backends/x11/cm/meta-backend-x11-cm.h		\
-+	backends/x11/cm/meta-cursor-sprite-xfixes.c	\
-+	backends/x11/cm/meta-cursor-sprite-xfixes.h	\
- 	backends/x11/cm/meta-renderer-x11-cm.c		\
- 	backends/x11/cm/meta-renderer-x11-cm.h		\
- 	backends/x11/nested/meta-backend-x11-nested.c	\
-@@ -370,6 +374,8 @@ if HAVE_WAYLAND
- libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES +=	\
- 	compositor/meta-surface-actor-wayland.c	\
- 	compositor/meta-surface-actor-wayland.h	\
-+	wayland/meta-cursor-sprite-wayland.c	\
-+	wayland/meta-cursor-sprite-wayland.h	\
- 	wayland/meta-wayland.c			\
- 	wayland/meta-wayland.h			\
- 	wayland/meta-wayland-private.h		\
-@@ -431,10 +437,10 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES +=	\
- 	wayland/meta-wayland-touch.h		\
- 	wayland/meta-wayland-surface.c		\
- 	wayland/meta-wayland-surface.h		\
--	wayland/meta-wayland-surface-role-cursor.c	\
--	wayland/meta-wayland-surface-role-cursor.h	\
--	wayland/meta-wayland-surface-role-tablet-cursor.c	\
--	wayland/meta-wayland-surface-role-tablet-cursor.h	\
-+	wayland/meta-wayland-cursor-surface.c	\
-+	wayland/meta-wayland-cursor-surface.h	\
-+	wayland/meta-wayland-tablet-cursor-surface.c	\
-+	wayland/meta-wayland-tablet-cursor-surface.h	\
- 	wayland/meta-wayland-actor-surface.c	\
- 	wayland/meta-wayland-actor-surface.h	\
- 	wayland/meta-wayland-subsurface.c	\
-diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
-index f6470e66a..eb79737f1 100644
---- a/src/backends/meta-cursor-renderer.c
-+++ b/src/backends/meta-cursor-renderer.c
-@@ -193,8 +193,8 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
- }
- 
- static void
--update_cursor (MetaCursorRenderer *renderer,
--               MetaCursorSprite   *cursor_sprite)
-+meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
-+                                    MetaCursorSprite   *cursor_sprite)
- {
-   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
-   gboolean handled_by_backend;
-@@ -237,7 +237,7 @@ meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
-     return;
-   priv->displayed_cursor = cursor_sprite;
- 
--  update_cursor (renderer, cursor_sprite);
-+  meta_cursor_renderer_update_cursor (renderer, cursor_sprite);
- }
- 
- void
-@@ -246,7 +246,7 @@ meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
-   MetaCursorRendererPrivate *priv =
-     meta_cursor_renderer_get_instance_private (renderer);
- 
--  update_cursor (renderer, priv->displayed_cursor);
-+  meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor);
- }
- 
- void
-@@ -261,7 +261,7 @@ meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
-   priv->current_x = x;
-   priv->current_y = y;
- 
--  update_cursor (renderer, priv->displayed_cursor);
-+  meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor);
- }
- 
- ClutterPoint
-@@ -283,28 +283,3 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
- 
-   return priv->displayed_cursor;
- }
--
--#ifdef HAVE_WAYLAND
--void
--meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
--                                                    MetaCursorSprite   *cursor_sprite,
--                                                    struct wl_resource *buffer)
--{
--
--  MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer);
--
--  if (renderer_class->realize_cursor_from_wl_buffer)
--    renderer_class->realize_cursor_from_wl_buffer (renderer, cursor_sprite, buffer);
--}
--#endif
--
--void
--meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
--                                                  MetaCursorSprite   *cursor_sprite,
--                                                  XcursorImage       *xc_image)
--{
--  MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer);
--
--  if (renderer_class->realize_cursor_from_xcursor)
--    renderer_class->realize_cursor_from_xcursor (renderer, cursor_sprite, xc_image);
--}
-diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h
-index 1691f4471..830d16ef6 100644
---- a/src/backends/meta-cursor-renderer.h
-+++ b/src/backends/meta-cursor-renderer.h
-@@ -26,10 +26,6 @@
- #define META_CURSOR_RENDERER_H
- 
- #include <glib-object.h>
--#include <X11/Xcursor/Xcursor.h>
--#ifdef HAVE_WAYLAND
--#include <wayland-server.h>
--#endif
- 
- #include <meta/screen.h>
- #include "meta-cursor.h"
-@@ -44,14 +40,6 @@ struct _MetaCursorRendererClass
- 
-   gboolean (* update_cursor) (MetaCursorRenderer *renderer,
-                               MetaCursorSprite   *cursor_sprite);
--#ifdef HAVE_WAYLAND
--  void (* realize_cursor_from_wl_buffer) (MetaCursorRenderer *renderer,
--                                          MetaCursorSprite *cursor_sprite,
--                                          struct wl_resource *buffer);
--#endif
--  void (* realize_cursor_from_xcursor) (MetaCursorRenderer *renderer,
--                                        MetaCursorSprite *cursor_sprite,
--                                        XcursorImage *xc_image);
- };
- 
- MetaCursorRenderer * meta_cursor_renderer_new (void);
-@@ -70,16 +58,6 @@ MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer
- ClutterRect meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
-                                                  MetaCursorSprite   *cursor_sprite);
- 
--#ifdef HAVE_WAYLAND
--void meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
--                                                         MetaCursorSprite   *cursor_sprite,
--                                                         struct wl_resource *buffer);
--#endif
--
--void meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
--                                                       MetaCursorSprite   *cursor_sprite,
--                                                       XcursorImage       *xc_image);
--
- void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
-                                         MetaCursorSprite   *cursor_sprite);
- 
-diff --git a/src/backends/meta-cursor-sprite-xcursor.c b/src/backends/meta-cursor-sprite-xcursor.c
-new file mode 100644
-index 000000000..657c1dae8
---- /dev/null
-+++ b/src/backends/meta-cursor-sprite-xcursor.c
-@@ -0,0 +1,292 @@
-+/*
-+ * Copyright 2013, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/meta-cursor-sprite-xcursor.h"
-+
-+#include "backends/meta-cursor.h"
-+#include "backends/meta-cursor-renderer.h"
-+#include "clutter/clutter.h"
-+#include "cogl/cogl.h"
-+#include "meta/prefs.h"
-+
-+struct _MetaCursorSpriteXcursor
-+{
-+  MetaCursorSprite parent;
-+
-+  MetaCursor cursor;
-+
-+  int current_frame;
-+  XcursorImages *xcursor_images;
-+
-+  int theme_scale;
-+  gboolean theme_dirty;
-+};
-+
-+G_DEFINE_TYPE (MetaCursorSpriteXcursor, meta_cursor_sprite_xcursor,
-+               META_TYPE_CURSOR_SPRITE)
-+
-+static const char *
-+translate_meta_cursor (MetaCursor cursor)
-+{
-+  switch (cursor)
-+    {
-+    case META_CURSOR_DEFAULT:
-+      return "left_ptr";
-+    case META_CURSOR_NORTH_RESIZE:
-+      return "top_side";
-+    case META_CURSOR_SOUTH_RESIZE:
-+      return "bottom_side";
-+    case META_CURSOR_WEST_RESIZE:
-+      return "left_side";
-+    case META_CURSOR_EAST_RESIZE:
-+      return "right_side";
-+    case META_CURSOR_SE_RESIZE:
-+      return "bottom_right_corner";
-+    case META_CURSOR_SW_RESIZE:
-+      return "bottom_left_corner";
-+    case META_CURSOR_NE_RESIZE:
-+      return "top_right_corner";
-+    case META_CURSOR_NW_RESIZE:
-+      return "top_left_corner";
-+    case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
-+      return "fleur";
-+    case META_CURSOR_BUSY:
-+      return "watch";
-+    case META_CURSOR_DND_IN_DRAG:
-+      return "dnd-none";
-+    case META_CURSOR_DND_MOVE:
-+      return "dnd-move";
-+    case META_CURSOR_DND_COPY:
-+      return "dnd-copy";
-+    case META_CURSOR_DND_UNSUPPORTED_TARGET:
-+      return "dnd-none";
-+    case META_CURSOR_POINTING_HAND:
-+      return "hand2";
-+    case META_CURSOR_CROSSHAIR:
-+      return "crosshair";
-+    case META_CURSOR_IBEAM:
-+      return "xterm";
-+    default:
-+      break;
-+    }
-+
-+  g_assert_not_reached ();
-+}
-+
-+MetaCursor
-+meta_cursor_sprite_xcursor_get_cursor (MetaCursorSpriteXcursor *sprite_xcursor)
-+{
-+  return sprite_xcursor->cursor;
-+}
-+
-+Cursor
-+meta_create_x_cursor (Display    *xdisplay,
-+                      MetaCursor  cursor)
-+{
-+  return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
-+}
-+
-+static XcursorImages *
-+load_cursor_on_client (MetaCursor cursor, int scale)
-+{
-+  return XcursorLibraryLoadImages (translate_meta_cursor (cursor),
-+                                   meta_prefs_get_cursor_theme (),
-+                                   meta_prefs_get_cursor_size () * scale);
-+}
-+
-+static void
-+load_from_current_xcursor_image (MetaCursorSpriteXcursor *sprite_xcursor)
-+{
-+  MetaCursorSprite *sprite = META_CURSOR_SPRITE (sprite_xcursor);
-+  XcursorImage *xc_image;
-+  int width, height, rowstride;
-+  CoglPixelFormat cogl_format;
-+  ClutterBackend *clutter_backend;
-+  CoglContext *cogl_context;
-+  CoglTexture2D *texture;
-+  CoglError *error = NULL;
-+
-+  g_assert (!meta_cursor_sprite_get_cogl_texture (sprite));
-+
-+  xc_image = meta_cursor_sprite_xcursor_get_current_image (sprite_xcursor);
-+  width = (int) xc_image->width;
-+  height = (int) xc_image->height;
-+  rowstride = width * 4;
-+
-+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-+  cogl_format = COGL_PIXEL_FORMAT_BGRA_8888;
-+#else
-+  cogl_format = COGL_PIXEL_FORMAT_ARGB_8888;
-+#endif
-+
-+  clutter_backend = clutter_get_default_backend ();
-+  cogl_context = clutter_backend_get_cogl_context (clutter_backend);
-+  texture = cogl_texture_2d_new_from_data (cogl_context,
-+                                           width, height,
-+                                           cogl_format,
-+                                           rowstride,
-+                                           (uint8_t *) xc_image->pixels,
-+                                           &error);
-+  if (!texture)
-+    {
-+      g_warning ("Failed to allocate cursor texture: %s\n", error->message);
-+      cogl_error_free (error);
-+    }
-+
-+  meta_cursor_sprite_set_texture (sprite,
-+                                  COGL_TEXTURE (texture),
-+                                  xc_image->xhot, xc_image->yhot);
-+
-+  if (texture)
-+    cogl_object_unref (texture);
-+}
-+
-+void
-+meta_cursor_sprite_xcursor_set_theme_scale (MetaCursorSpriteXcursor *sprite_xcursor,
-+                                            int                      theme_scale)
-+{
-+  if (sprite_xcursor->theme_scale != theme_scale)
-+    sprite_xcursor->theme_dirty = TRUE;
-+  sprite_xcursor->theme_scale = theme_scale;
-+}
-+
-+
-+static gboolean
-+meta_cursor_sprite_xcursor_is_animated (MetaCursorSprite *sprite)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
-+
-+  return (sprite_xcursor->xcursor_images &&
-+          sprite_xcursor->xcursor_images->nimage > 1);
-+}
-+
-+XcursorImage *
-+meta_cursor_sprite_xcursor_get_current_image (MetaCursorSpriteXcursor *sprite_xcursor)
-+{
-+  return sprite_xcursor->xcursor_images->images[sprite_xcursor->current_frame];
-+}
-+
-+static void
-+meta_cursor_sprite_xcursor_tick_frame (MetaCursorSprite *sprite)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
-+
-+  if (!meta_cursor_sprite_is_animated (sprite))
-+    return;
-+
-+  sprite_xcursor->current_frame++;
-+
-+  if (sprite_xcursor->current_frame >= sprite_xcursor->xcursor_images->nimage)
-+    sprite_xcursor->current_frame = 0;
-+
-+  meta_cursor_sprite_clear_texture (sprite);
-+  load_from_current_xcursor_image (sprite_xcursor);
-+}
-+
-+static unsigned int
-+meta_cursor_sprite_xcursor_get_current_frame_time (MetaCursorSprite *sprite)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
-+  XcursorImages *xcursor_images;
-+
-+  g_return_val_if_fail (meta_cursor_sprite_is_animated (sprite), 0);
-+
-+  xcursor_images = sprite_xcursor->xcursor_images;
-+  return xcursor_images->images[sprite_xcursor->current_frame]->delay;
-+}
-+
-+static void
-+load_cursor_from_theme (MetaCursorSprite *sprite)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
-+
-+  g_assert (sprite_xcursor->cursor != META_CURSOR_NONE);
-+
-+  sprite_xcursor->theme_dirty = FALSE;
-+
-+  /* We might be reloading with a different scale. If so clear the old data. */
-+  if (sprite_xcursor->xcursor_images)
-+    {
-+      meta_cursor_sprite_clear_texture (sprite);
-+      XcursorImagesDestroy (sprite_xcursor->xcursor_images);
-+    }
-+
-+  sprite_xcursor->current_frame = 0;
-+  sprite_xcursor->xcursor_images =
-+    load_cursor_on_client (sprite_xcursor->cursor,
-+                           sprite_xcursor->theme_scale);
-+  if (!sprite_xcursor->xcursor_images)
-+    g_error ("Could not find cursor. Perhaps set XCURSOR_PATH?");
-+
-+  load_from_current_xcursor_image (sprite_xcursor);
-+}
-+
-+static void
-+meta_cursor_sprite_xcursor_realize_texture (MetaCursorSprite *sprite)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (sprite);
-+
-+  if (sprite_xcursor->theme_dirty)
-+    load_cursor_from_theme (sprite);
-+}
-+
-+MetaCursorSpriteXcursor *
-+meta_cursor_sprite_xcursor_new (MetaCursor cursor)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor;
-+
-+  sprite_xcursor = g_object_new (META_TYPE_CURSOR_SPRITE_XCURSOR, NULL);
-+  sprite_xcursor->cursor = cursor;
-+
-+  return sprite_xcursor;
-+}
-+
-+static void
-+meta_cursor_sprite_xcursor_finalize (GObject *object)
-+{
-+  MetaCursorSpriteXcursor *sprite_xcursor = META_CURSOR_SPRITE_XCURSOR (object);
-+
-+  g_clear_pointer (&sprite_xcursor->xcursor_images,
-+                   XcursorImagesDestroy);
-+
-+  G_OBJECT_CLASS (meta_cursor_sprite_xcursor_parent_class)->finalize (object);
-+}
-+
-+static void
-+meta_cursor_sprite_xcursor_init (MetaCursorSpriteXcursor *sprite_xcursor)
-+{
-+  sprite_xcursor->theme_dirty = TRUE;
-+}
-+
-+static void
-+meta_cursor_sprite_xcursor_class_init (MetaCursorSpriteXcursorClass *klass)
-+{
-+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+  MetaCursorSpriteClass *cursor_sprite_class = META_CURSOR_SPRITE_CLASS (klass);
-+
-+  object_class->finalize = meta_cursor_sprite_xcursor_finalize;
-+
-+  cursor_sprite_class->realize_texture =
-+    meta_cursor_sprite_xcursor_realize_texture;
-+  cursor_sprite_class->is_animated = meta_cursor_sprite_xcursor_is_animated;
-+  cursor_sprite_class->tick_frame = meta_cursor_sprite_xcursor_tick_frame;
-+  cursor_sprite_class->get_current_frame_time =
-+    meta_cursor_sprite_xcursor_get_current_frame_time;
-+}
-diff --git a/src/backends/meta-cursor-sprite-xcursor.h b/src/backends/meta-cursor-sprite-xcursor.h
-new file mode 100644
-index 000000000..dbc927484
---- /dev/null
-+++ b/src/backends/meta-cursor-sprite-xcursor.h
-@@ -0,0 +1,43 @@
-+/*
-+ * Copyright 2013, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#ifndef META_CURSOR_SPRITE_XCURSOR_H
-+#define META_CURSOR_SPRITE_XCURSOR_H
-+
-+#include <glib-object.h>
-+#include <X11/Xcursor/Xcursor.h>
-+
-+#include "backends/meta-cursor.h"
-+
-+#define META_TYPE_CURSOR_SPRITE_XCURSOR meta_cursor_sprite_xcursor_get_type ()
-+G_DECLARE_FINAL_TYPE (MetaCursorSpriteXcursor, meta_cursor_sprite_xcursor,
-+                      META, CURSOR_SPRITE_XCURSOR, MetaCursorSprite)
-+
-+MetaCursorSpriteXcursor * meta_cursor_sprite_xcursor_new (MetaCursor cursor);
-+
-+void meta_cursor_sprite_xcursor_set_theme_scale (MetaCursorSpriteXcursor *sprite_xcursor,
-+                                                 int                      scale);
-+
-+MetaCursor meta_cursor_sprite_xcursor_get_cursor (MetaCursorSpriteXcursor *sprite_xcusror);
-+
-+XcursorImage * meta_cursor_sprite_xcursor_get_current_image (MetaCursorSpriteXcursor *sprite_xcursor);
-+
-+Cursor meta_create_x_cursor (Display    *xdisplay,
-+                             MetaCursor  cursor);
-+
-+#endif /* META_CURSOR_SPRITE_XCURSOR_H */
-diff --git a/src/backends/meta-cursor-tracker-private.h b/src/backends/meta-cursor-tracker-private.h
-index 2ec946847..6f4f84b83 100644
---- a/src/backends/meta-cursor-tracker-private.h
-+++ b/src/backends/meta-cursor-tracker-private.h
-@@ -26,6 +26,7 @@
- 
- #include "meta-cursor.h"
- #include "meta-cursor-renderer.h"
-+#include "backends/x11/cm/meta-cursor-sprite-xfixes.h"
- 
- struct _MetaCursorTracker {
-   GObject parent_instance;
-@@ -46,7 +47,7 @@ struct _MetaCursorTracker {
-   MetaCursorSprite *root_cursor;
- 
-   /* The cursor from the X11 server. */
--  MetaCursorSprite *xfixes_cursor;
-+  MetaCursorSpriteXfixes *xfixes_cursor;
- };
- 
- struct _MetaCursorTrackerClass {
-diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
-index 74fa4351d..6244f11ee 100644
---- a/src/backends/meta-cursor-tracker.c
-+++ b/src/backends/meta-cursor-tracker.c
-@@ -40,9 +40,9 @@
- 
- #include <gdk/gdk.h>
- #include <gdk/gdkx.h>
--#include <X11/extensions/Xfixes.h>
- 
- #include "meta-backend-private.h"
-+#include "backends/x11/cm/meta-cursor-sprite-xfixes.h"
- 
- G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
- 
-@@ -218,75 +218,14 @@ static void
- ensure_xfixes_cursor (MetaCursorTracker *tracker)
- {
-   MetaDisplay *display = meta_get_display ();
--  XFixesCursorImage *cursor_image;
--  CoglTexture2D *sprite;
--  guint8 *cursor_data;
--  gboolean free_cursor_data;
--  CoglContext *ctx;
--  CoglError *error = NULL;
-+  g_autoptr (GError) error = NULL;
- 
-   if (tracker->xfixes_cursor)
-     return;
- 
--  cursor_image = XFixesGetCursorImage (display->xdisplay);
--  if (!cursor_image)
--    return;
--
--  /* Like all X APIs, XFixesGetCursorImage() returns arrays of 32-bit
--   * quantities as arrays of long; we need to convert on 64 bit */
--  if (sizeof(long) == 4)
--    {
--      cursor_data = (guint8 *)cursor_image->pixels;
--      free_cursor_data = FALSE;
--    }
--  else
--    {
--      int i, j;
--      guint32 *cursor_words;
--      gulong *p;
--      guint32 *q;
--
--      cursor_words = g_new (guint32, cursor_image->width * cursor_image->height);
--      cursor_data = (guint8 *)cursor_words;
--
--      p = cursor_image->pixels;
--      q = cursor_words;
--      for (j = 0; j < cursor_image->height; j++)
--        for (i = 0; i < cursor_image->width; i++)
--          *(q++) = *(p++);
--
--      free_cursor_data = TRUE;
--    }
--
--  ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
--  sprite = cogl_texture_2d_new_from_data (ctx,
--                                          cursor_image->width,
--                                          cursor_image->height,
--                                          CLUTTER_CAIRO_FORMAT_ARGB32,
--                                          cursor_image->width * 4, /* stride */
--                                          cursor_data,
--                                          &error);
--
--  if (free_cursor_data)
--    g_free (cursor_data);
--
--  if (error != NULL)
--    {
--      meta_warning ("Failed to allocate cursor sprite texture: %s\n", error->message);
--      cogl_error_free (error);
--    }
--
--  if (sprite != NULL)
--    {
--      MetaCursorSprite *cursor_sprite = meta_cursor_sprite_new ();
--      meta_cursor_sprite_set_texture (cursor_sprite,
--                                      COGL_TEXTURE (sprite),
--                                      cursor_image->xhot,
--                                      cursor_image->yhot);
--      cogl_object_unref (sprite);
--      tracker->xfixes_cursor = cursor_sprite;
--    }
--  XFree (cursor_image);
-+  tracker->xfixes_cursor = meta_cursor_sprite_xfixes_new (display, &error);
-+  if (!tracker->xfixes_cursor)
-+    g_warning ("Failed to create XFIXES cursor: %s", error->message);
- }
- 
- /**
-@@ -308,7 +247,7 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
-   else
-     {
-       ensure_xfixes_cursor (tracker);
--      cursor_sprite = tracker->xfixes_cursor;
-+      cursor_sprite = META_CURSOR_SPRITE (tracker->xfixes_cursor);
-     }
- 
-   if (cursor_sprite)
-@@ -345,7 +284,7 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
-   else
-     {
-       ensure_xfixes_cursor (tracker);
--      cursor_sprite = tracker->xfixes_cursor;
-+      cursor_sprite = META_CURSOR_SPRITE (tracker->xfixes_cursor);
-     }
- 
-   if (cursor_sprite)
-diff --git a/src/backends/meta-cursor.c b/src/backends/meta-cursor.c
-index beeee765b..9750dc00b 100644
---- a/src/backends/meta-cursor.c
-+++ b/src/backends/meta-cursor.c
-@@ -23,19 +23,12 @@
- 
- #include "meta-cursor.h"
- 
--#include <meta/errors.h>
-+#include "backends/meta-backend-private.h"
-+#include "cogl/cogl.h"
-+#include "meta/common.h"
- 
--#include "display-private.h"
--#include "screen-private.h"
--#include "meta-backend-private.h"
--
--#include <string.h>
--
--#include <X11/cursorfont.h>
--#include <X11/extensions/Xfixes.h>
--#include <X11/Xcursor/Xcursor.h>
--
--enum {
-+enum
-+{
-   PREPARE_AT,
-   TEXTURE_CHANGED,
- 
-@@ -44,316 +37,148 @@ enum {
- 
- static guint signals[LAST_SIGNAL];
- 
--struct _MetaCursorSprite
-+typedef struct _MetaCursorSpritePrivate
- {
-   GObject parent;
- 
--  MetaCursor cursor;
--
-   CoglTexture2D *texture;
-   float texture_scale;
-   int hot_x, hot_y;
-+} MetaCursorSpritePrivate;
- 
--  int current_frame;
--  XcursorImages *xcursor_images;
--
--  int theme_scale;
--  gboolean theme_dirty;
--};
--
--G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT)
-+G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaCursorSprite,
-+                                     meta_cursor_sprite,
-+                                     G_TYPE_OBJECT)
- 
--static const char *
--translate_meta_cursor (MetaCursor cursor)
--{
--  switch (cursor)
--    {
--    case META_CURSOR_DEFAULT:
--      return "left_ptr";
--    case META_CURSOR_NORTH_RESIZE:
--      return "top_side";
--    case META_CURSOR_SOUTH_RESIZE:
--      return "bottom_side";
--    case META_CURSOR_WEST_RESIZE:
--      return "left_side";
--    case META_CURSOR_EAST_RESIZE:
--      return "right_side";
--    case META_CURSOR_SE_RESIZE:
--      return "bottom_right_corner";
--    case META_CURSOR_SW_RESIZE:
--      return "bottom_left_corner";
--    case META_CURSOR_NE_RESIZE:
--      return "top_right_corner";
--    case META_CURSOR_NW_RESIZE:
--      return "top_left_corner";
--    case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
--      return "fleur";
--    case META_CURSOR_BUSY:
--      return "watch";
--    case META_CURSOR_DND_IN_DRAG:
--      return "dnd-none";
--    case META_CURSOR_DND_MOVE:
--      return "dnd-move";
--    case META_CURSOR_DND_COPY:
--      return "dnd-copy";
--    case META_CURSOR_DND_UNSUPPORTED_TARGET:
--      return "dnd-none";
--    case META_CURSOR_POINTING_HAND:
--      return "hand2";
--    case META_CURSOR_CROSSHAIR:
--      return "crosshair";
--    case META_CURSOR_IBEAM:
--      return "xterm";
--    default:
--      break;
--    }
--
--  g_assert_not_reached ();
--}
--
--Cursor
--meta_cursor_create_x_cursor (Display    *xdisplay,
--                             MetaCursor  cursor)
--{
--  return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
--}
--
--static XcursorImages *
--load_cursor_on_client (MetaCursor cursor, int scale)
--{
--  return XcursorLibraryLoadImages (translate_meta_cursor (cursor),
--                                   meta_prefs_get_cursor_theme (),
--                                   meta_prefs_get_cursor_size () * scale);
--}
--
--static void
--meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *self,
--                                            XcursorImage     *xc_image)
-+gboolean
-+meta_cursor_sprite_is_animated (MetaCursorSprite *sprite)
- {
--  MetaBackend *meta_backend = meta_get_backend ();
--  MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
--  uint width, height, rowstride;
--  CoglPixelFormat cogl_format;
--  ClutterBackend *clutter_backend;
--  CoglContext *cogl_context;
--  CoglTexture2D *texture;
--  CoglError *error = NULL;
--
--  g_assert (self->texture == NULL);
--
--  width           = xc_image->width;
--  height          = xc_image->height;
--  rowstride       = width * 4;
--
--#if G_BYTE_ORDER == G_LITTLE_ENDIAN
--  cogl_format = COGL_PIXEL_FORMAT_BGRA_8888;
--#else
--  cogl_format = COGL_PIXEL_FORMAT_ARGB_8888;
--#endif
--
--  clutter_backend = clutter_get_default_backend ();
--  cogl_context = clutter_backend_get_cogl_context (clutter_backend);
--  texture = cogl_texture_2d_new_from_data (cogl_context,
--                                           width, height,
--                                           cogl_format,
--                                           rowstride,
--                                           (uint8_t *) xc_image->pixels,
--                                           &error);
--
--  if (error)
--    {
--      meta_warning ("Failed to allocate cursor texture: %s\n", error->message);
--      cogl_error_free (error);
--    }
--
--  meta_cursor_sprite_set_texture (self, COGL_TEXTURE (texture),
--                                  xc_image->xhot, xc_image->yhot);
-+  MetaCursorSpriteClass *klass = META_CURSOR_SPRITE_GET_CLASS (sprite);
- 
--  if (texture)
--    cogl_object_unref (texture);
--
--  meta_cursor_renderer_realize_cursor_from_xcursor (renderer, self, xc_image);
--}
--
--static XcursorImage *
--meta_cursor_sprite_get_current_frame_image (MetaCursorSprite *self)
--{
--  return self->xcursor_images->images[self->current_frame];
-+  if (klass->is_animated)
-+    return klass->is_animated (sprite);
-+  else
-+    return FALSE;
- }
- 
- void
--meta_cursor_sprite_tick_frame (MetaCursorSprite *self)
--{
--  XcursorImage *image;
--
--  if (!meta_cursor_sprite_is_animated (self))
--    return;
--
--  self->current_frame++;
--
--  if (self->current_frame >= self->xcursor_images->nimage)
--    self->current_frame = 0;
--
--  image = meta_cursor_sprite_get_current_frame_image (self);
--
--  g_clear_pointer (&self->texture, cogl_object_unref);
--  meta_cursor_sprite_load_from_xcursor_image (self, image);
--}
--
--guint
--meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self)
--{
--  if (!meta_cursor_sprite_is_animated (self))
--    return 0;
--
--  return self->xcursor_images->images[self->current_frame]->delay;
--}
--
--gboolean
--meta_cursor_sprite_is_animated (MetaCursorSprite *self)
-+meta_cursor_sprite_tick_frame (MetaCursorSprite *sprite)
- {
--  return (self->xcursor_images &&
--          self->xcursor_images->nimage > 1);
-+  return META_CURSOR_SPRITE_GET_CLASS (sprite)->tick_frame (sprite);
- }
- 
--MetaCursorSprite *
--meta_cursor_sprite_new (void)
-+unsigned int
-+meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *sprite)
- {
--  return g_object_new (META_TYPE_CURSOR_SPRITE, NULL);
-+  return META_CURSOR_SPRITE_GET_CLASS (sprite)->get_current_frame_time (sprite);
- }
- 
--static void
--meta_cursor_sprite_load_from_theme (MetaCursorSprite *self)
--{
--  XcursorImage *image;
--
--  g_assert (self->cursor != META_CURSOR_NONE);
--
--  self->theme_dirty = FALSE;
--
--  /* We might be reloading with a different scale. If so clear the old data. */
--  if (self->xcursor_images)
--    {
--      g_clear_pointer (&self->texture, cogl_object_unref);
--      XcursorImagesDestroy (self->xcursor_images);
--    }
--
--  self->current_frame = 0;
--  self->xcursor_images = load_cursor_on_client (self->cursor,
--                                                self->theme_scale);
--  if (!self->xcursor_images)
--    meta_fatal ("Could not find cursor. Perhaps set XCURSOR_PATH?");
--
--  image = meta_cursor_sprite_get_current_frame_image (self);
--  meta_cursor_sprite_load_from_xcursor_image (self, image);
--}
--
--MetaCursorSprite *
--meta_cursor_sprite_from_theme (MetaCursor cursor)
-+void
-+meta_cursor_sprite_clear_texture (MetaCursorSprite *sprite)
- {
--  MetaCursorSprite *self;
--
--  self = meta_cursor_sprite_new ();
--
--  self->cursor = cursor;
--  self->theme_dirty = TRUE;
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
- 
--  return self;
-+  g_clear_pointer (&priv->texture, cogl_object_unref);
- }
- 
- void
--meta_cursor_sprite_set_texture (MetaCursorSprite *self,
-+meta_cursor_sprite_set_texture (MetaCursorSprite *sprite,
-                                 CoglTexture      *texture,
-                                 int               hot_x,
-                                 int               hot_y)
- {
--  if (self->texture == COGL_TEXTURE_2D (texture) &&
--      self->hot_x == hot_x &&
--      self->hot_y == hot_y)
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
-+
-+  if (priv->texture == COGL_TEXTURE_2D (texture) &&
-+      priv->hot_x == hot_x &&
-+      priv->hot_y == hot_y)
-     return;
- 
--  g_clear_pointer (&self->texture, cogl_object_unref);
-+  g_clear_pointer (&priv->texture, cogl_object_unref);
-   if (texture)
--    self->texture = cogl_object_ref (texture);
--  self->hot_x = hot_x;
--  self->hot_y = hot_y;
-+    priv->texture = cogl_object_ref (texture);
-+  priv->hot_x = hot_x;
-+  priv->hot_y = hot_y;
- 
--  g_signal_emit (self, signals[TEXTURE_CHANGED], 0);
-+  g_signal_emit (sprite, signals[TEXTURE_CHANGED], 0);
- }
- 
- void
--meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self,
-+meta_cursor_sprite_set_texture_scale (MetaCursorSprite *sprite,
-                                       float             scale)
- {
--  self->texture_scale = scale;
--}
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
- 
--void
--meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self,
--                                    int               theme_scale)
--{
--  if (self->theme_scale != theme_scale)
--    self->theme_dirty = TRUE;
--  self->theme_scale = theme_scale;
-+  priv->texture_scale = scale;
- }
- 
- CoglTexture *
--meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self)
-+meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *sprite)
- {
--  return COGL_TEXTURE (self->texture);
--}
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
- 
--MetaCursor
--meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self)
--{
--  return self->cursor;
-+  return COGL_TEXTURE (priv->texture);
- }
- 
- void
--meta_cursor_sprite_get_hotspot (MetaCursorSprite *self,
-+meta_cursor_sprite_get_hotspot (MetaCursorSprite *sprite,
-                                 int              *hot_x,
-                                 int              *hot_y)
- {
--  *hot_x = self->hot_x;
--  *hot_y = self->hot_y;
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
-+
-+  *hot_x = priv->hot_x;
-+  *hot_y = priv->hot_y;
- }
- 
- float
--meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self)
-+meta_cursor_sprite_get_texture_scale (MetaCursorSprite *sprite)
- {
--  return self->texture_scale;
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
-+
-+  return priv->texture_scale;
- }
- 
- void
--meta_cursor_sprite_prepare_at (MetaCursorSprite *self,
-+meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
-                                int               x,
-                                int               y)
- {
--  g_signal_emit (self, signals[PREPARE_AT], 0, x, y);
-+  g_signal_emit (sprite, signals[PREPARE_AT], 0, x, y);
- }
- 
- void
--meta_cursor_sprite_realize_texture (MetaCursorSprite *self)
-+meta_cursor_sprite_realize_texture (MetaCursorSprite *sprite)
- {
--  if (self->theme_dirty)
--    meta_cursor_sprite_load_from_theme (self);
-+  MetaCursorSpriteClass *klass = META_CURSOR_SPRITE_GET_CLASS (sprite);
-+
-+  if (klass->realize_texture)
-+    klass->realize_texture (sprite);
- }
- 
- static void
--meta_cursor_sprite_init (MetaCursorSprite *self)
-+meta_cursor_sprite_init (MetaCursorSprite *sprite)
- {
--  self->texture_scale = 1.0f;
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
-+
-+  priv->texture_scale = 1.0f;
- }
- 
- static void
- meta_cursor_sprite_finalize (GObject *object)
- {
--  MetaCursorSprite *self = META_CURSOR_SPRITE (object);
--
--  if (self->xcursor_images)
--    XcursorImagesDestroy (self->xcursor_images);
-+  MetaCursorSprite *sprite = META_CURSOR_SPRITE (object);
-+  MetaCursorSpritePrivate *priv =
-+    meta_cursor_sprite_get_instance_private (sprite);
- 
--  g_clear_pointer (&self->texture, cogl_object_unref);
-+  g_clear_pointer (&priv->texture, cogl_object_unref);
- 
-   G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object);
- }
-diff --git a/src/backends/meta-cursor.h b/src/backends/meta-cursor.h
-index 6087df69c..3051fdee6 100644
---- a/src/backends/meta-cursor.h
-+++ b/src/backends/meta-cursor.h
-@@ -25,51 +25,50 @@
- #include <meta/common.h>
- #include <meta/boxes.h>
- 
--typedef struct _MetaCursorSprite MetaCursorSprite;
--
- #define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ())
--G_DECLARE_FINAL_TYPE (MetaCursorSprite,
--                      meta_cursor_sprite,
--                      META, CURSOR_SPRITE,
--                      GObject);
--
--MetaCursorSprite * meta_cursor_sprite_new (void);
--
--MetaCursorSprite * meta_cursor_sprite_from_theme  (MetaCursor cursor);
--
--
--void meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self,
--                                         int               scale);
--
--MetaCursor meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self);
--
--Cursor meta_cursor_create_x_cursor (Display    *xdisplay,
--                                    MetaCursor  cursor);
--
--void meta_cursor_sprite_prepare_at (MetaCursorSprite *self,
-+G_DECLARE_DERIVABLE_TYPE (MetaCursorSprite,
-+                          meta_cursor_sprite,
-+                          META, CURSOR_SPRITE,
-+                          GObject)
-+
-+struct _MetaCursorSpriteClass
-+{
-+  GObjectClass parent_class;
-+
-+  void (* realize_texture) (MetaCursorSprite *sprite);
-+  gboolean (* is_animated) (MetaCursorSprite *sprite);
-+  void (* tick_frame) (MetaCursorSprite *sprite);
-+  unsigned int (* get_current_frame_time) (MetaCursorSprite *sprite);
-+};
-+
-+void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
-                                     int               x,
-                                     int               y);
- 
--void meta_cursor_sprite_realize_texture (MetaCursorSprite *self);
-+void meta_cursor_sprite_realize_texture (MetaCursorSprite *sprite);
-+
-+void meta_cursor_sprite_clear_texture (MetaCursorSprite *sprite);
- 
--void meta_cursor_sprite_set_texture (MetaCursorSprite *self,
-+void meta_cursor_sprite_set_texture (MetaCursorSprite *sprite,
-                                      CoglTexture      *texture,
-                                      int               hot_x,
-                                      int               hot_y);
- 
--void meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self,
-+void meta_cursor_sprite_set_texture_scale (MetaCursorSprite *sprite,
-                                            float             scale);
- 
--CoglTexture *meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self);
-+CoglTexture *meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *sprite);
- 
--void meta_cursor_sprite_get_hotspot (MetaCursorSprite *self,
-+void meta_cursor_sprite_get_hotspot (MetaCursorSprite *sprite,
-                                      int              *hot_x,
-                                      int              *hot_y);
- 
--float meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self);
-+float meta_cursor_sprite_get_texture_scale (MetaCursorSprite *sprite);
-+
-+gboolean meta_cursor_sprite_is_animated (MetaCursorSprite *sprite);
-+
-+void meta_cursor_sprite_tick_frame (MetaCursorSprite *sprite);
- 
--gboolean meta_cursor_sprite_is_animated            (MetaCursorSprite *self);
--void     meta_cursor_sprite_tick_frame             (MetaCursorSprite *self);
--guint    meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self);
-+unsigned int meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *sprite);
- 
- #endif /* META_CURSOR_H */
-diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
-index a29f593ea..042d96ec6 100644
---- a/src/backends/native/meta-backend-native.c
-+++ b/src/backends/native/meta-backend-native.c
-@@ -645,8 +645,6 @@ void meta_backend_native_resume (MetaBackendNative *native)
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitorManagerKms *monitor_manager_kms =
-     META_MONITOR_MANAGER_KMS (monitor_manager);
--  MetaCursorRenderer *cursor_renderer;
--  MetaCursorRendererNative *cursor_renderer_native;
-   ClutterActor *stage;
-   MetaIdleMonitor *idle_monitor;
- 
-@@ -658,10 +656,6 @@ void meta_backend_native_resume (MetaBackendNative *native)
-   stage = meta_backend_get_stage (backend);
-   clutter_actor_queue_redraw (stage);
- 
--  cursor_renderer = meta_backend_get_cursor_renderer (backend);
--  cursor_renderer_native = META_CURSOR_RENDERER_NATIVE (cursor_renderer);
--  meta_cursor_renderer_native_force_update (cursor_renderer_native);
--
-   idle_monitor = meta_backend_get_idle_monitor (backend, 0);
-   meta_idle_monitor_reset_idletime (idle_monitor);
- }
-diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
-index c7326af42..29800953b 100644
---- a/src/backends/native/meta-cursor-renderer-native.c
-+++ b/src/backends/native/meta-cursor-renderer-native.c
-@@ -35,6 +35,7 @@
- #include <meta/meta-backend.h>
- 
- #include "backends/meta-backend-private.h"
-+#include "backends/meta-cursor-sprite-xcursor.h"
- #include "backends/meta-logical-monitor.h"
- #include "backends/meta-monitor.h"
- #include "backends/meta-monitor-manager-private.h"
-@@ -43,6 +44,11 @@
- #include "core/boxes-private.h"
- #include "meta/boxes.h"
- 
-+#ifdef HAVE_WAYLAND
-+#include "wayland/meta-cursor-sprite-wayland.h"
-+#include "wayland/meta-wayland-buffer.h"
-+#endif
-+
- #ifndef DRM_CAP_CURSOR_WIDTH
- #define DRM_CAP_CURSOR_WIDTH 0x8
- #endif
-@@ -113,6 +119,11 @@ static GQuark quark_cursor_renderer_native_gpu_data = 0;
- 
- G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRendererNative, meta_cursor_renderer_native, META_TYPE_CURSOR_RENDERER);
- 
-+static void
-+realize_cursor_sprite (MetaCursorRenderer *renderer,
-+                       MetaCursorSprite   *cursor_sprite,
-+                       GList              *gpus);
-+
- static MetaCursorNativeGpuState *
- get_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
-                       MetaGpuKms              *gpu_kms);
-@@ -152,7 +163,8 @@ static void
- meta_cursor_renderer_native_finalize (GObject *object)
- {
-   MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (renderer);
- 
-   if (priv->animation_timeout_id)
-     g_source_remove (priv->animation_timeout_id);
-@@ -203,7 +215,8 @@ set_crtc_cursor (MetaCursorRendererNative *native,
-                  MetaCrtc                 *crtc,
-                  MetaCursorSprite         *cursor_sprite)
- {
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-   MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
-   MetaGpuKms *gpu_kms;
-   int kms_fd;
-@@ -371,7 +384,8 @@ static void
- update_hw_cursor (MetaCursorRendererNative *native,
-                   MetaCursorSprite         *cursor_sprite)
- {
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-   MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
-   MetaMonitorManager *monitor_manager = priv->monitor_manager;
-   GList *logical_monitors;
-@@ -564,18 +578,15 @@ can_draw_cursor_unscaled (MetaCursorRenderer *renderer,
- 
- static gboolean
- should_have_hw_cursor (MetaCursorRenderer *renderer,
--                       MetaCursorSprite   *cursor_sprite)
-+                       MetaCursorSprite   *cursor_sprite,
-+                       GList              *gpus)
- {
--  MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
--  GList *gpus;
-   GList *l;
-   CoglTexture *texture;
- 
-   if (!cursor_sprite)
-     return FALSE;
- 
--  gpus = meta_monitor_manager_get_gpus (priv->monitor_manager);
-   for (l = gpus; l; l = l->next)
-     {
-       MetaGpuKms *gpu_kms = l->data;
-@@ -609,7 +620,8 @@ should_have_hw_cursor (MetaCursorRenderer *renderer,
- static gboolean
- meta_cursor_renderer_native_update_animation (MetaCursorRendererNative *native)
- {
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-   MetaCursorRenderer *renderer = META_CURSOR_RENDERER (native);
-   MetaCursorSprite *cursor_sprite = meta_cursor_renderer_get_cursor (renderer);
- 
-@@ -621,10 +633,11 @@ meta_cursor_renderer_native_update_animation (MetaCursorRendererNative *native)
- }
- 
- static void
--meta_cursor_renderer_native_trigger_frame (MetaCursorRendererNative *native,
--                                           MetaCursorSprite         *cursor_sprite)
-+maybe_schedule_cursor_sprite_animation_frame (MetaCursorRendererNative *native,
-+                                              MetaCursorSprite         *cursor_sprite)
- {
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-   gboolean cursor_change;
-   guint delay;
- 
-@@ -656,21 +669,78 @@ meta_cursor_renderer_native_trigger_frame (MetaCursorRendererNative *native,
-     }
- }
- 
-+static GList *
-+calculate_cursor_sprite_gpus (MetaCursorRenderer *renderer,
-+                              MetaCursorSprite   *cursor_sprite)
-+{
-+  MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-+  MetaMonitorManager *monitor_manager = priv->monitor_manager;
-+  GList *gpus = NULL;
-+  GList *logical_monitors;
-+  GList *l;
-+  ClutterRect cursor_rect;
-+
-+  cursor_rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite);
-+
-+  logical_monitors =
-+    meta_monitor_manager_get_logical_monitors (monitor_manager);
-+  for (l = logical_monitors; l; l = l->next)
-+    {
-+      MetaLogicalMonitor *logical_monitor = l->data;
-+      MetaRectangle logical_monitor_layout;
-+      ClutterRect logical_monitor_rect;
-+      GList *monitors, *l_mon;
-+
-+      logical_monitor_layout =
-+        meta_logical_monitor_get_layout (logical_monitor);
-+      logical_monitor_rect =
-+        meta_rectangle_to_clutter_rect (&logical_monitor_layout);
-+
-+      if (!clutter_rect_intersection (&cursor_rect, &logical_monitor_rect,
-+                                      NULL))
-+        continue;
-+
-+      monitors = meta_logical_monitor_get_monitors (logical_monitor);
-+      for (l_mon = monitors; l_mon; l_mon = l_mon->next)
-+        {
-+          MetaMonitor *monitor = l_mon->data;
-+          MetaGpu *gpu;
-+
-+          gpu = meta_monitor_get_gpu (monitor);
-+          if (!g_list_find (gpus, gpu))
-+            gpus = g_list_prepend (gpus, gpu);
-+        }
-+    }
-+
-+  return gpus;
-+}
-+
- static gboolean
- meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer,
-                                            MetaCursorSprite   *cursor_sprite)
- {
-   MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
--  MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
-+  MetaCursorRendererNativePrivate *priv =
-+    meta_cursor_renderer_native_get_instance_private (native);
-+  g_autoptr (GList) gpus = NULL;
- 
-   if (cursor_sprite)
--    meta_cursor_sprite_realize_texture (cursor_sprite);
-+    {
-+      meta_cursor_sprite_realize_texture (cursor_sprite);
-+      gpus = calculate_cursor_sprite_gpus (renderer, cursor_sprite);
-+      realize_cursor_sprite (renderer, cursor_sprite, gpus);
-+    }
- 
--  meta_cursor_renderer_native_trigger_frame (native, cursor_sprite);
-+  maybe_schedule_cursor_sprite_animation_frame (native, cursor_sprite);
- 
--  priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite);
-+  priv->has_hw_cursor = should_have_hw_cursor (renderer, cursor_sprite, gpus);
-   update_hw_cursor (native, cursor_sprite);
--  return priv->has_hw_cursor;
-+
-+  return (priv->has_hw_cursor ||
-+          !cursor_sprite ||
-+          !meta_cursor_sprite_get_cogl_texture (cursor_sprite));
- }
- 
- static void
-@@ -706,6 +776,24 @@ ensure_cursor_gpu_state (MetaCursorNativePrivate *cursor_priv,
-   return cursor_gpu_state;
- }
- 
-+static void
-+on_cursor_sprite_texture_changed (MetaCursorSprite *cursor_sprite)
-+{
-+  MetaCursorNativePrivate *cursor_priv = get_cursor_priv (cursor_sprite);
-+  GHashTableIter iter;
-+  MetaCursorNativeGpuState *cursor_gpu_state;
-+
-+  g_hash_table_iter_init (&iter, cursor_priv->gpu_states);
-+  while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &cursor_gpu_state))
-+    {
-+      guint pending_bo;
-+      pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_gpu_state);
-+      g_clear_pointer (&cursor_gpu_state->bos[pending_bo],
-+                       (GDestroyNotify) gbm_bo_destroy);
-+      cursor_gpu_state->pending_bo_state = META_CURSOR_GBM_BO_STATE_INVALIDATED;
-+    }
-+}
-+
- static void
- cursor_priv_free (MetaCursorNativePrivate *cursor_priv)
- {
-@@ -738,6 +826,9 @@ ensure_cursor_priv (MetaCursorSprite *cursor_sprite)
-                            cursor_priv,
-                            (GDestroyNotify) cursor_priv_free);
- 
-+  g_signal_connect (cursor_sprite, "texture-changed",
-+                    G_CALLBACK (on_cursor_sprite_texture_changed), NULL);
-+
-   return cursor_priv;
- }
- 
-@@ -805,57 +896,71 @@ load_cursor_sprite_gbm_buffer_for_gpu (MetaCursorRendererNative *native,
-     }
- }
- 
--static void
--invalidate_pending_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite,
--                                         MetaGpuKms       *gpu_kms)
-+static gboolean
-+is_cursor_hw_state_valid (MetaCursorSprite *cursor_sprite,
-+                          MetaGpuKms       *gpu_kms)
- {
-   MetaCursorNativePrivate *cursor_priv;
-   MetaCursorNativeGpuState *cursor_gpu_state;
--  guint pending_bo;
- 
-   cursor_priv = get_cursor_priv (cursor_sprite);
-   if (!cursor_priv)
--    return;
-+    return FALSE;
- 
-   cursor_gpu_state = get_cursor_gpu_state (cursor_priv, gpu_kms);
-   if (!cursor_gpu_state)
--    return;
-+    return FALSE;
- 
--  pending_bo = get_pending_cursor_sprite_gbm_bo_index (cursor_gpu_state);
--  g_clear_pointer (&cursor_gpu_state->bos[pending_bo],
--                   (GDestroyNotify) gbm_bo_destroy);
--  cursor_gpu_state->pending_bo_state = META_CURSOR_GBM_BO_STATE_INVALIDATED;
-+  switch (cursor_gpu_state->pending_bo_state)
-+    {
-+    case META_CURSOR_GBM_BO_STATE_SET:
-+    case META_CURSOR_GBM_BO_STATE_NONE:
-+      return TRUE;
-+    case META_CURSOR_GBM_BO_STATE_INVALIDATED:
-+      return FALSE;
-+    }
-+
-+  g_assert_not_reached ();
- }
- 
- #ifdef HAVE_WAYLAND
- static void
--meta_cursor_renderer_native_realize_cursor_from_wl_buffer_for_gpu (MetaCursorRenderer *renderer,
--                                                                   MetaGpuKms         *gpu_kms,
--                                                                   MetaCursorSprite   *cursor_sprite,
--                                                                   struct wl_resource *buffer)
-+realize_cursor_sprite_from_wl_buffer_for_gpu (MetaCursorRenderer      *renderer,
-+                                              MetaGpuKms              *gpu_kms,
-+                                              MetaCursorSpriteWayland *sprite_wayland)
- {
-   MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
-+  MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_wayland);
-   MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
-   uint32_t gbm_format;
-   uint64_t cursor_width, cursor_height;
-   CoglTexture *texture;
-   uint width, height;
-+  MetaWaylandBuffer *buffer;
-+  struct wl_resource *buffer_resource;
-+  struct wl_shm_buffer *shm_buffer;
- 
-   cursor_renderer_gpu_data =
-     meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
-   if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
-     return;
- 
--  /* Destroy any previous pending cursor buffer; we'll always either fail (which
--   * should unset, or succeed, which will set new buffer.
--   */
--  invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite, gpu_kms);
-+  if (is_cursor_hw_state_valid (cursor_sprite, gpu_kms))
-+    return;
- 
-   texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
-   width = cogl_texture_get_width (texture);
-   height = cogl_texture_get_height (texture);
- 
--  struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (buffer);
-+  buffer = meta_cursor_sprite_wayland_get_buffer (sprite_wayland);
-+  if (!buffer)
-+    return;
-+
-+  buffer_resource = meta_wayland_buffer_get_resource (buffer);
-+  if (!buffer_resource)
-+    return;
-+
-+  shm_buffer = wl_shm_buffer_get (buffer_resource);
-   if (shm_buffer)
-     {
-       int rowstride = wl_shm_buffer_get_stride (shm_buffer);
-@@ -929,47 +1034,27 @@ meta_cursor_renderer_native_realize_cursor_from_wl_buffer_for_gpu (MetaCursorRen
-       set_pending_cursor_sprite_gbm_bo (cursor_sprite, gpu_kms, bo);
-     }
- }
--
--static void
--meta_cursor_renderer_native_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer,
--                                                           MetaCursorSprite *cursor_sprite,
--                                                           struct wl_resource *buffer)
--{
--  MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
--  MetaCursorRendererNativePrivate *priv =
--	  meta_cursor_renderer_native_get_instance_private (native);
--  GList *gpus;
--  GList *l;
--
--  gpus = meta_monitor_manager_get_gpus (priv->monitor_manager);
--  for (l = gpus; l; l = l->next)
--    {
--      MetaGpuKms *gpu_kms = l->data;
--
--      meta_cursor_renderer_native_realize_cursor_from_wl_buffer_for_gpu (
--        renderer,
--        gpu_kms,
--        cursor_sprite,
--        buffer);
--    }
--}
- #endif
- 
- static void
--meta_cursor_renderer_native_realize_cursor_from_xcursor_for_gpu (MetaCursorRenderer *renderer,
--                                                                 MetaGpuKms         *gpu_kms,
--                                                                 MetaCursorSprite   *cursor_sprite,
--                                                                 XcursorImage       *xc_image)
-+realize_cursor_sprite_from_xcursor_for_gpu (MetaCursorRenderer      *renderer,
-+                                            MetaGpuKms              *gpu_kms,
-+                                            MetaCursorSpriteXcursor *sprite_xcursor)
- {
-   MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
-   MetaCursorRendererNativeGpuData *cursor_renderer_gpu_data;
-+  MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_xcursor);
-+  XcursorImage *xc_image;
- 
-   cursor_renderer_gpu_data =
-     meta_cursor_renderer_native_gpu_data_from_gpu (gpu_kms);
-   if (!cursor_renderer_gpu_data || cursor_renderer_gpu_data->hw_cursor_broken)
-     return;
- 
--  invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite, gpu_kms);
-+  if (is_cursor_hw_state_valid (cursor_sprite, gpu_kms))
-+    return;
-+
-+  xc_image = meta_cursor_sprite_xcursor_get_current_image (sprite_xcursor);
- 
-   load_cursor_sprite_gbm_buffer_for_gpu (native,
-                                          gpu_kms,
-@@ -982,26 +1067,45 @@ meta_cursor_renderer_native_realize_cursor_from_xcursor_for_gpu (MetaCursorRende
- }
- 
- static void
--meta_cursor_renderer_native_realize_cursor_from_xcursor (MetaCursorRenderer *renderer,
--                                                         MetaCursorSprite   *cursor_sprite,
--                                                         XcursorImage       *xc_image)
-+realize_cursor_sprite_for_gpu (MetaCursorRenderer *renderer,
-+                               MetaGpuKms         *gpu_kms,
-+                               MetaCursorSprite   *cursor_sprite)
-+{
-+#ifdef HAVE_WAYLAND
-+  if (META_IS_CURSOR_SPRITE_WAYLAND (cursor_sprite))
-+    {
-+      MetaCursorSpriteWayland *sprite_wayland =
-+        META_CURSOR_SPRITE_WAYLAND (cursor_sprite);
-+
-+      realize_cursor_sprite_from_wl_buffer_for_gpu (renderer,
-+                                                    gpu_kms,
-+                                                    sprite_wayland);
-+    }
-+  else
-+#endif
-+  if (META_IS_CURSOR_SPRITE_XCURSOR (cursor_sprite))
-+    {
-+      MetaCursorSpriteXcursor *sprite_xcursor =
-+        META_CURSOR_SPRITE_XCURSOR (cursor_sprite);
-+
-+      realize_cursor_sprite_from_xcursor_for_gpu (renderer,
-+                                                  gpu_kms,
-+                                                  sprite_xcursor);
-+    }
-+}
-+
-+static void
-+realize_cursor_sprite (MetaCursorRenderer *renderer,
-+                       MetaCursorSprite   *cursor_sprite,
-+                       GList              *gpus)
- {
--  MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
--  MetaCursorRendererNativePrivate *priv =
--	  meta_cursor_renderer_native_get_instance_private (native);
--  GList *gpus;
-   GList *l;
- 
--  gpus = meta_monitor_manager_get_gpus (priv->monitor_manager);
-   for (l = gpus; l; l = l->next)
-     {
-       MetaGpuKms *gpu_kms = l->data;
- 
--      meta_cursor_renderer_native_realize_cursor_from_xcursor_for_gpu (
--        renderer,
--        gpu_kms,
--        cursor_sprite,
--        xc_image);
-+      realize_cursor_sprite_for_gpu (renderer, gpu_kms, cursor_sprite);
-     }
- }
- 
-@@ -1013,12 +1117,6 @@ meta_cursor_renderer_native_class_init (MetaCursorRendererNativeClass *klass)
- 
-   object_class->finalize = meta_cursor_renderer_native_finalize;
-   renderer_class->update_cursor = meta_cursor_renderer_native_update_cursor;
--#ifdef HAVE_WAYLAND
--  renderer_class->realize_cursor_from_wl_buffer =
--    meta_cursor_renderer_native_realize_cursor_from_wl_buffer;
--#endif
--  renderer_class->realize_cursor_from_xcursor =
--    meta_cursor_renderer_native_realize_cursor_from_xcursor;
- 
-   quark_cursor_sprite = g_quark_from_static_string ("-meta-cursor-native");
-   quark_cursor_renderer_native_gpu_data =
-@@ -1033,14 +1131,13 @@ force_update_hw_cursor (MetaCursorRendererNative *native)
-     meta_cursor_renderer_native_get_instance_private (native);
- 
-   priv->hw_state_invalidated = TRUE;
--  update_hw_cursor (native, meta_cursor_renderer_get_cursor (renderer));
-+  meta_cursor_renderer_force_update (renderer);
- }
- 
- static void
- on_monitors_changed (MetaMonitorManager       *monitors,
-                      MetaCursorRendererNative *native)
- {
--  /* Our tracking is all messed up, so force an update. */
-   force_update_hw_cursor (native);
- }
- 
-@@ -1112,9 +1209,3 @@ static void
- meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
- {
- }
--
--void
--meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
--{
--  force_update_hw_cursor (native);
--}
-diff --git a/src/backends/native/meta-cursor-renderer-native.h b/src/backends/native/meta-cursor-renderer-native.h
-index 09203a5f7..fb4c8edc7 100644
---- a/src/backends/native/meta-cursor-renderer-native.h
-+++ b/src/backends/native/meta-cursor-renderer-native.h
-@@ -32,8 +32,6 @@ G_DECLARE_FINAL_TYPE (MetaCursorRendererNative, meta_cursor_renderer_native,
-                       META, CURSOR_RENDERER_NATIVE,
-                       MetaCursorRenderer)
- 
--void meta_cursor_renderer_native_force_update (MetaCursorRendererNative *renderer);
--
- MetaCursorRendererNative * meta_cursor_renderer_native_new (MetaBackend *backend);
- 
- #endif /* META_CURSOR_RENDERER_NATIVE_H */
-diff --git a/src/backends/x11/cm/meta-cursor-sprite-xfixes.c b/src/backends/x11/cm/meta-cursor-sprite-xfixes.c
-new file mode 100644
-index 000000000..143ebb791
---- /dev/null
-+++ b/src/backends/x11/cm/meta-cursor-sprite-xfixes.c
-@@ -0,0 +1,226 @@
-+/*
-+ * Copyright 2013, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "backends/x11/cm/meta-cursor-sprite-xfixes.h"
-+
-+#include <X11/extensions/Xfixes.h>
-+
-+#include "core/display-private.h"
-+
-+enum
-+{
-+  PROP_0,
-+
-+  PROP_DISPLAY,
-+
-+  N_PROPS
-+};
-+
-+static GParamSpec *obj_props[N_PROPS];
-+
-+struct _MetaCursorSpriteXfixes
-+{
-+  MetaCursorSprite parent;
-+
-+  MetaDisplay *display;
-+};
-+
-+static void
-+meta_screen_cast_xfixes_init_initable_iface (GInitableIface *iface);
-+
-+G_DEFINE_TYPE_WITH_CODE (MetaCursorSpriteXfixes,
-+                         meta_cursor_sprite_xfixes,
-+                         META_TYPE_CURSOR_SPRITE,
-+                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
-+                                                meta_screen_cast_xfixes_init_initable_iface))
-+
-+static void
-+meta_cursor_sprite_xfixes_realize_texture (MetaCursorSprite *sprite)
-+{
-+}
-+
-+static gboolean
-+meta_cursor_sprite_xfixes_is_animated (MetaCursorSprite *sprite)
-+{
-+  return FALSE;
-+}
-+
-+static void
-+meta_cursor_sprite_xfixes_get_property (GObject    *object,
-+                                        guint       prop_id,
-+                                        GValue     *value,
-+                                        GParamSpec *pspec)
-+{
-+  MetaCursorSpriteXfixes *sprite_xfixes = META_CURSOR_SPRITE_XFIXES (object);
-+
-+  switch (prop_id)
-+    {
-+    case PROP_DISPLAY:
-+      g_value_set_object (value, sprite_xfixes->display);
-+      break;
-+    default:
-+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+      break;
-+    }
-+}
-+
-+static void
-+meta_cursor_sprite_xfixes_set_property (GObject      *object,
-+                                        guint         prop_id,
-+                                        const GValue *value,
-+                                        GParamSpec   *pspec)
-+{
-+  MetaCursorSpriteXfixes *sprite_xfixes = META_CURSOR_SPRITE_XFIXES (object);
-+
-+  switch (prop_id)
-+    {
-+    case PROP_DISPLAY:
-+      sprite_xfixes->display = g_value_get_object (value);
-+      break;
-+    default:
-+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-+      break;
-+    }
-+}
-+
-+MetaCursorSpriteXfixes *
-+meta_cursor_sprite_xfixes_new (MetaDisplay  *display,
-+                               GError      **error)
-+{
-+  return g_initable_new (META_TYPE_CURSOR_SPRITE_XFIXES,
-+                         NULL, error,
-+                         "display", display,
-+                         NULL);
-+}
-+
-+static gboolean
-+meta_cursor_sprite_xfixes_initable_init (GInitable     *initable,
-+                                         GCancellable  *cancellable,
-+                                         GError       **error)
-+{
-+  MetaCursorSpriteXfixes *sprite_xfixes =
-+    META_CURSOR_SPRITE_XFIXES (initable);
-+  MetaCursorSprite *sprite = META_CURSOR_SPRITE (sprite_xfixes);
-+  XFixesCursorImage *cursor_image;
-+  CoglTexture2D *texture;
-+  uint8_t *cursor_data;
-+  gboolean free_cursor_data;
-+  ClutterBackend *clutter_backend;
-+  CoglContext *cogl_context;
-+
-+  cursor_image = XFixesGetCursorImage (sprite_xfixes->display->xdisplay);
-+  if (!cursor_image)
-+    {
-+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-+                   "Failed to get cursor image");
-+      return FALSE;
-+    }
-+
-+  /*
-+   * Like all X APIs, XFixesGetCursorImage() returns arrays of 32-bit
-+   * quantities as arrays of long; we need to convert on 64 bit
-+   */
-+  if (sizeof (long) == 4)
-+    {
-+      cursor_data = (uint8_t *) cursor_image->pixels;
-+      free_cursor_data = FALSE;
-+    }
-+  else
-+    {
-+      int i, j;
-+      uint32_t *cursor_words;
-+      unsigned long *p;
-+      uint32_t *q;
-+
-+      cursor_words = g_new (uint32_t,
-+                            cursor_image->width * cursor_image->height);
-+      cursor_data = (uint8_t *) cursor_words;
-+
-+      p = cursor_image->pixels;
-+      q = cursor_words;
-+      for (j = 0; j < cursor_image->height; j++)
-+        {
-+          for (i = 0; i < cursor_image->width; i++)
-+            *(q++) = *(p++);
-+        }
-+
-+      free_cursor_data = TRUE;
-+    }
-+
-+  clutter_backend = clutter_get_default_backend ();
-+  cogl_context = clutter_backend_get_cogl_context (clutter_backend);
-+  texture = cogl_texture_2d_new_from_data (cogl_context,
-+                                          cursor_image->width,
-+                                          cursor_image->height,
-+                                          CLUTTER_CAIRO_FORMAT_ARGB32,
-+                                          cursor_image->width * 4, /* stride */
-+                                          cursor_data,
-+                                          error);
-+
-+  if (free_cursor_data)
-+    g_free (cursor_data);
-+
-+  if (!sprite)
-+    return FALSE;
-+
-+  meta_cursor_sprite_set_texture (sprite,
-+                                  COGL_TEXTURE (texture),
-+                                  cursor_image->xhot,
-+                                  cursor_image->yhot);
-+  cogl_object_unref (texture);
-+  XFree (cursor_image);
-+
-+  return TRUE;
-+}
-+
-+static void
-+meta_screen_cast_xfixes_init_initable_iface (GInitableIface *iface)
-+{
-+  iface->init = meta_cursor_sprite_xfixes_initable_init;
-+}
-+
-+static void
-+meta_cursor_sprite_xfixes_init (MetaCursorSpriteXfixes *sprite_xfixes)
-+{
-+}
-+
-+static void
-+meta_cursor_sprite_xfixes_class_init (MetaCursorSpriteXfixesClass *klass)
-+{
-+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-+  MetaCursorSpriteClass *cursor_sprite_class = META_CURSOR_SPRITE_CLASS (klass);
-+
-+  object_class->get_property = meta_cursor_sprite_xfixes_get_property;
-+  object_class->set_property = meta_cursor_sprite_xfixes_set_property;
-+
-+  cursor_sprite_class->realize_texture =
-+    meta_cursor_sprite_xfixes_realize_texture;
-+  cursor_sprite_class->is_animated = meta_cursor_sprite_xfixes_is_animated;
-+
-+  obj_props[PROP_DISPLAY] =
-+    g_param_spec_object ("display",
-+                         "display",
-+                         "MetaDisplay",
-+                         META_TYPE_DISPLAY,
-+                         G_PARAM_READWRITE |
-+                         G_PARAM_CONSTRUCT_ONLY |
-+                         G_PARAM_STATIC_STRINGS);
-+  g_object_class_install_properties (object_class, N_PROPS, obj_props);
-+}
-diff --git a/src/backends/x11/cm/meta-cursor-sprite-xfixes.h b/src/backends/x11/cm/meta-cursor-sprite-xfixes.h
-new file mode 100644
-index 000000000..c7073fc2c
---- /dev/null
-+++ b/src/backends/x11/cm/meta-cursor-sprite-xfixes.h
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright 2013, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#ifndef META_CURSOR_SPRITE_XFIXES_H
-+#define META_CURSOR_SPRITE_XFIXES_H
-+
-+#include <glib-object.h>
-+
-+#include "backends/meta-cursor.h"
-+#include "meta/types.h"
-+
-+#define META_TYPE_CURSOR_SPRITE_XFIXES (meta_cursor_sprite_xfixes_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaCursorSpriteXfixes,
-+                      meta_cursor_sprite_xfixes,
-+                      META, CURSOR_SPRITE_XFIXES,
-+                      MetaCursorSprite)
-+
-+MetaCursorSpriteXfixes * meta_cursor_sprite_xfixes_new (MetaDisplay  *display,
-+                                                        GError      **error);
-+
-+#endif /* META_CURSOR_SPRITE_XFIXES_H */
-diff --git a/src/backends/x11/meta-cursor-renderer-x11.c b/src/backends/x11/meta-cursor-renderer-x11.c
-index 82109f1f3..bb3100a91 100644
---- a/src/backends/x11/meta-cursor-renderer-x11.c
-+++ b/src/backends/x11/meta-cursor-renderer-x11.c
-@@ -30,6 +30,7 @@
- 
- #include "meta-backend-x11.h"
- #include "meta-stage-private.h"
-+#include "backends/meta-cursor-sprite-xcursor.h"
- 
- struct _MetaCursorRendererX11Private
- {
-@@ -59,13 +60,18 @@ meta_cursor_renderer_x11_update_cursor (MetaCursorRenderer *renderer,
- 
-   gboolean has_server_cursor = FALSE;
- 
--  if (cursor_sprite)
-+  if (cursor_sprite && META_IS_CURSOR_SPRITE_XCURSOR (cursor_sprite))
-     {
--      MetaCursor cursor = meta_cursor_sprite_get_meta_cursor (cursor_sprite);
-+      MetaCursorSpriteXcursor *sprite_xcursor =
-+        META_CURSOR_SPRITE_XCURSOR (cursor_sprite);
-+      MetaCursor cursor;
- 
-+      cursor = meta_cursor_sprite_xcursor_get_cursor (sprite_xcursor);
-       if (cursor != META_CURSOR_NONE)
-         {
--          Cursor xcursor = meta_cursor_create_x_cursor (xdisplay, cursor);
-+          Cursor xcursor;
-+
-+          xcursor = meta_create_x_cursor (xdisplay, cursor);
-           XDefineCursor (xdisplay, xwindow, xcursor);
-           XFlush (xdisplay);
-           XFreeCursor (xdisplay, xcursor);
-diff --git a/src/backends/x11/nested/meta-cursor-renderer-x11-nested.c b/src/backends/x11/nested/meta-cursor-renderer-x11-nested.c
-index da1a56038..0daae683c 100644
---- a/src/backends/x11/nested/meta-cursor-renderer-x11-nested.c
-+++ b/src/backends/x11/nested/meta-cursor-renderer-x11-nested.c
-@@ -26,6 +26,8 @@
- 
- #include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
- 
-+#include <X11/Xcursor/Xcursor.h>
-+
- #include "backends/x11/meta-backend-x11.h"
- 
- struct _MetaCursorRendererX11Nested
-diff --git a/src/core/display.c b/src/core/display.c
-index d6da84b30..e7dd4534b 100644
---- a/src/core/display.c
-+++ b/src/core/display.c
-@@ -3018,7 +3018,7 @@ Cursor
- meta_display_create_x_cursor (MetaDisplay *display,
-                               MetaCursor   cursor)
- {
--  return meta_cursor_create_x_cursor (display->xdisplay, cursor);
-+  return meta_create_x_cursor (display->xdisplay, cursor);
- }
- 
- MetaGestureTracker *
-diff --git a/src/core/screen.c b/src/core/screen.c
-index c14bba0cf..048104150 100644
---- a/src/core/screen.c
-+++ b/src/core/screen.c
-@@ -60,6 +60,7 @@
- #include "x11/xprops.h"
- 
- #include "backends/x11/meta-backend-x11.h"
-+#include "backends/meta-cursor-sprite-xcursor.h"
- 
- static char* get_screen_name (MetaDisplay *display,
-                               int          number);
-@@ -1323,12 +1324,13 @@ find_highest_logical_monitor_scale (MetaBackend      *backend,
- }
- 
- static void
--root_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
--                        int               x,
--                        int               y,
--                        MetaScreen       *screen)
-+root_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
-+                        int                      x,
-+                        int                      y,
-+                        MetaScreen              *screen)
- {
-   MetaBackend *backend = meta_get_backend ();
-+  MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (sprite_xcursor);
- 
-   if (meta_is_stage_views_scaled ())
-     {
-@@ -1337,7 +1339,7 @@ root_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
-       scale = find_highest_logical_monitor_scale (backend, cursor_sprite);
-       if (scale != 0.0)
-         {
--          meta_cursor_sprite_set_theme_scale (cursor_sprite, scale);
-+          meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor, scale);
-           meta_cursor_sprite_set_texture_scale (cursor_sprite, 1.0 / scale);
-         }
-     }
-@@ -1353,18 +1355,18 @@ root_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
-       /* Reload the cursor texture if the scale has changed. */
-       if (logical_monitor)
-         {
--          meta_cursor_sprite_set_theme_scale (cursor_sprite,
--                                              logical_monitor->scale);
-+          meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
-+                                                      logical_monitor->scale);
-           meta_cursor_sprite_set_texture_scale (cursor_sprite, 1.0);
-         }
-     }
- }
- 
- static void
--manage_root_cursor_sprite_scale (MetaScreen       *screen,
--                                 MetaCursorSprite *cursor_sprite)
-+manage_root_cursor_sprite_scale (MetaScreen              *screen,
-+                                 MetaCursorSpriteXcursor *sprite_xcursor)
- {
--  g_signal_connect_object (cursor_sprite,
-+  g_signal_connect_object (sprite_xcursor,
-                            "prepare-at",
-                            G_CALLBACK (root_cursor_prepare_at),
-                            screen,
-@@ -1377,17 +1379,18 @@ meta_screen_update_cursor (MetaScreen *screen)
-   MetaDisplay *display = screen->display;
-   MetaCursor cursor = screen->current_cursor;
-   Cursor xcursor;
--  MetaCursorSprite *cursor_sprite;
-+  MetaCursorSpriteXcursor *sprite_xcursor;
-   MetaBackend *backend = meta_get_backend ();
-   MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
- 
--  cursor_sprite = meta_cursor_sprite_from_theme (cursor);
-+  sprite_xcursor = meta_cursor_sprite_xcursor_new (cursor);
- 
-   if (meta_is_wayland_compositor ())
--    manage_root_cursor_sprite_scale (screen, cursor_sprite);
-+    manage_root_cursor_sprite_scale (screen, sprite_xcursor);
- 
--  meta_cursor_tracker_set_root_cursor (cursor_tracker, cursor_sprite);
--  g_object_unref (cursor_sprite);
-+  meta_cursor_tracker_set_root_cursor (cursor_tracker,
-+                                       META_CURSOR_SPRITE (sprite_xcursor));
-+  g_object_unref (sprite_xcursor);
- 
-   /* Set a cursor for X11 applications that don't specify their own */
-   xcursor = meta_display_create_x_cursor (display, cursor);
-diff --git a/src/wayland/meta-cursor-sprite-wayland.c b/src/wayland/meta-cursor-sprite-wayland.c
-new file mode 100644
-index 000000000..7c14960ff
---- /dev/null
-+++ b/src/wayland/meta-cursor-sprite-wayland.c
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright 2015, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#include "config.h"
-+
-+#include "wayland/meta-cursor-sprite-wayland.h"
-+
-+struct _MetaCursorSpriteWayland
-+{
-+  MetaCursorSprite parent;
-+
-+  MetaWaylandSurface *surface;
-+};
-+
-+G_DEFINE_TYPE (MetaCursorSpriteWayland,
-+               meta_cursor_sprite_wayland,
-+               META_TYPE_CURSOR_SPRITE)
-+
-+static void
-+meta_cursor_sprite_wayland_realize_texture (MetaCursorSprite *sprite)
-+{
-+}
-+
-+static gboolean
-+meta_cursor_sprite_wayland_is_animated (MetaCursorSprite *sprite)
-+{
-+  return FALSE;
-+}
-+
-+MetaCursorSpriteWayland *
-+meta_cursor_sprite_wayland_new (MetaWaylandSurface *surface)
-+{
-+  MetaCursorSpriteWayland *sprite_wayland;
-+
-+  sprite_wayland = g_object_new (META_TYPE_CURSOR_SPRITE_WAYLAND, NULL);
-+  sprite_wayland->surface = surface;
-+
-+  return sprite_wayland;
-+}
-+
-+MetaWaylandBuffer *
-+meta_cursor_sprite_wayland_get_buffer (MetaCursorSpriteWayland *sprite_wayland)
-+{
-+  return meta_wayland_surface_get_buffer (sprite_wayland->surface);
-+}
-+
-+static void
-+meta_cursor_sprite_wayland_init (MetaCursorSpriteWayland *sprite_wayland)
-+{
-+}
-+
-+static void
-+meta_cursor_sprite_wayland_class_init (MetaCursorSpriteWaylandClass *klass)
-+{
-+  MetaCursorSpriteClass *cursor_sprite_class = META_CURSOR_SPRITE_CLASS (klass);
-+
-+  cursor_sprite_class->realize_texture =
-+    meta_cursor_sprite_wayland_realize_texture;
-+  cursor_sprite_class->is_animated = meta_cursor_sprite_wayland_is_animated;
-+}
-diff --git a/src/wayland/meta-cursor-sprite-wayland.h b/src/wayland/meta-cursor-sprite-wayland.h
-new file mode 100644
-index 000000000..107698f3f
---- /dev/null
-+++ b/src/wayland/meta-cursor-sprite-wayland.h
-@@ -0,0 +1,35 @@
-+/*
-+ * Copyright 2013, 2018 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ *
-+ */
-+
-+#ifndef META_CURSOR_SPRITE_WAYLAND_H
-+#define META_CURSOR_SPRITE_WAYLAND_H
-+
-+#include <glib-object.h>
-+
-+#include "backends/meta-cursor.h"
-+#include "wayland/meta-wayland-surface.h"
-+
-+#define META_TYPE_CURSOR_SPRITE_WAYLAND meta_cursor_sprite_wayland_get_type ()
-+G_DECLARE_FINAL_TYPE (MetaCursorSpriteWayland, meta_cursor_sprite_wayland,
-+                      META, CURSOR_SPRITE_WAYLAND, MetaCursorSprite)
-+
-+MetaCursorSpriteWayland * meta_cursor_sprite_wayland_new (MetaWaylandSurface *surface);
-+
-+MetaWaylandBuffer * meta_cursor_sprite_wayland_get_buffer (MetaCursorSpriteWayland *sprite_wayland);
-+
-+#endif /* META_CURSOR_SPRITE_WAYLAND_H */
-diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
-index 55564492a..c759eefc1 100644
---- a/src/wayland/meta-wayland-buffer.c
-+++ b/src/wayland/meta-wayland-buffer.c
-@@ -88,6 +88,12 @@ meta_wayland_buffer_from_resource (struct wl_resource *resource)
-   return buffer;
- }
- 
-+struct wl_resource *
-+meta_wayland_buffer_get_resource (MetaWaylandBuffer *buffer)
-+{
-+  return buffer->resource;
-+}
-+
- static gboolean
- meta_wayland_buffer_is_realized (MetaWaylandBuffer *buffer)
- {
-diff --git a/src/wayland/meta-wayland-buffer.h b/src/wayland/meta-wayland-buffer.h
-index 5345033c2..e00a41e09 100644
---- a/src/wayland/meta-wayland-buffer.h
-+++ b/src/wayland/meta-wayland-buffer.h
-@@ -68,6 +68,7 @@ G_DECLARE_FINAL_TYPE (MetaWaylandBuffer, meta_wayland_buffer,
-                       META, WAYLAND_BUFFER, GObject);
- 
- MetaWaylandBuffer *     meta_wayland_buffer_from_resource       (struct wl_resource    *resource);
-+struct wl_resource *    meta_wayland_buffer_get_resource        (MetaWaylandBuffer     *buffer);
- gboolean                meta_wayland_buffer_attach              (MetaWaylandBuffer     *buffer,
-                                                                  GError               **error);
- CoglTexture *           meta_wayland_buffer_get_texture         (MetaWaylandBuffer     *buffer);
-diff --git a/src/wayland/meta-wayland-surface-role-cursor.c b/src/wayland/meta-wayland-cursor-surface.c
-similarity index 52%
-rename from src/wayland/meta-wayland-surface-role-cursor.c
-rename to src/wayland/meta-wayland-cursor-surface.c
-index d118a8917..d08af9e8c 100644
---- a/src/wayland/meta-wayland-surface-role-cursor.c
-+++ b/src/wayland/meta-wayland-cursor-surface.c
-@@ -23,7 +23,7 @@
- 
- #include <cogl/cogl.h>
- #include <cogl/cogl-wayland-server.h>
--#include "meta-wayland-surface-role-cursor.h"
-+#include "meta-wayland-cursor-surface.h"
- #include "meta-wayland-buffer.h"
- #include "meta-xwayland.h"
- #include "screen-private.h"
-@@ -31,35 +31,38 @@
- #include "backends/meta-backend-private.h"
- #include "backends/meta-logical-monitor.h"
- #include "core/boxes-private.h"
-+#include "wayland/meta-cursor-sprite-wayland.h"
- 
--typedef struct _MetaWaylandSurfaceRoleCursorPrivate MetaWaylandSurfaceRoleCursorPrivate;
-+typedef struct _MetaWaylandCursorSurfacePrivate MetaWaylandCursorSurfacePrivate;
- 
--struct _MetaWaylandSurfaceRoleCursorPrivate
-+struct _MetaWaylandCursorSurfacePrivate
- {
-   int hot_x;
-   int hot_y;
--  MetaCursorSprite *cursor_sprite;
-+  MetaCursorSpriteWayland *cursor_sprite;
-   MetaCursorRenderer *cursor_renderer;
-   MetaWaylandBuffer *buffer;
-   struct wl_list frame_callbacks;
-   gulong cursor_painted_handler_id;
- };
- 
--G_DEFINE_TYPE_WITH_PRIVATE (MetaWaylandSurfaceRoleCursor,
--                            meta_wayland_surface_role_cursor,
-+G_DEFINE_TYPE_WITH_PRIVATE (MetaWaylandCursorSurface,
-+                            meta_wayland_cursor_surface,
-                             META_TYPE_WAYLAND_SURFACE_ROLE)
- 
- static void
--update_cursor_sprite_texture (MetaWaylandSurfaceRoleCursor *cursor_role)
-+update_cursor_sprite_texture (MetaWaylandCursorSurface *cursor_surface)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv = meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
--  MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (META_WAYLAND_SURFACE_ROLE (cursor_role));
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-+  MetaWaylandSurface *surface =
-+    meta_wayland_surface_role_get_surface (META_WAYLAND_SURFACE_ROLE (cursor_surface));
-   MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
--  MetaCursorSprite *cursor_sprite = priv->cursor_sprite;
-+  MetaCursorSprite *cursor_sprite = META_CURSOR_SPRITE (priv->cursor_sprite);
- 
-   g_return_if_fail (!buffer || buffer->texture);
- 
--  if (!priv->cursor_renderer || !cursor_sprite)
-+  if (!priv->cursor_renderer)
-     return;
- 
-   if (buffer)
-@@ -68,20 +71,6 @@ update_cursor_sprite_texture (MetaWaylandSurfaceRoleCursor *cursor_role)
-                                       buffer->texture,
-                                       priv->hot_x * surface->scale,
-                                       priv->hot_y * surface->scale);
--
--      if (priv->buffer)
--        {
--          struct wl_resource *buffer_resource;
--
--          g_assert (priv->buffer == buffer);
--          buffer_resource = buffer->resource;
--          meta_cursor_renderer_realize_cursor_from_wl_buffer (priv->cursor_renderer,
--                                                              cursor_sprite,
--                                                              buffer_resource);
--
--          meta_wayland_surface_unref_buffer_use_count (surface);
--          g_clear_object (&priv->buffer);
--        }
-     }
-   else
-     {
-@@ -92,12 +81,12 @@ update_cursor_sprite_texture (MetaWaylandSurfaceRoleCursor *cursor_role)
- }
- 
- static void
--cursor_sprite_prepare_at (MetaCursorSprite             *cursor_sprite,
--                          int                           x,
--                          int                           y,
--                          MetaWaylandSurfaceRoleCursor *cursor_role)
-+cursor_sprite_prepare_at (MetaCursorSprite         *cursor_sprite,
-+                          int                       x,
-+                          int                       y,
-+                          MetaWaylandCursorSurface *cursor_surface)
- {
--  MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_role);
-+  MetaWaylandSurfaceRole *role = META_WAYLAND_SURFACE_ROLE (cursor_surface);
-   MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (role);
- 
-   if (!meta_xwayland_is_xwayland_surface (surface))
-@@ -126,14 +115,14 @@ cursor_sprite_prepare_at (MetaCursorSprite             *cursor_sprite,
- }
- 
- static void
--cursor_surface_role_assigned (MetaWaylandSurfaceRole *surface_role)
-+meta_wayland_cursor_surface_assigned (MetaWaylandSurfaceRole *surface_role)
- {
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (surface_role);
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (surface_role);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (surface_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
-   wl_list_insert_list (&priv->frame_callbacks,
-                        &surface->pending_frame_callback_list);
-@@ -141,13 +130,13 @@ cursor_surface_role_assigned (MetaWaylandSurfaceRole *surface_role)
- }
- 
- static void
--cursor_surface_role_pre_commit (MetaWaylandSurfaceRole  *surface_role,
--                                MetaWaylandPendingState *pending)
-+meta_wayland_cursor_surface_pre_commit (MetaWaylandSurfaceRole  *surface_role,
-+                                        MetaWaylandPendingState *pending)
- {
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (surface_role);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (surface_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (surface_role);
- 
-@@ -159,13 +148,13 @@ cursor_surface_role_pre_commit (MetaWaylandSurfaceRole  *surface_role,
- }
- 
- static void
--cursor_surface_role_commit (MetaWaylandSurfaceRole  *surface_role,
--                            MetaWaylandPendingState *pending)
-+meta_wayland_cursor_surface_commit (MetaWaylandSurfaceRole  *surface_role,
-+                                    MetaWaylandPendingState *pending)
- {
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (surface_role);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (surface_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (surface_role);
-   MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface);
-@@ -182,19 +171,19 @@ cursor_surface_role_commit (MetaWaylandSurfaceRole  *surface_role,
-   wl_list_init (&pending->frame_callback_list);
- 
-   if (pending->newly_attached)
--    update_cursor_sprite_texture (META_WAYLAND_SURFACE_ROLE_CURSOR (surface_role));
-+    update_cursor_sprite_texture (META_WAYLAND_CURSOR_SURFACE (surface_role));
- }
- 
- static gboolean
--cursor_surface_role_is_on_logical_monitor (MetaWaylandSurfaceRole *role,
--                                           MetaLogicalMonitor     *logical_monitor)
-+meta_wayland_cursor_surface_is_on_logical_monitor (MetaWaylandSurfaceRole *role,
-+                                                   MetaLogicalMonitor     *logical_monitor)
- {
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (role);
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (surface->role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   ClutterPoint point;
-   ClutterRect logical_monitor_rect;
- 
-@@ -207,12 +196,12 @@ cursor_surface_role_is_on_logical_monitor (MetaWaylandSurfaceRole *role,
- }
- 
- static void
--cursor_surface_role_dispose (GObject *object)
-+meta_wayland_cursor_surface_dispose (GObject *object)
- {
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (object);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (object);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (META_WAYLAND_SURFACE_ROLE (object));
-   MetaWaylandFrameCallback *cb, *next;
-@@ -221,7 +210,7 @@ cursor_surface_role_dispose (GObject *object)
-     wl_resource_destroy (cb->resource);
- 
-   g_signal_handlers_disconnect_by_func (priv->cursor_sprite,
--                                        cursor_sprite_prepare_at, cursor_role);
-+                                        cursor_sprite_prepare_at, cursor_surface);
- 
-   g_clear_object (&priv->cursor_renderer);
-   g_clear_object (&priv->cursor_sprite);
-@@ -232,18 +221,18 @@ cursor_surface_role_dispose (GObject *object)
-       g_clear_object (&priv->buffer);
-     }
- 
--  G_OBJECT_CLASS (meta_wayland_surface_role_cursor_parent_class)->dispose (object);
-+  G_OBJECT_CLASS (meta_wayland_cursor_surface_parent_class)->dispose (object);
- }
- 
- static void
--cursor_surface_role_constructed (GObject *object)
-+meta_wayland_cursor_surface_constructed (GObject *object)
- {
--  MetaWaylandSurfaceRoleCursor *cursor_role =
--    META_WAYLAND_SURFACE_ROLE_CURSOR (object);
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurface *cursor_surface =
-+    META_WAYLAND_CURSOR_SURFACE (object);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   MetaWaylandSurfaceRole *surface_role =
--    META_WAYLAND_SURFACE_ROLE (cursor_role);
-+    META_WAYLAND_SURFACE_ROLE (cursor_surface);
-   MetaWaylandSurface *surface =
-     meta_wayland_surface_role_get_surface (surface_role);
-   MetaWaylandBuffer *buffer;
-@@ -257,55 +246,57 @@ cursor_surface_role_constructed (GObject *object)
-       g_set_object (&priv->buffer, buffer);
-       meta_wayland_surface_ref_buffer_use_count (surface);
-     }
--}
- 
--static void
--meta_wayland_surface_role_cursor_init (MetaWaylandSurfaceRoleCursor *role)
--{
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (role);
--
--  priv->cursor_sprite = meta_cursor_sprite_new ();
-+  priv->cursor_sprite = meta_cursor_sprite_wayland_new (surface);
-   g_signal_connect_object (priv->cursor_sprite,
-                            "prepare-at",
-                            G_CALLBACK (cursor_sprite_prepare_at),
--                           role,
-+                           cursor_surface,
-                            0);
-+}
-+
-+static void
-+meta_wayland_cursor_surface_init (MetaWaylandCursorSurface *role)
-+{
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (role);
-+
-   wl_list_init (&priv->frame_callbacks);
- }
- 
- static void
--meta_wayland_surface_role_cursor_class_init (MetaWaylandSurfaceRoleCursorClass *klass)
-+meta_wayland_cursor_surface_class_init (MetaWaylandCursorSurfaceClass *klass)
- {
-   MetaWaylandSurfaceRoleClass *surface_role_class =
-     META_WAYLAND_SURFACE_ROLE_CLASS (klass);
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
- 
--  surface_role_class->assigned = cursor_surface_role_assigned;
--  surface_role_class->pre_commit = cursor_surface_role_pre_commit;
--  surface_role_class->commit = cursor_surface_role_commit;
--  surface_role_class->is_on_logical_monitor = cursor_surface_role_is_on_logical_monitor;
-+  surface_role_class->assigned = meta_wayland_cursor_surface_assigned;
-+  surface_role_class->pre_commit = meta_wayland_cursor_surface_pre_commit;
-+  surface_role_class->commit = meta_wayland_cursor_surface_commit;
-+  surface_role_class->is_on_logical_monitor =
-+    meta_wayland_cursor_surface_is_on_logical_monitor;
- 
--  object_class->constructed = cursor_surface_role_constructed;
--  object_class->dispose = cursor_surface_role_dispose;
-+  object_class->constructed = meta_wayland_cursor_surface_constructed;
-+  object_class->dispose = meta_wayland_cursor_surface_dispose;
- }
- 
- MetaCursorSprite *
--meta_wayland_surface_role_cursor_get_sprite (MetaWaylandSurfaceRoleCursor *cursor_role)
-+meta_wayland_cursor_surface_get_sprite (MetaWaylandCursorSurface *cursor_surface)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
--  return priv->cursor_sprite;
-+  return META_CURSOR_SPRITE (priv->cursor_sprite);
- }
- 
- void
--meta_wayland_surface_role_cursor_set_hotspot (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                              gint                          hotspot_x,
--                                              gint                          hotspot_y)
-+meta_wayland_cursor_surface_set_hotspot (MetaWaylandCursorSurface *cursor_surface,
-+                                         int                       hotspot_x,
-+                                         int                       hotspot_y)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
-   if (priv->hot_x == hotspot_x &&
-       priv->hot_y == hotspot_y)
-@@ -313,16 +304,16 @@ meta_wayland_surface_role_cursor_set_hotspot (MetaWaylandSurfaceRoleCursor *curs
- 
-   priv->hot_x = hotspot_x;
-   priv->hot_y = hotspot_y;
--  update_cursor_sprite_texture (cursor_role);
-+  update_cursor_sprite_texture (cursor_surface);
- }
- 
- void
--meta_wayland_surface_role_cursor_get_hotspot (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                              gint                         *hotspot_x,
--                                              gint                         *hotspot_y)
-+meta_wayland_cursor_surface_get_hotspot (MetaWaylandCursorSurface *cursor_surface,
-+                                         int                      *hotspot_x,
-+                                         int                      *hotspot_y)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
-   if (hotspot_x)
-     *hotspot_x = priv->hot_x;
-@@ -331,15 +322,15 @@ meta_wayland_surface_role_cursor_get_hotspot (MetaWaylandSurfaceRoleCursor *curs
- }
- 
- static void
--on_cursor_painted (MetaCursorRenderer           *renderer,
--                   MetaCursorSprite             *displayed_sprite,
--                   MetaWaylandSurfaceRoleCursor *cursor_role)
-+on_cursor_painted (MetaCursorRenderer       *renderer,
-+                   MetaCursorSprite         *displayed_sprite,
-+                   MetaWaylandCursorSurface *cursor_surface)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
-   guint32 time = (guint32) (g_get_monotonic_time () / 1000);
- 
--  if (displayed_sprite != priv->cursor_sprite)
-+  if (displayed_sprite != META_CURSOR_SPRITE (priv->cursor_sprite))
-     return;
- 
-   while (!wl_list_empty (&priv->frame_callbacks))
-@@ -353,11 +344,11 @@ on_cursor_painted (MetaCursorRenderer           *renderer,
- }
- 
- void
--meta_wayland_surface_role_cursor_set_renderer (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                               MetaCursorRenderer           *renderer)
-+meta_wayland_cursor_surface_set_renderer (MetaWaylandCursorSurface *cursor_surface,
-+                                          MetaCursorRenderer       *renderer)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
-   if (priv->cursor_renderer == renderer)
-     return;
-@@ -373,19 +364,19 @@ meta_wayland_surface_role_cursor_set_renderer (MetaWaylandSurfaceRoleCursor *cur
-     {
-       priv->cursor_painted_handler_id =
-         g_signal_connect_object (renderer, "cursor-painted",
--                                 G_CALLBACK (on_cursor_painted), cursor_role, 0);
-+                                 G_CALLBACK (on_cursor_painted), cursor_surface, 0);
-       g_object_ref (renderer);
-     }
- 
-   priv->cursor_renderer = renderer;
--  update_cursor_sprite_texture (cursor_role);
-+  update_cursor_sprite_texture (cursor_surface);
- }
- 
- MetaCursorRenderer *
--meta_wayland_surface_role_cursor_get_renderer (MetaWaylandSurfaceRoleCursor *cursor_role)
-+meta_wayland_cursor_surface_get_renderer (MetaWaylandCursorSurface *cursor_surface)
- {
--  MetaWaylandSurfaceRoleCursorPrivate *priv =
--    meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
-+  MetaWaylandCursorSurfacePrivate *priv =
-+    meta_wayland_cursor_surface_get_instance_private (cursor_surface);
- 
-   return priv->cursor_renderer;
- }
-diff --git a/src/wayland/meta-wayland-cursor-surface.h b/src/wayland/meta-wayland-cursor-surface.h
-new file mode 100644
-index 000000000..2461a85b3
---- /dev/null
-+++ b/src/wayland/meta-wayland-cursor-surface.h
-@@ -0,0 +1,52 @@
-+/*
-+ * Wayland Support
-+ *
-+ * Copyright (C) 2015 Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-+ * 02111-1307, USA.
-+ */
-+
-+#ifndef META_WAYLAND_CURSOR_SURFACE_H
-+#define META_WAYLAND_CURSOR_SURFACE_H
-+
-+#include "meta-wayland-surface.h"
-+#include "backends/meta-cursor-renderer.h"
-+
-+struct _MetaWaylandCursorSurfaceClass
-+{
-+  MetaWaylandSurfaceRoleClass parent_class;
-+};
-+
-+#define META_TYPE_WAYLAND_CURSOR_SURFACE (meta_wayland_cursor_surface_get_type ())
-+G_DECLARE_DERIVABLE_TYPE (MetaWaylandCursorSurface,
-+                          meta_wayland_cursor_surface,
-+                          META, WAYLAND_CURSOR_SURFACE,
-+                          MetaWaylandSurfaceRole);
-+
-+MetaCursorSprite *   meta_wayland_cursor_surface_get_sprite   (MetaWaylandCursorSurface *cursor_surface);
-+
-+void                 meta_wayland_cursor_surface_set_hotspot  (MetaWaylandCursorSurface *cursor_surface,
-+                                                               int                       hotspot_x,
-+                                                               int                       hotspot_y);
-+void                 meta_wayland_cursor_surface_get_hotspot  (MetaWaylandCursorSurface *cursor_surface,
-+                                                               int                       *hotspot_x,
-+                                                               int                       *hotspot_y);
-+void                 meta_wayland_cursor_surface_set_renderer (MetaWaylandCursorSurface *cursor_surface,
-+                                                               MetaCursorRenderer       *renderer);
-+MetaCursorRenderer * meta_wayland_cursor_surface_get_renderer (MetaWaylandCursorSurface *cursor_surface);
-+
-+
-+#endif /* META_WAYLAND_CURSOR_SURFACE_H */
-diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
-index d5c90c169..e8138576e 100644
---- a/src/wayland/meta-wayland-pointer.c
-+++ b/src/wayland/meta-wayland-pointer.c
-@@ -55,7 +55,7 @@
- #include "meta-wayland-seat.h"
- #include "meta-wayland-surface.h"
- #include "meta-wayland-buffer.h"
--#include "meta-wayland-surface-role-cursor.h"
-+#include "meta-wayland-cursor-surface.h"
- #include "meta-xwayland.h"
- #include "meta-cursor.h"
- #include "meta-cursor-tracker-private.h"
-@@ -1025,10 +1025,10 @@ meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer)
- 
-       if (pointer->cursor_surface)
-         {
--          MetaWaylandSurfaceRoleCursor *cursor_role =
--            META_WAYLAND_SURFACE_ROLE_CURSOR (pointer->cursor_surface->role);
-+          MetaWaylandCursorSurface *cursor_surface =
-+            META_WAYLAND_CURSOR_SURFACE (pointer->cursor_surface->role);
- 
--          cursor_sprite = meta_wayland_surface_role_cursor_get_sprite (cursor_role);
-+          cursor_sprite = meta_wayland_cursor_surface_get_sprite (cursor_surface);
-         }
- 
-       meta_cursor_tracker_set_window_cursor (cursor_tracker, cursor_sprite);
-@@ -1102,7 +1102,7 @@ pointer_set_cursor (struct wl_client *client,
- 
-   if (surface &&
-       !meta_wayland_surface_assign_role (surface,
--                                         META_TYPE_WAYLAND_SURFACE_ROLE_CURSOR,
-+                                         META_TYPE_WAYLAND_CURSOR_SURFACE,
-                                          NULL))
-     {
-       wl_resource_post_error (resource, WL_POINTER_ERROR_ROLE,
-@@ -1115,13 +1115,13 @@ pointer_set_cursor (struct wl_client *client,
-     {
-       MetaCursorRenderer *cursor_renderer =
-         meta_backend_get_cursor_renderer (meta_get_backend ());
--      MetaWaylandSurfaceRoleCursor *cursor_role;
-+      MetaWaylandCursorSurface *cursor_surface;
- 
--      cursor_role = META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role);
--      meta_wayland_surface_role_cursor_set_renderer (cursor_role,
--                                                     cursor_renderer);
--      meta_wayland_surface_role_cursor_set_hotspot (cursor_role,
--                                                    hot_x, hot_y);
-+      cursor_surface = META_WAYLAND_CURSOR_SURFACE (surface->role);
-+      meta_wayland_cursor_surface_set_renderer (cursor_surface,
-+                                                cursor_renderer);
-+      meta_wayland_cursor_surface_set_hotspot (cursor_surface,
-+                                               hot_x, hot_y);
-     }
- 
-   meta_wayland_pointer_set_cursor_surface (pointer, surface);
-diff --git a/src/wayland/meta-wayland-surface-role-cursor.h b/src/wayland/meta-wayland-surface-role-cursor.h
-deleted file mode 100644
-index b6d6d4a6a..000000000
---- a/src/wayland/meta-wayland-surface-role-cursor.h
-+++ /dev/null
-@@ -1,52 +0,0 @@
--/*
-- * Wayland Support
-- *
-- * Copyright (C) 2015 Red Hat, Inc.
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License as
-- * published by the Free Software Foundation; either version 2 of the
-- * License, or (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful, but
-- * WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-- * General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-- * 02111-1307, USA.
-- */
--
--#ifndef META_WAYLAND_SURFACE_ROLE_CURSOR_H
--#define META_WAYLAND_SURFACE_ROLE_CURSOR_H
--
--#include "meta-wayland-surface.h"
--#include "backends/meta-cursor-renderer.h"
--
--struct _MetaWaylandSurfaceRoleCursorClass
--{
--  MetaWaylandSurfaceRoleClass parent_class;
--};
--
--#define META_TYPE_WAYLAND_SURFACE_ROLE_CURSOR (meta_wayland_surface_role_cursor_get_type ())
--G_DECLARE_DERIVABLE_TYPE (MetaWaylandSurfaceRoleCursor,
--                          meta_wayland_surface_role_cursor,
--                          META, WAYLAND_SURFACE_ROLE_CURSOR,
--                          MetaWaylandSurfaceRole);
--
--MetaCursorSprite *   meta_wayland_surface_role_cursor_get_sprite   (MetaWaylandSurfaceRoleCursor *cursor_role);
--
--void                 meta_wayland_surface_role_cursor_set_hotspot  (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                                                    gint                          hotspot_x,
--                                                                    gint                          hotspot_y);
--void                 meta_wayland_surface_role_cursor_get_hotspot  (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                                                    gint                         *hotspot_x,
--                                                                    gint                         *hotspot_y);
--void                 meta_wayland_surface_role_cursor_set_renderer (MetaWaylandSurfaceRoleCursor *cursor_role,
--                                                                    MetaCursorRenderer           *renderer);
--MetaCursorRenderer * meta_wayland_surface_role_cursor_get_renderer (MetaWaylandSurfaceRoleCursor *cursor_role);
--
--
--#endif /* META_WAYLAND_SURFACE_ROLE_CURSOR_H */
-diff --git a/src/wayland/meta-wayland-surface-role-tablet-cursor.c b/src/wayland/meta-wayland-tablet-cursor-surface.c
-similarity index 63%
-rename from src/wayland/meta-wayland-surface-role-tablet-cursor.c
-rename to src/wayland/meta-wayland-tablet-cursor-surface.c
-index 075a5e4f6..808bf2820 100644
---- a/src/wayland/meta-wayland-surface-role-tablet-cursor.c
-+++ b/src/wayland/meta-wayland-tablet-cursor-surface.c
-@@ -20,23 +20,24 @@
-  */
- 
- #include "config.h"
--#include "meta-wayland-surface-role-tablet-cursor.h"
- 
--struct _MetaWaylandSurfaceRoleTabletCursor
-+#include "meta-wayland-tablet-cursor-surface.h"
-+
-+struct _MetaWaylandTabletCursorSurface
- {
--  MetaWaylandSurfaceRoleCursor parent;
-+  MetaWaylandCursorSurface parent;
- };
- 
--G_DEFINE_TYPE (MetaWaylandSurfaceRoleTabletCursor,
--               meta_wayland_surface_role_tablet_cursor,
--               META_TYPE_WAYLAND_SURFACE_ROLE_CURSOR)
-+G_DEFINE_TYPE (MetaWaylandTabletCursorSurface,
-+               meta_wayland_tablet_cursor_surface,
-+               META_TYPE_WAYLAND_CURSOR_SURFACE)
- 
- static void
--meta_wayland_surface_role_tablet_cursor_init (MetaWaylandSurfaceRoleTabletCursor *role)
-+meta_wayland_tablet_cursor_surface_init (MetaWaylandTabletCursorSurface *role)
- {
- }
- 
- static void
--meta_wayland_surface_role_tablet_cursor_class_init (MetaWaylandSurfaceRoleTabletCursorClass *klass)
-+meta_wayland_tablet_cursor_surface_class_init (MetaWaylandTabletCursorSurfaceClass *klass)
- {
- }
-diff --git a/src/wayland/meta-wayland-surface-role-tablet-cursor.h b/src/wayland/meta-wayland-tablet-cursor-surface.h
-similarity index 59%
-rename from src/wayland/meta-wayland-surface-role-tablet-cursor.h
-rename to src/wayland/meta-wayland-tablet-cursor-surface.h
-index 69fc6cf0f..5c5c198f5 100644
---- a/src/wayland/meta-wayland-surface-role-tablet-cursor.h
-+++ b/src/wayland/meta-wayland-tablet-cursor-surface.h
-@@ -19,15 +19,15 @@
-  * 02111-1307, USA.
-  */
- 
--#ifndef META_WAYLAND_SURFACE_ROLE_TABLET_CURSOR_H
--#define META_WAYLAND_SURFACE_ROLE_TABLET_CURSOR_H
-+#ifndef META_WAYLAND_TABLET_CURSOR_SURFACE_H
-+#define META_WAYLAND_TABLET_CURSOR_SURFACE_H
- 
--#include "meta-wayland-surface-role-cursor.h"
-+#include "meta-wayland-cursor-surface.h"
- 
--#define META_TYPE_WAYLAND_SURFACE_ROLE_TABLET_CURSOR (meta_wayland_surface_role_tablet_cursor_get_type ())
--G_DECLARE_FINAL_TYPE (MetaWaylandSurfaceRoleTabletCursor,
--                      meta_wayland_surface_role_tablet_cursor,
--                      META, WAYLAND_SURFACE_ROLE_TABLET_CURSOR,
--                      MetaWaylandSurfaceRoleCursor);
-+#define META_TYPE_WAYLAND_TABLET_CURSOR_SURFACE (meta_wayland_tablet_cursor_surface_get_type ())
-+G_DECLARE_FINAL_TYPE (MetaWaylandTabletCursorSurface,
-+                      meta_wayland_tablet_cursor_surface,
-+                      META, WAYLAND_TABLET_CURSOR_SURFACE,
-+                      MetaWaylandCursorSurface)
- 
--#endif /* META_WAYLAND_SURFACE_ROLE_TABLET_CURSOR_H */
-+#endif /* META_WAYLAND_TABLET_CURSOR_SURFACE_H */
-diff --git a/src/wayland/meta-wayland-tablet-tool.c b/src/wayland/meta-wayland-tablet-tool.c
-index 4b57d4156..d373f8d25 100644
---- a/src/wayland/meta-wayland-tablet-tool.c
-+++ b/src/wayland/meta-wayland-tablet-tool.c
-@@ -31,7 +31,7 @@
- #include <wayland-server.h>
- #include "tablet-unstable-v2-server-protocol.h"
- #include "meta-wayland-private.h"
--#include "meta-wayland-surface-role-tablet-cursor.h"
-+#include "meta-wayland-tablet-cursor-surface.h"
- #include "meta-surface-actor-wayland.h"
- #include "meta-wayland-tablet.h"
- #include "meta-wayland-tablet-seat.h"
-@@ -90,16 +90,16 @@ meta_wayland_tablet_tool_update_cursor_surface (MetaWaylandTabletTool *tool)
-       if (tool->cursor_surface &&
-           meta_wayland_surface_get_buffer (tool->cursor_surface))
-         {
--          MetaWaylandSurfaceRoleCursor *cursor_role =
--            META_WAYLAND_SURFACE_ROLE_CURSOR (tool->cursor_surface->role);
-+          MetaWaylandCursorSurface *cursor_surface =
-+            META_WAYLAND_CURSOR_SURFACE (tool->cursor_surface->role);
- 
--          cursor = meta_wayland_surface_role_cursor_get_sprite (cursor_role);
-+          cursor = meta_wayland_cursor_surface_get_sprite (cursor_surface);
-         }
-       else
-         cursor = NULL;
-     }
-   else if (tool->current_tablet)
--    cursor = tool->default_sprite;
-+    cursor = META_CURSOR_SPRITE (tool->default_sprite);
-   else
-     cursor = NULL;
- 
-@@ -382,10 +382,10 @@ tablet_tool_handle_cursor_surface_destroy (struct wl_listener *listener,
- }
- 
- static void
--tool_cursor_prepare_at (MetaCursorSprite      *cursor_sprite,
--                        int                    x,
--                        int                    y,
--                        MetaWaylandTabletTool *tool)
-+tool_cursor_prepare_at (MetaCursorSpriteXcursor *sprite_xcursor,
-+                        int                      x,
-+                        int                      y,
-+                        MetaWaylandTabletTool   *tool)
- {
-   MetaBackend *backend = meta_get_backend ();
-   MetaMonitorManager *monitor_manager =
-@@ -397,7 +397,8 @@ tool_cursor_prepare_at (MetaCursorSprite      *cursor_sprite,
- 
-   /* Reload the cursor texture if the scale has changed. */
-   if (logical_monitor)
--    meta_cursor_sprite_set_theme_scale (cursor_sprite, logical_monitor->scale);
-+    meta_cursor_sprite_xcursor_set_theme_scale (sprite_xcursor,
-+                                                logical_monitor->scale);
- }
- 
- MetaWaylandTabletTool *
-@@ -417,7 +418,7 @@ meta_wayland_tablet_tool_new (MetaWaylandTabletSeat  *seat,
-   tool->focus_surface_destroy_listener.notify = tablet_tool_handle_focus_surface_destroy;
-   tool->cursor_surface_destroy_listener.notify = tablet_tool_handle_cursor_surface_destroy;
- 
--  tool->default_sprite = meta_cursor_sprite_from_theme (META_CURSOR_CROSSHAIR);
-+  tool->default_sprite = meta_cursor_sprite_xcursor_new (META_CURSOR_CROSSHAIR);
-   tool->prepare_at_signal_id =
-     g_signal_connect (tool->default_sprite, "prepare-at",
-                       G_CALLBACK (tool_cursor_prepare_at), tool);
-@@ -471,7 +472,7 @@ tool_set_cursor (struct wl_client   *client,
- 
-   if (surface &&
-       !meta_wayland_surface_assign_role (surface,
--                                         META_TYPE_WAYLAND_SURFACE_ROLE_TABLET_CURSOR,
-+                                         META_TYPE_WAYLAND_TABLET_CURSOR_SURFACE,
-                                          NULL))
-     {
-       wl_resource_post_error (resource, WL_POINTER_ERROR_ROLE,
-@@ -482,13 +483,13 @@ tool_set_cursor (struct wl_client   *client,
- 
-   if (surface)
-     {
--      MetaWaylandSurfaceRoleCursor *cursor_role;
-+      MetaWaylandCursorSurface *cursor_surface;
- 
--      cursor_role = META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role);
--      meta_wayland_surface_role_cursor_set_renderer (cursor_role,
--                                                     tool->cursor_renderer);
--      meta_wayland_surface_role_cursor_set_hotspot (cursor_role,
--                                                    hotspot_x, hotspot_y);
-+      cursor_surface = META_WAYLAND_CURSOR_SURFACE (surface->role);
-+      meta_wayland_cursor_surface_set_renderer (cursor_surface,
-+                                                tool->cursor_renderer);
-+      meta_wayland_cursor_surface_set_hotspot (cursor_surface,
-+                                               hotspot_x, hotspot_y);
-     }
- 
-   meta_wayland_tablet_tool_set_cursor_surface (tool, surface);
-diff --git a/src/wayland/meta-wayland-tablet-tool.h b/src/wayland/meta-wayland-tablet-tool.h
-index 8cd930086..011972fc2 100644
---- a/src/wayland/meta-wayland-tablet-tool.h
-+++ b/src/wayland/meta-wayland-tablet-tool.h
-@@ -28,6 +28,7 @@
- 
- #include "meta-wayland-types.h"
- #include "meta-cursor-renderer.h"
-+#include "backends/meta-cursor-sprite-xcursor.h"
- 
- struct _MetaWaylandTabletTool
- {
-@@ -43,7 +44,7 @@ struct _MetaWaylandTabletTool
-   MetaWaylandSurface *cursor_surface;
-   struct wl_listener cursor_surface_destroy_listener;
-   MetaCursorRenderer *cursor_renderer;
--  MetaCursorSprite *default_sprite;
-+  MetaCursorSpriteXcursor *default_sprite;
-   guint prepare_at_signal_id;
- 
-   MetaWaylandSurface *current;
diff --git a/SOURCES/inherit-xrandr-metamodes.patch b/SOURCES/inherit-xrandr-metamodes.patch
new file mode 100644
index 0000000..9f3f6c9
--- /dev/null
+++ b/SOURCES/inherit-xrandr-metamodes.patch
@@ -0,0 +1,365 @@
+From 2fd3910c29d2af2a7c64b82f075cd3647d7e4bee Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
+Date: Mon, 18 Mar 2019 17:08:11 +0100
+Subject: [PATCH 1/2] monitor-config-manager: Use current mode when deriving
+ current config
+
+Instead of overriding the existing mode with the preferred mode of the monitor,
+use the one already configured. Also use the MetaMonitor API for deriving the
+position of the monitor in the screen coordinate space.
+---
+ src/backends/meta-monitor-config-manager.c | 77 +++++++++++++---------
+ 1 file changed, 47 insertions(+), 30 deletions(-)
+
+diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
+index c09edbe00..a3387aa0f 100644
+--- a/src/backends/meta-monitor-config-manager.c
++++ b/src/backends/meta-monitor-config-manager.c
+@@ -592,20 +592,19 @@ create_monitor_config (MetaMonitor     *monitor,
+ }
+ 
+ static MetaLogicalMonitorConfig *
+-create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_manager,
+-                                         MetaMonitor                 *monitor,
+-                                         int                          x,
+-                                         int                          y,
+-                                         MetaLogicalMonitorConfig    *primary_logical_monitor_config,
+-                                         MetaLogicalMonitorLayoutMode layout_mode)
++create_logical_monitor_config (MetaMonitorManager           *monitor_manager,
++                               MetaMonitor                  *monitor,
++                               MetaMonitorMode              *mode,
++                               int                           x,
++                               int                           y,
++                               MetaLogicalMonitorConfig     *primary_logical_monitor_config,
++                               MetaLogicalMonitorLayoutMode  layout_mode)
+ {
+-  MetaMonitorMode *mode;
+   int width, height;
+   float scale;
+   MetaMonitorConfig *monitor_config;
+   MetaLogicalMonitorConfig *logical_monitor_config;
+ 
+-  mode = meta_monitor_get_preferred_mode (monitor);
+   meta_monitor_mode_get_resolution (mode, &width, &height);
+ 
+   if ((meta_monitor_manager_get_capabilities (monitor_manager) &
+@@ -645,22 +644,40 @@ create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_ma
+ }
+ 
+ static MetaLogicalMonitorConfig *
+-create_logical_monitor_config_from_output (MetaMonitorManager           *monitor_manager,
+-                                           MetaMonitor                  *monitor,
+-                                           MetaLogicalMonitorConfig     *primary_logical_monitor_config,
+-                                           MetaLogicalMonitorLayoutMode  layout_mode)
++create_preferred_logical_monitor_config (MetaMonitorManager           *monitor_manager,
++                                         MetaMonitor                  *monitor,
++                                         int                           x,
++                                         int                           y,
++                                         MetaLogicalMonitorConfig     *primary_logical_monitor_config,
++                                         MetaLogicalMonitorLayoutMode  layout_mode)
+ {
+-    MetaOutput *output;
+-    MetaCrtc *crtc;
++  return create_logical_monitor_config (monitor_manager,
++                                        monitor,
++                                        meta_monitor_get_preferred_mode (monitor),
++                                        x, y,
++                                        primary_logical_monitor_config,
++                                        layout_mode);
++}
+ 
+-    output = meta_monitor_get_main_output (monitor);
+-    crtc = meta_output_get_assigned_crtc (output);
+-    return create_preferred_logical_monitor_config (monitor_manager,
+-                                                    monitor,
+-                                                    crtc->rect.x,
+-                                                    crtc->rect.y,
+-                                                    primary_logical_monitor_config,
+-                                                    layout_mode);
++static MetaLogicalMonitorConfig *
++create_logical_monitor_config_from_monitor (MetaMonitorManager           *monitor_manager,
++                                            MetaMonitor                  *monitor,
++                                            MetaLogicalMonitorConfig     *primary_logical_monitor_config,
++                                            MetaLogicalMonitorLayoutMode  layout_mode)
++{
++  MetaRectangle monitor_layout;
++  MetaMonitorMode *mode;
++
++  meta_monitor_derive_layout (monitor, &monitor_layout);
++  mode = meta_monitor_get_current_mode (monitor);
++
++  return create_logical_monitor_config (monitor_manager,
++                                        monitor,
++                                        mode,
++                                        monitor_layout.x,
++                                        monitor_layout.y,
++                                        primary_logical_monitor_config,
++                                        layout_mode);
+ }
+ 
+ MetaMonitorsConfig *
+@@ -688,10 +705,10 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
+   layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
+ 
+   primary_logical_monitor_config =
+-    create_logical_monitor_config_from_output (monitor_manager,
+-                                               primary_monitor,
+-                                               NULL,
+-                                               layout_mode);
++    create_logical_monitor_config_from_monitor (monitor_manager,
++                                                primary_monitor,
++                                                NULL,
++                                                layout_mode);
+ 
+   primary_logical_monitor_config->is_primary = TRUE;
+   logical_monitor_configs = g_list_append (NULL,
+@@ -710,10 +727,10 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
+         continue;
+ 
+       logical_monitor_config =
+-        create_logical_monitor_config_from_output (monitor_manager,
+-                                                   monitor,
+-                                                   primary_logical_monitor_config,
+-                                                   layout_mode);
++        create_logical_monitor_config_from_monitor (monitor_manager,
++                                                    monitor,
++                                                    primary_logical_monitor_config,
++                                                    layout_mode);
+ 
+       logical_monitor_configs = g_list_append (logical_monitor_configs,
+                                                logical_monitor_config);
+-- 
+2.21.0
+
+
+From d8c34e4cd7e500567e72e0f219295d7c2162dcf3 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
+Date: Mon, 18 Mar 2019 17:10:37 +0100
+Subject: [PATCH 2/2] monitor-manager: Don't try to derive current config on
+ non-X11
+
+This commit also reworks the initial config state reading some. Appart from
+avoiding trying to inherit from backends where it doesn't make sense, it does
+the following changes:
+
+ * Replace the name "initial" with "inherited", as the initial config in the
+   context of monitor management is the one used initialization. E.g. if there is
+   a applicable configuration in monitors.xml, the initial config is taken from
+   there.
+
+ * Don't make "_create_()" functions have side effects. Previously
+   meta_monitor_config_manager_create_initial() also set state on the config
+   manager object. Instead, add a meta_monitor_config_manager_ensure_inherited()
+   and meta_monitor_manager_get_inherited_config() function to make things more
+   explicit.
+
+ * Don't recreate "is-applicable" logic, just use the existing helper.
+---
+ src/backends/meta-monitor-config-manager.c    | 39 +++++++++++--------
+ src/backends/meta-monitor-config-manager.h    |  5 +++
+ src/backends/meta-monitor-manager-private.h   |  4 +-
+ src/backends/meta-monitor-manager.c           | 32 ++++++++-------
+ .../x11/meta-monitor-manager-xrandr.c         |  3 +-
+ 5 files changed, 49 insertions(+), 34 deletions(-)
+
+diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
+index a3387aa0f..bc1a39db8 100644
+--- a/src/backends/meta-monitor-config-manager.c
++++ b/src/backends/meta-monitor-config-manager.c
+@@ -42,7 +42,7 @@ struct _MetaMonitorConfigManager
+   MetaMonitorConfigStore *config_store;
+ 
+   MetaMonitorsConfig *current_config;
+-  MetaMonitorsConfig *initial_config;
++  MetaMonitorsConfig *inherited_config;
+   GQueue config_history;
+ };
+ 
+@@ -680,11 +680,10 @@ create_logical_monitor_config_from_monitor (MetaMonitorManager           *monito
+                                         layout_mode);
+ }
+ 
+-MetaMonitorsConfig *
+-meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager)
++static MetaMonitorsConfig *
++meta_monitor_config_manager_derive_current (MetaMonitorConfigManager *config_manager)
+ {
+   MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
+-  MetaMonitorsConfig *initial_config;
+   GList *logical_monitor_configs;
+   MetaMonitor *primary_monitor;
+   MetaLogicalMonitorLayoutMode layout_mode;
+@@ -692,12 +691,6 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
+   GList *monitors;
+   GList *l;
+ 
+-  if (config_manager->initial_config != NULL)
+-    return g_object_ref (config_manager->initial_config);
+-
+-  if (meta_monitor_config_store_get_config_count (config_manager->config_store) > 0)
+-    return NULL;
+-
+   primary_monitor = find_primary_monitor (monitor_manager);
+   if (!primary_monitor || !meta_monitor_is_active (primary_monitor))
+     return NULL;
+@@ -736,14 +729,26 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
+                                                logical_monitor_config);
+     }
+ 
+-  initial_config = meta_monitors_config_new (monitor_manager,
+-                                             logical_monitor_configs,
+-                                             layout_mode,
+-                                             META_MONITORS_CONFIG_FLAG_NONE);
++  return meta_monitors_config_new (monitor_manager,
++                                   logical_monitor_configs,
++                                   layout_mode,
++                                   META_MONITORS_CONFIG_FLAG_NONE);
++}
++
++void
++meta_monitor_config_manager_ensure_inherited_config (MetaMonitorConfigManager *config_manager)
++{
++  if (config_manager->inherited_config)
++    return;
+ 
+-  config_manager->initial_config = g_object_ref (initial_config);
++  config_manager->inherited_config =
++    meta_monitor_config_manager_derive_current (config_manager);
++}
+ 
+-  return initial_config;
++MetaMonitorsConfig *
++meta_monitor_config_manager_get_inherited_config (MetaMonitorConfigManager *config_manager)
++{
++  return config_manager->inherited_config;
+ }
+ 
+ MetaMonitorsConfig *
+@@ -1282,7 +1287,7 @@ meta_monitor_config_manager_dispose (GObject *object)
+     META_MONITOR_CONFIG_MANAGER (object);
+ 
+   g_clear_object (&config_manager->current_config);
+-  g_clear_object (&config_manager->initial_config);
++  g_clear_object (&config_manager->inherited_config);
+   meta_monitor_config_manager_clear_history (config_manager);
+ 
+   G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object);
+diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
+index 409611bb0..bb847b96e 100644
+--- a/src/backends/meta-monitor-config-manager.h
++++ b/src/backends/meta-monitor-config-manager.h
+@@ -96,6 +96,11 @@ MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigMa
+ 
+ META_EXPORT_TEST
+ MetaMonitorsConfig * meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager);
++
++void meta_monitor_config_manager_ensure_inherited_config (MetaMonitorConfigManager *config_manager);
++
++MetaMonitorsConfig * meta_monitor_config_manager_get_inherited_config (MetaMonitorConfigManager *config_manager);
++
+ META_EXPORT_TEST
+ MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager);
+ 
+diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
+index cdb8f4209..223b5dfbd 100644
+--- a/src/backends/meta-monitor-manager-private.h
++++ b/src/backends/meta-monitor-manager-private.h
+@@ -44,7 +44,8 @@ typedef enum _MetaMonitorManagerCapability
+   META_MONITOR_MANAGER_CAPABILITY_NONE = 0,
+   META_MONITOR_MANAGER_CAPABILITY_MIRRORING = (1 << 0),
+   META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE = (1 << 1),
+-  META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED = (1 << 2)
++  META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED = (1 << 2),
++  META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT = (1 << 3),
+ } MetaMonitorManagerCapability;
+ 
+ /* Equivalent to the 'method' enum in org.gnome.Mutter.DisplayConfig */
+@@ -133,6 +134,7 @@ struct _MetaMonitorManager
+   int persistent_timeout_id;
+ 
+   MetaMonitorConfigManager *config_manager;
++  MetaMonitorsConfig *initial_config;
+ 
+   GnomePnpIds *pnp_ids;
+ 
+diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
+index bb4b44188..076dca8cb 100644
+--- a/src/backends/meta-monitor-manager.c
++++ b/src/backends/meta-monitor-manager.c
+@@ -531,14 +531,21 @@ should_use_stored_config (MetaMonitorManager *manager)
+           !meta_monitor_manager_has_hotplug_mode_update (manager));
+ }
+ 
++static gboolean
++can_derive_current_config (MetaMonitorManager *manager)
++{
++  MetaMonitorManagerCapability capabilities;
++
++  capabilities = meta_monitor_manager_get_capabilities (manager);
++  return !!(capabilities & META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT);
++}
++
+ MetaMonitorsConfig *
+ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+ {
+-  g_autoptr (MetaMonitorsConfig) initial_config = NULL;
+   MetaMonitorsConfig *config = NULL;
+   GError *error = NULL;
+   gboolean use_stored_config;
+-  MetaMonitorsConfigKey *current_state_key;
+   MetaMonitorsConfigMethod method;
+   MetaMonitorsConfigMethod fallback_method =
+     META_MONITORS_CONFIG_METHOD_TEMPORARY;
+@@ -549,17 +556,8 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+   else
+     method = META_MONITORS_CONFIG_METHOD_TEMPORARY;
+ 
+-  initial_config = meta_monitor_config_manager_create_initial (manager->config_manager);
+-
+-  if (initial_config)
+-    {
+-      current_state_key = meta_create_monitors_config_key_for_current_state (manager);
+-
+-      /* don't ever reuse initial configuration, if the monitor topology changed
+-       */
+-      if (current_state_key && !meta_monitors_config_key_equal (current_state_key, initial_config->key))
+-        g_clear_object (&initial_config);
+-    }
++  if (can_derive_current_config (manager))
++    meta_monitor_config_manager_ensure_inherited_config (manager->config_manager);
+ 
+   if (use_stored_config)
+     {
+@@ -628,9 +626,13 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
+       g_clear_object (&config);
+     }
+ 
+-  config = g_steal_pointer (&initial_config);
+-  if (config)
++  config =
++    meta_monitor_config_manager_get_inherited_config (manager->config_manager);
++  if (config &&
++      meta_monitor_manager_is_config_complete (manager, config))
+     {
++      config = g_object_ref (config);
++
+       if (!meta_monitor_manager_apply_monitors_config (manager,
+                                                        config,
+                                                        method,
+diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
+index d60f00325..b8d6342b6 100644
+--- a/src/backends/x11/meta-monitor-manager-xrandr.c
++++ b/src/backends/x11/meta-monitor-manager-xrandr.c
+@@ -999,7 +999,8 @@ static MetaMonitorManagerCapability
+ meta_monitor_manager_xrandr_get_capabilities (MetaMonitorManager *manager)
+ {
+   return (META_MONITOR_MANAGER_CAPABILITY_MIRRORING |
+-          META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED);
++          META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED |
++          META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT);
+ }
+ 
+ static gboolean
+-- 
+2.21.0
+
diff --git a/SOURCES/mutter-pipewire-0_2-API.patch b/SOURCES/mutter-pipewire-0_2-API.patch
deleted file mode 100644
index c98d8d0..0000000
--- a/SOURCES/mutter-pipewire-0_2-API.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
-index 457c058..0c4f33b 100644
---- a/src/backends/meta-screen-cast-stream-src.c
-+++ b/src/backends/meta-screen-cast-stream-src.c
-@@ -132,8 +132,8 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
- {
-   MetaScreenCastStreamSrcPrivate *priv =
-     meta_screen_cast_stream_src_get_instance_private (src);
--  uint32_t buffer_id;
--  struct spa_buffer *buffer;
-+  struct pw_buffer *buffer;
-+  struct spa_buffer *spa_buffer;
-   uint8_t *map = NULL;
-   uint8_t *data;
-   uint64_t now_us;
-@@ -148,22 +148,24 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-   if (!priv->pipewire_stream)
-     return;
- 
--  buffer_id = pw_stream_get_empty_buffer (priv->pipewire_stream);
--  if (buffer_id == SPA_ID_INVALID)
--    return;
--
--  buffer = pw_stream_peek_buffer (priv->pipewire_stream, buffer_id);
-+  buffer = pw_stream_dequeue_buffer (priv->pipewire_stream);
-   if (!buffer)
-     {
--      g_warning ("Failed to peek at PipeWire buffer");
-+      g_warning ("Failed to dequeue at PipeWire buffer");
-       return;
-     }
- 
--  if (buffer->datas[0].type == priv->pipewire_type->data.MemFd)
-+  spa_buffer = buffer->buffer;
-+
-+  if (spa_buffer->datas[0].data)
-+    {
-+      data = spa_buffer->datas[0].data;
-+    }
-+  else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
-     {
--      map = mmap (NULL, buffer->datas[0].maxsize + buffer->datas[0].mapoffset,
-+      map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
-                   PROT_READ | PROT_WRITE, MAP_SHARED,
--                  buffer->datas[0].fd, 0);
-+                  spa_buffer->datas[0].fd, 0);
-       if (map == MAP_FAILED)
-         {
-           g_warning ("Failed to mmap pipewire stream buffer: %s\n",
-@@ -171,14 +173,11 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-           return;
-         }
- 
--      data = SPA_MEMBER (map, buffer->datas[0].mapoffset, uint8_t);
--    }
--  else if (buffer->datas[0].type == priv->pipewire_type->data.MemPtr)
--    {
--      data = buffer->datas[0].data;
-+      data = SPA_MEMBER (map, spa_buffer->datas[0].mapoffset, uint8_t);
-     }
-   else
-     {
-+      g_warning ("Unhandled spa buffer type: %d", spa_buffer->datas[0].type);
-       return;
-     }
- 
-@@ -186,11 +185,11 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-   priv->last_frame_timestamp_us = now_us;
- 
-   if (map)
--    munmap (map, buffer->datas[0].maxsize + buffer->datas[0].mapoffset);
-+    munmap (map, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset);
- 
--  buffer->datas[0].chunk->size = buffer->datas[0].maxsize;
-+  spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
- 
--  pw_stream_send_buffer (priv->pipewire_stream, buffer_id);
-+  pw_stream_queue_buffer (priv->pipewire_stream, buffer);
- }
- 
- static gboolean
-@@ -266,8 +265,8 @@ on_stream_state_changed (void                 *data,
- }
- 
- static void
--on_stream_format_changed (void           *data,
--                          struct spa_pod *format)
-+on_stream_format_changed (void                 *data,
-+                          const struct spa_pod *format)
- {
-   MetaScreenCastStreamSrc *src = data;
-   MetaScreenCastStreamSrcPrivate *priv =
-@@ -276,7 +275,7 @@ on_stream_format_changed (void           *data,
-   uint8_t params_buffer[1024];
-   int32_t width, height, stride, size;
-   struct spa_pod_builder pod_builder;
--  struct spa_pod *params[1];
-+  const struct spa_pod *params[1];
-   const int bpp = 4;
- 
-   if (!format)
-@@ -372,7 +371,8 @@ create_pipewire_stream (MetaScreenCastStreamSrc  *src,
-   result = pw_stream_connect (pipewire_stream,
-                               PW_DIRECTION_OUTPUT,
-                               NULL,
--                              PW_STREAM_FLAG_NONE,
-+                              (PW_STREAM_FLAG_DRIVER |
-+                               PW_STREAM_FLAG_MAP_BUFFERS),
-                               params, G_N_ELEMENTS (params));
-   if (result != 0)
-     {
diff --git a/SOURCES/mutter-search-for-libpipewire-0_2.patch b/SOURCES/mutter-search-for-libpipewire-0_2.patch
deleted file mode 100644
index b278eaf..0000000
--- a/SOURCES/mutter-search-for-libpipewire-0_2.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/configure b/configure
-index cfe46d0..6a06043 100755
---- a/configure
-+++ b/configure
-@@ -16590,7 +16590,7 @@ fi
- 
- if test "$enable_remote_desktop" = "yes"; then :
- 
--  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.1 >= 0.1.8"
-+  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.2 >= 0.2.2"
- 
- $as_echo "#define HAVE_REMOTE_DESKTOP 1" >>confdefs.h
- 
-diff --git a/configure.ac b/configure.ac
-index e795159..9adb14b 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -245,7 +245,7 @@ AC_ARG_ENABLE(remote-desktop,
-   enable_remote_desktop=no
- )
- AS_IF([test "$enable_remote_desktop" = "yes"], [
--  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.1 >= 0.1.8"
-+  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.2 >= 0.2.2"
-   AC_DEFINE([HAVE_REMOTE_DESKTOP],[1], [Defined if screen cast and remote desktop support is enabled])
- ])
- AM_CONDITIONAL([HAVE_REMOTE_DESKTOP],[test "$enable_remote_desktop" = "yes"])
diff --git a/SOURCES/screen-cast-cursor-side-channel.patch b/SOURCES/screen-cast-cursor-side-channel.patch
deleted file mode 100644
index 12ee90b..0000000
--- a/SOURCES/screen-cast-cursor-side-channel.patch
+++ /dev/null
@@ -1,2098 +0,0 @@
-From 5f428c5aa9f3e66cd23e4e75d54506960bd5b66c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:27:16 +0100
-Subject: [PATCH 01/12] cursor-tracker: Add 'cursor-moved' signal
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-cursor-tracker.c | 12 ++++++++++++
- 1 file changed, 12 insertions(+)
-
-diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
-index 6244f11ee..060b6af3b 100644
---- a/src/backends/meta-cursor-tracker.c
-+++ b/src/backends/meta-cursor-tracker.c
-@@ -48,6 +48,7 @@ G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
- 
- enum {
-   CURSOR_CHANGED,
-+  CURSOR_MOVED,
-   LAST_SIGNAL
- };
- 
-@@ -158,6 +159,15 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
-                                           0,
-                                           NULL, NULL, NULL,
-                                           G_TYPE_NONE, 0);
-+
-+  signals[CURSOR_MOVED] = g_signal_new ("cursor-moved",
-+                                        G_TYPE_FROM_CLASS (klass),
-+                                        G_SIGNAL_RUN_LAST,
-+                                        0,
-+                                        NULL, NULL, NULL,
-+                                        G_TYPE_NONE, 2,
-+                                        G_TYPE_FLOAT,
-+                                        G_TYPE_FLOAT);
- }
- 
- /**
-@@ -334,6 +344,8 @@ meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
-   g_assert (meta_is_wayland_compositor ());
- 
-   meta_cursor_renderer_set_position (cursor_renderer, new_x, new_y);
-+
-+  g_signal_emit (tracker, signals[CURSOR_MOVED], 0, new_x, new_y);
- }
- 
- static void
--- 
-2.20.1
-
-
-From 54c5034f6dcdaf382a8355460710ced47c05d91e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 21 Dec 2018 17:28:33 +0100
-Subject: [PATCH 02/12] clutter/stage: Add clutter_stage_is_redraw_queued() API
-
-This will be used by the screen casting code to check whether it should
-wait for a frame before reading cursor state, or send only the cursor
-update, if no redraw is queued.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- clutter/clutter/clutter-stage.c | 11 +++++++++++
- clutter/clutter/clutter-stage.h |  3 +++
- 2 files changed, 14 insertions(+)
-
-diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
-index 9352f49e8..763ec96ee 100644
---- a/clutter/clutter/clutter-stage.c
-+++ b/clutter/clutter/clutter-stage.c
-@@ -3722,6 +3722,17 @@ clutter_stage_ensure_redraw (ClutterStage *stage)
-   _clutter_master_clock_start_running (master_clock);
- }
- 
-+/**
-+ * clutter_stage_is_redraw_queued: (skip)
-+ */
-+gboolean
-+clutter_stage_is_redraw_queued (ClutterStage *stage)
-+{
-+  ClutterStagePrivate *priv = stage->priv;
-+
-+  return priv->redraw_pending;
-+}
-+
- /**
-  * clutter_stage_queue_redraw:
-  * @stage: the #ClutterStage
-diff --git a/clutter/clutter/clutter-stage.h b/clutter/clutter/clutter-stage.h
-index e8fbda84c..ddf08fde4 100644
---- a/clutter/clutter/clutter-stage.h
-+++ b/clutter/clutter/clutter-stage.h
-@@ -250,6 +250,9 @@ void            clutter_stage_ensure_viewport                   (ClutterStage
- CLUTTER_AVAILABLE_IN_ALL
- void            clutter_stage_ensure_redraw                     (ClutterStage          *stage);
- 
-+CLUTTER_AVAILABLE_IN_ALL
-+gboolean        clutter_stage_is_redraw_queued                  (ClutterStage          *stage);
-+
- #ifdef CLUTTER_ENABLE_EXPERIMENTAL_API
- CLUTTER_AVAILABLE_IN_1_14
- void            clutter_stage_set_sync_delay                    (ClutterStage          *stage,
--- 
-2.20.1
-
-
-From 59e1c68143d9090e238198448fa400bb0776d38a Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:32:11 +0100
-Subject: [PATCH 03/12] screen-cast-monitor-stream: Don't pass monitor manager
- when creating
-
-It can be fetched indirectly from the monitor already.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-screen-cast-monitor-stream.c | 11 ++++++-----
- src/backends/meta-screen-cast-monitor-stream.h |  9 ++++-----
- src/backends/meta-screen-cast-session.c        |  1 -
- 3 files changed, 10 insertions(+), 11 deletions(-)
-
-diff --git a/src/backends/meta-screen-cast-monitor-stream.c b/src/backends/meta-screen-cast-monitor-stream.c
-index df43f977c..5a816e4df 100644
---- a/src/backends/meta-screen-cast-monitor-stream.c
-+++ b/src/backends/meta-screen-cast-monitor-stream.c
-@@ -105,12 +105,13 @@ meta_screen_cast_monitor_stream_get_monitor (MetaScreenCastMonitorStream *monito
- }
- 
- MetaScreenCastMonitorStream *
--meta_screen_cast_monitor_stream_new (GDBusConnection     *connection,
--                                     MetaMonitorManager  *monitor_manager,
--                                     MetaMonitor         *monitor,
--                                     ClutterStage        *stage,
--                                     GError             **error)
-+meta_screen_cast_monitor_stream_new (GDBusConnection  *connection,
-+                                     MetaMonitor      *monitor,
-+                                     ClutterStage     *stage,
-+                                     GError          **error)
- {
-+  MetaGpu *gpu = meta_monitor_get_gpu (monitor);
-+  MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
-   MetaScreenCastMonitorStream *monitor_stream;
- 
-   if (!meta_monitor_is_active (monitor))
-diff --git a/src/backends/meta-screen-cast-monitor-stream.h b/src/backends/meta-screen-cast-monitor-stream.h
-index fbf3c77c3..1d24de93a 100644
---- a/src/backends/meta-screen-cast-monitor-stream.h
-+++ b/src/backends/meta-screen-cast-monitor-stream.h
-@@ -34,11 +34,10 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastMonitorStream,
-                       META, SCREEN_CAST_MONITOR_STREAM,
-                       MetaScreenCastStream)
- 
--MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (GDBusConnection    *connection,
--								   MetaMonitorManager *monitor_manager,
--                                                                   MetaMonitor        *monitor,
--                                                                   ClutterStage       *stage,
--                                                                   GError            **error);
-+MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (GDBusConnection  *connection,
-+                                                                   MetaMonitor      *monitor,
-+                                                                   ClutterStage     *stage,
-+                                                                   GError          **error);
- 
- ClutterStage * meta_screen_cast_monitor_stream_get_stage (MetaScreenCastMonitorStream *monitor_stream);
- 
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index d0f5a79d9..3ba59037f 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -301,7 +301,6 @@ handle_record_monitor (MetaDBusScreenCastSession *skeleton,
-   stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
- 
-   monitor_stream = meta_screen_cast_monitor_stream_new (connection,
--                                                        monitor_manager,
-                                                         monitor,
-                                                         stage,
-                                                         &error);
--- 
-2.20.1
-
-
-From 45100944033987a946672fda6de309aa41a6139f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:35:58 +0100
-Subject: [PATCH 04/12] screen-cast: Add getters to fetch object owners
-
-MetaBackend owns MetaScreenCast which owns MetaScreenCastSession which
-owns MetaScreenCastStream. Make it possible to fetch objects in the
-oppositev direction too.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-backend.c                   |  3 +-
- .../meta-screen-cast-monitor-stream.c         | 10 ++++---
- .../meta-screen-cast-monitor-stream.h         | 10 ++++---
- src/backends/meta-screen-cast-session.c       | 15 ++++++++--
- src/backends/meta-screen-cast-session.h       |  2 ++
- src/backends/meta-screen-cast-stream.c        | 30 +++++++++++++++++++
- src/backends/meta-screen-cast-stream.h        |  6 ++++
- src/backends/meta-screen-cast-window-stream.c |  8 +++--
- src/backends/meta-screen-cast-window-stream.h |  7 +++--
- src/backends/meta-screen-cast.c               | 15 ++++++++--
- src/backends/meta-screen-cast.h               |  6 +++-
- 11 files changed, 92 insertions(+), 20 deletions(-)
-
-diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
-index 888e51cd9..28f1cd92f 100644
---- a/src/backends/meta-backend.c
-+++ b/src/backends/meta-backend.c
-@@ -456,7 +456,8 @@ meta_backend_real_post_init (MetaBackend *backend)
-   priv->remote_access_controller =
-     g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL);
-   priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL);
--  priv->screen_cast = meta_screen_cast_new (priv->dbus_session_watcher);
-+  priv->screen_cast = meta_screen_cast_new (backend,
-+                                            priv->dbus_session_watcher);
-   priv->remote_desktop = meta_remote_desktop_new (priv->dbus_session_watcher);
- #endif /* HAVE_REMOTE_DESKTOP */
- 
-diff --git a/src/backends/meta-screen-cast-monitor-stream.c b/src/backends/meta-screen-cast-monitor-stream.c
-index 5a816e4df..a6bed1b52 100644
---- a/src/backends/meta-screen-cast-monitor-stream.c
-+++ b/src/backends/meta-screen-cast-monitor-stream.c
-@@ -105,10 +105,11 @@ meta_screen_cast_monitor_stream_get_monitor (MetaScreenCastMonitorStream *monito
- }
- 
- MetaScreenCastMonitorStream *
--meta_screen_cast_monitor_stream_new (GDBusConnection  *connection,
--                                     MetaMonitor      *monitor,
--                                     ClutterStage     *stage,
--                                     GError          **error)
-+meta_screen_cast_monitor_stream_new (MetaScreenCastSession  *session,
-+                                     GDBusConnection        *connection,
-+                                     MetaMonitor            *monitor,
-+                                     ClutterStage           *stage,
-+                                     GError                **error)
- {
-   MetaGpu *gpu = meta_monitor_get_gpu (monitor);
-   MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
-@@ -123,6 +124,7 @@ meta_screen_cast_monitor_stream_new (GDBusConnection  *connection,
-   monitor_stream = g_initable_new (META_TYPE_SCREEN_CAST_MONITOR_STREAM,
-                                    NULL,
-                                    error,
-+                                   "session", session,
-                                    "connection", connection,
-                                    "monitor", monitor,
-                                    NULL);
-diff --git a/src/backends/meta-screen-cast-monitor-stream.h b/src/backends/meta-screen-cast-monitor-stream.h
-index 1d24de93a..98f160c88 100644
---- a/src/backends/meta-screen-cast-monitor-stream.h
-+++ b/src/backends/meta-screen-cast-monitor-stream.h
-@@ -27,6 +27,7 @@
- 
- #include "backends/meta-monitor-manager-private.h"
- #include "backends/meta-screen-cast-stream.h"
-+#include "backends/meta-screen-cast.h"
- 
- #define META_TYPE_SCREEN_CAST_MONITOR_STREAM (meta_screen_cast_monitor_stream_get_type ())
- G_DECLARE_FINAL_TYPE (MetaScreenCastMonitorStream,
-@@ -34,10 +35,11 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastMonitorStream,
-                       META, SCREEN_CAST_MONITOR_STREAM,
-                       MetaScreenCastStream)
- 
--MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (GDBusConnection  *connection,
--                                                                   MetaMonitor      *monitor,
--                                                                   ClutterStage     *stage,
--                                                                   GError          **error);
-+MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (MetaScreenCastSession  *session,
-+                                                                   GDBusConnection        *connection,
-+                                                                   MetaMonitor            *monitor,
-+                                                                   ClutterStage           *stage,
-+                                                                   GError                **error);
- 
- ClutterStage * meta_screen_cast_monitor_stream_get_stage (MetaScreenCastMonitorStream *monitor_stream);
- 
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index 3ba59037f..6a8f2d328 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -38,6 +38,8 @@ struct _MetaScreenCastSession
- {
-   MetaDBusScreenCastSessionSkeleton parent;
- 
-+  MetaScreenCast *screen_cast;
-+
-   char *peer_name;
- 
-   MetaScreenCastSessionType session_type;
-@@ -159,6 +161,12 @@ meta_screen_cast_session_get_stream (MetaScreenCastSession *session,
-   return NULL;
- }
- 
-+MetaScreenCast *
-+meta_screen_cast_session_get_screen_cast (MetaScreenCastSession *session)
-+{
-+  return session->screen_cast;
-+}
-+
- char *
- meta_screen_cast_session_get_object_path (MetaScreenCastSession *session)
- {
-@@ -300,7 +308,8 @@ handle_record_monitor (MetaDBusScreenCastSession *skeleton,
- 
-   stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
- 
--  monitor_stream = meta_screen_cast_monitor_stream_new (connection,
-+  monitor_stream = meta_screen_cast_monitor_stream_new (session,
-+                                                        connection,
-                                                         monitor,
-                                                         stage,
-                                                         &error);
-@@ -381,7 +390,8 @@ handle_record_window (MetaDBusScreenCastSession *skeleton,
-   interface_skeleton = G_DBUS_INTERFACE_SKELETON (skeleton);
-   connection = g_dbus_interface_skeleton_get_connection (interface_skeleton);
- 
--  window_stream = meta_screen_cast_window_stream_new (connection,
-+  window_stream = meta_screen_cast_window_stream_new (session,
-+                                                      connection,
-                                                       window,
-                                                       &error);
-   if (!window_stream)
-@@ -441,6 +451,7 @@ meta_screen_cast_session_new (MetaScreenCast             *screen_cast,
-   static unsigned int global_session_number = 0;
- 
-   session = g_object_new (META_TYPE_SCREEN_CAST_SESSION, NULL);
-+  session->screen_cast = screen_cast;
-   session->session_type = session_type;
-   session->peer_name = g_strdup (peer_name);
-   session->object_path =
-diff --git a/src/backends/meta-screen-cast-session.h b/src/backends/meta-screen-cast-session.h
-index ac0a31a16..105a65098 100644
---- a/src/backends/meta-screen-cast-session.h
-+++ b/src/backends/meta-screen-cast-session.h
-@@ -60,4 +60,6 @@ void meta_screen_cast_session_close (MetaScreenCastSession *session);
- MetaScreenCastStream * meta_screen_cast_session_get_stream (MetaScreenCastSession *session,
-                                                             const char            *path);
- 
-+MetaScreenCast * meta_screen_cast_session_get_screen_cast (MetaScreenCastSession *session);
-+
- #endif /* META_SCREEN_CAST_SESSION_H */
-diff --git a/src/backends/meta-screen-cast-stream.c b/src/backends/meta-screen-cast-stream.c
-index 97ee4bfcf..875ada01a 100644
---- a/src/backends/meta-screen-cast-stream.c
-+++ b/src/backends/meta-screen-cast-stream.c
-@@ -24,12 +24,15 @@
- 
- #include "backends/meta-screen-cast-stream.h"
- 
-+#include "backends/meta-screen-cast-session.h"
-+
- #define META_SCREEN_CAST_STREAM_DBUS_PATH "/org/gnome/Mutter/ScreenCast/Stream"
- 
- enum
- {
-   PROP_0,
- 
-+  PROP_SESSION,
-   PROP_CONNECTION,
- };
- 
-@@ -44,6 +47,8 @@ static guint signals[N_SIGNALS];
- 
- typedef struct _MetaScreenCastStreamPrivate
- {
-+  MetaScreenCastSession *session;
-+
-   GDBusConnection *connection;
-   char *object_path;
- 
-@@ -97,6 +102,15 @@ on_stream_src_ready (MetaScreenCastStreamSrc *src,
-   meta_dbus_screen_cast_stream_emit_pipewire_stream_added (skeleton, node_id);
- }
- 
-+MetaScreenCastSession *
-+meta_screen_cast_stream_get_session (MetaScreenCastStream *stream)
-+{
-+  MetaScreenCastStreamPrivate *priv =
-+    meta_screen_cast_stream_get_instance_private (stream);
-+
-+  return priv->session;
-+}
-+
- gboolean
- meta_screen_cast_stream_start (MetaScreenCastStream  *stream,
-                                GError               **error)
-@@ -162,6 +176,9 @@ meta_screen_cast_stream_set_property (GObject      *object,
- 
-   switch (prop_id)
-     {
-+    case PROP_SESSION:
-+      priv->session = g_value_get_object (value);
-+      break;
-     case PROP_CONNECTION:
-       priv->connection = g_value_get_object (value);
-       break;
-@@ -182,6 +199,9 @@ meta_screen_cast_stream_get_property (GObject    *object,
- 
-   switch (prop_id)
-     {
-+    case PROP_SESSION:
-+      g_value_set_object (value, priv->session);
-+      break;
-     case PROP_CONNECTION:
-       g_value_set_object (value, priv->connection);
-       break;
-@@ -256,6 +276,16 @@ meta_screen_cast_stream_class_init (MetaScreenCastStreamClass *klass)
-   object_class->set_property = meta_screen_cast_stream_set_property;
-   object_class->get_property = meta_screen_cast_stream_get_property;
- 
-+  g_object_class_install_property (object_class,
-+                                   PROP_SESSION,
-+                                   g_param_spec_object ("session",
-+                                                        "session",
-+                                                        "MetaScreenSession",
-+                                                        META_TYPE_SCREEN_CAST_SESSION,
-+                                                        G_PARAM_READWRITE |
-+                                                        G_PARAM_CONSTRUCT_ONLY |
-+                                                        G_PARAM_STATIC_STRINGS));
-+
-   g_object_class_install_property (object_class,
-                                    PROP_CONNECTION,
-                                    g_param_spec_object ("connection",
-diff --git a/src/backends/meta-screen-cast-stream.h b/src/backends/meta-screen-cast-stream.h
-index fd7930c4c..dcc280da6 100644
---- a/src/backends/meta-screen-cast-stream.h
-+++ b/src/backends/meta-screen-cast-stream.h
-@@ -26,8 +26,12 @@
- #include <glib-object.h>
- 
- #include "backends/meta-screen-cast-stream-src.h"
-+#include "backends/meta-screen-cast.h"
-+
- #include "meta-dbus-screen-cast.h"
- 
-+typedef struct _MetaScreenCastSession MetaScreenCastSession;
-+
- #define META_TYPE_SCREEN_CAST_STREAM (meta_screen_cast_stream_get_type ())
- G_DECLARE_DERIVABLE_TYPE (MetaScreenCastStream, meta_screen_cast_stream,
-                           META, SCREEN_CAST_STREAM,
-@@ -48,6 +52,8 @@ struct _MetaScreenCastStreamClass
-                                double               *y);
- };
- 
-+MetaScreenCastSession * meta_screen_cast_stream_get_session (MetaScreenCastStream *stream);
-+
- gboolean meta_screen_cast_stream_start (MetaScreenCastStream *stream,
-                                         GError              **error);
- 
-diff --git a/src/backends/meta-screen-cast-window-stream.c b/src/backends/meta-screen-cast-window-stream.c
-index 1200a39ef..4c9227116 100644
---- a/src/backends/meta-screen-cast-window-stream.c
-+++ b/src/backends/meta-screen-cast-window-stream.c
-@@ -71,9 +71,10 @@ meta_screen_cast_window_stream_get_height (MetaScreenCastWindowStream *window_st
- }
- 
- MetaScreenCastWindowStream *
--meta_screen_cast_window_stream_new (GDBusConnection  *connection,
--                                    MetaWindow       *window,
--                                    GError          **error)
-+meta_screen_cast_window_stream_new (MetaScreenCastSession  *session,
-+                                    GDBusConnection        *connection,
-+                                    MetaWindow             *window,
-+                                    GError                **error)
- {
-   MetaScreenCastWindowStream *window_stream;
-   MetaLogicalMonitor *logical_monitor;
-@@ -90,6 +91,7 @@ meta_screen_cast_window_stream_new (GDBusConnection  *connection,
-   window_stream = g_initable_new (META_TYPE_SCREEN_CAST_WINDOW_STREAM,
-                                   NULL,
-                                   error,
-+                                  "session", session,
-                                   "connection", connection,
-                                   "window", window,
-                                   NULL);
-diff --git a/src/backends/meta-screen-cast-window-stream.h b/src/backends/meta-screen-cast-window-stream.h
-index 6726ef873..3799be98a 100644
---- a/src/backends/meta-screen-cast-window-stream.h
-+++ b/src/backends/meta-screen-cast-window-stream.h
-@@ -32,9 +32,10 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastWindowStream,
-                       META, SCREEN_CAST_WINDOW_STREAM,
-                       MetaScreenCastStream)
- 
--MetaScreenCastWindowStream * meta_screen_cast_window_stream_new (GDBusConnection  *connection,
--                                                                 MetaWindow       *window,
--                                                                 GError          **error);
-+MetaScreenCastWindowStream * meta_screen_cast_window_stream_new (MetaScreenCastSession  *session,
-+                                                                 GDBusConnection        *connection,
-+                                                                 MetaWindow             *window,
-+                                                                 GError                **error);
- 
- MetaWindow  * meta_screen_cast_window_stream_get_window (MetaScreenCastWindowStream *window_stream);
- int           meta_screen_cast_window_stream_get_width  (MetaScreenCastWindowStream *window_stream);
-diff --git a/src/backends/meta-screen-cast.c b/src/backends/meta-screen-cast.c
-index 4a67683e7..ceea9cbe1 100644
---- a/src/backends/meta-screen-cast.c
-+++ b/src/backends/meta-screen-cast.c
-@@ -43,6 +43,7 @@ struct _MetaScreenCast
-   GList *sessions;
- 
-   MetaDbusSessionWatcher *session_watcher;
-+  MetaBackend *backend;
- };
- 
- static void
-@@ -62,12 +63,20 @@ meta_screen_cast_get_connection (MetaScreenCast *screen_cast)
-   return g_dbus_interface_skeleton_get_connection (interface_skeleton);
- }
- 
-+MetaBackend *
-+meta_screen_cast_get_backend (MetaScreenCast *screen_cast)
-+{
-+  return screen_cast->backend;
-+}
-+
- static gboolean
- register_remote_desktop_screen_cast_session (MetaScreenCastSession  *session,
-                                              const char             *remote_desktop_session_id,
-                                              GError                **error)
- {
--  MetaBackend *backend = meta_get_backend ();
-+  MetaScreenCast *screen_cast =
-+    meta_screen_cast_session_get_screen_cast (session);
-+  MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
-   MetaRemoteDesktop *remote_desktop = meta_backend_get_remote_desktop (backend);
-   MetaRemoteDesktopSession *remote_desktop_session;
- 
-@@ -244,11 +253,13 @@ meta_screen_cast_finalize (GObject *object)
- }
- 
- MetaScreenCast *
--meta_screen_cast_new (MetaDbusSessionWatcher *session_watcher)
-+meta_screen_cast_new (MetaBackend            *backend,
-+                      MetaDbusSessionWatcher *session_watcher)
- {
-   MetaScreenCast *screen_cast;
- 
-   screen_cast = g_object_new (META_TYPE_SCREEN_CAST, NULL);
-+  screen_cast->backend = backend;
-   screen_cast->session_watcher = session_watcher;
- 
-   return screen_cast;
-diff --git a/src/backends/meta-screen-cast.h b/src/backends/meta-screen-cast.h
-index a4fb8dd45..7e32b67b7 100644
---- a/src/backends/meta-screen-cast.h
-+++ b/src/backends/meta-screen-cast.h
-@@ -25,6 +25,7 @@
- 
- #include <glib-object.h>
- 
-+#include "backends/meta-backend-private.h"
- #include "backends/meta-dbus-session-watcher.h"
- #include "meta-dbus-screen-cast.h"
- 
-@@ -35,6 +36,9 @@ G_DECLARE_FINAL_TYPE (MetaScreenCast, meta_screen_cast,
- 
- GDBusConnection * meta_screen_cast_get_connection (MetaScreenCast *screen_cast);
- 
--MetaScreenCast * meta_screen_cast_new (MetaDbusSessionWatcher *session_watcher);
-+MetaBackend * meta_screen_cast_get_backend (MetaScreenCast *screen_cast);
-+
-+MetaScreenCast * meta_screen_cast_new (MetaBackend            *backend,
-+                                       MetaDbusSessionWatcher *session_watcher);
- 
- #endif /* META_SCREEN_CAST_H */
--- 
-2.20.1
-
-
-From 0bda3f694c9ea14239dd002856302e7d3007ae1c Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:37:13 +0100
-Subject: [PATCH 05/12] renderer: Add API to get view from logical monitor
-
-Will be used to get the view scale for a logical monitor, which is
-necessary for passing cursor sprites via PipeWire.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-renderer.c | 18 ++++++++++++++++++
- src/backends/meta-renderer.h |  3 +++
- 2 files changed, 21 insertions(+)
-
-diff --git a/src/backends/meta-renderer.c b/src/backends/meta-renderer.c
-index ceac7df57..ea93dc99e 100644
---- a/src/backends/meta-renderer.c
-+++ b/src/backends/meta-renderer.c
-@@ -94,6 +94,24 @@ meta_renderer_get_views (MetaRenderer *renderer)
-   return priv->views;
- }
- 
-+MetaRendererView *
-+meta_renderer_get_view_from_logical_monitor (MetaRenderer       *renderer,
-+                                             MetaLogicalMonitor *logical_monitor)
-+{
-+  GList *l;
-+
-+  for (l = meta_renderer_get_views (renderer); l; l = l->next)
-+    {
-+      MetaRendererView *view = l->data;
-+
-+      if (meta_renderer_view_get_logical_monitor (view) ==
-+          logical_monitor)
-+        return view;
-+    }
-+
-+  return NULL;
-+}
-+
- static void
- meta_renderer_finalize (GObject *object)
- {
-diff --git a/src/backends/meta-renderer.h b/src/backends/meta-renderer.h
-index bf51b51ab..1c617214b 100644
---- a/src/backends/meta-renderer.h
-+++ b/src/backends/meta-renderer.h
-@@ -53,4 +53,7 @@ void meta_renderer_set_legacy_view (MetaRenderer     *renderer,
- 
- GList * meta_renderer_get_views (MetaRenderer *renderer);
- 
-+MetaRendererView * meta_renderer_get_view_from_logical_monitor (MetaRenderer       *renderer,
-+                                                                MetaLogicalMonitor *logical_monitor);
-+
- #endif /* META_RENDERER_H */
--- 
-2.20.1
-
-
-From 1a928d060cccd344004a06dacc008ae0654e8f3e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:39:00 +0100
-Subject: [PATCH 06/12] backends/stage: Fix minor style issue
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-stage.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
-index 73ca70118..d1b7185e8 100644
---- a/src/backends/meta-stage.c
-+++ b/src/backends/meta-stage.c
-@@ -30,7 +30,8 @@
- #include "backends/meta-backend-private.h"
- #include "clutter/clutter-mutter.h"
- 
--struct _MetaOverlay {
-+struct _MetaOverlay
-+{
-   gboolean enabled;
- 
-   CoglPipeline *pipeline;
--- 
-2.20.1
-
-
-From 44655d12468c26bf6949e4b5137d324f9ec3b651 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 11:39:18 +0100
-Subject: [PATCH 07/12] backends/stage: Emit signal between painting actors and
- overlays
-
-Will be used by screen casting for embedding the cursor separately, or
-not including at all.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-stage.c | 18 ++++++++++++++++++
- 1 file changed, 18 insertions(+)
-
-diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
-index d1b7185e8..4ed56c04b 100644
---- a/src/backends/meta-stage.c
-+++ b/src/backends/meta-stage.c
-@@ -30,6 +30,15 @@
- #include "backends/meta-backend-private.h"
- #include "clutter/clutter-mutter.h"
- 
-+enum
-+{
-+  ACTORS_PAINTED,
-+
-+  N_SIGNALS
-+};
-+
-+static guint signals[N_SIGNALS];
-+
- struct _MetaOverlay
- {
-   gboolean enabled;
-@@ -141,6 +150,8 @@ meta_stage_paint (ClutterActor *actor)
- 
-   CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor);
- 
-+  g_signal_emit (stage, signals[ACTORS_PAINTED], 0);
-+
-   for (l = priv->overlays; l; l = l->next)
-     meta_overlay_paint (l->data);
- }
-@@ -180,6 +191,13 @@ meta_stage_class_init (MetaStageClass *klass)
- 
-   stage_class->activate = meta_stage_activate;
-   stage_class->deactivate = meta_stage_deactivate;
-+
-+  signals[ACTORS_PAINTED] = g_signal_new ("actors-painted",
-+                                          G_TYPE_FROM_CLASS (klass),
-+                                          G_SIGNAL_RUN_LAST,
-+                                          0,
-+                                          NULL, NULL, NULL,
-+                                          G_TYPE_NONE, 0);
- }
- 
- static void
--- 
-2.20.1
-
-
-From 6afa7372f3c8104fb5670130b1cd54980e9b6446 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 12 Dec 2018 15:29:21 +0100
-Subject: [PATCH 08/12] screen-cast/monitor-stream-src: Copy content before
- cursor is drawn
-
-To get a consistent behaviour no matter whether HW cursors are in use or
-not, make sure to copy the framebuffer content before the stage overlays
-(cursor sprite textures) are painted.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-screen-cast-monitor-stream-src.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
-index 382d7d4a2..b240744a8 100644
---- a/src/backends/meta-screen-cast-monitor-stream-src.c
-+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
-@@ -35,7 +35,7 @@ struct _MetaScreenCastMonitorStreamSrc
- {
-   MetaScreenCastStreamSrc parent;
- 
--  gulong stage_painted_handler_id;
-+  gulong actors_painted_handler_id;
- };
- 
- G_DEFINE_TYPE (MetaScreenCastMonitorStreamSrc,
-@@ -110,8 +110,8 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
-   ClutterStage *stage;
- 
-   stage = get_stage (monitor_src);
--  monitor_src->stage_painted_handler_id =
--    g_signal_connect_after (stage, "paint",
-+  monitor_src->actors_painted_handler_id =
-+    g_signal_connect_after (stage, "actors-painted",
-                             G_CALLBACK (stage_painted),
-                             monitor_src);
-   clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
-@@ -125,8 +125,8 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
-   ClutterStage *stage;
- 
-   stage = get_stage (monitor_src);
--  g_signal_handler_disconnect (stage, monitor_src->stage_painted_handler_id);
--  monitor_src->stage_painted_handler_id = 0;
-+  g_signal_handler_disconnect (stage, monitor_src->actors_painted_handler_id);
-+  monitor_src->actors_painted_handler_id = 0;
- }
- 
- static void
--- 
-2.20.1
-
-
-From 2e03a842ce2447f9d070a410d1a80c2e77b480a5 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 13 Sep 2018 11:28:51 +0200
-Subject: [PATCH 09/12] cursor-renderer: Add API to allow inhibiting HW cursor
-
-There may be reasons to temporarly inhibit the HW cursor under certain
-circumstances. Allow adding such inhibitations by adding API to the
-cursor renderer to allow API users to add generic inhibitors with
-whatever logic is deemed necessary.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-cursor-renderer.c           | 62 +++++++++++++++++++
- src/backends/meta-cursor-renderer.h           | 21 +++++++
- .../native/meta-cursor-renderer-native.c      |  4 ++
- 3 files changed, 87 insertions(+)
-
-diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
-index eb79737f1..0a456bee6 100644
---- a/src/backends/meta-cursor-renderer.c
-+++ b/src/backends/meta-cursor-renderer.c
-@@ -35,6 +35,9 @@
- 
- #include "meta-stage-private.h"
- 
-+G_DEFINE_INTERFACE (MetaHwCursorInhibitor, meta_hw_cursor_inhibitor,
-+                    G_TYPE_OBJECT)
-+
- struct _MetaCursorRendererPrivate
- {
-   float current_x;
-@@ -44,6 +47,8 @@ struct _MetaCursorRendererPrivate
-   MetaOverlay *stage_overlay;
-   gboolean handled_by_backend;
-   guint post_paint_func_id;
-+
-+  GList *hw_cursor_inhibitors;
- };
- typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
- 
-@@ -55,6 +60,21 @@ static guint signals[LAST_SIGNAL];
- 
- G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
- 
-+static gboolean
-+meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
-+                                                     MetaCursorSprite      *cursor_sprite)
-+{
-+  MetaHwCursorInhibitorInterface *iface =
-+    META_HW_CURSOR_INHIBITOR_GET_IFACE (inhibitor);
-+
-+  return iface->is_cursor_sprite_inhibited (inhibitor, cursor_sprite);
-+}
-+
-+static void
-+meta_hw_cursor_inhibitor_default_init (MetaHwCursorInhibitorInterface *iface)
-+{
-+}
-+
- void
- meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
-                                    MetaCursorSprite   *cursor_sprite)
-@@ -283,3 +303,45 @@ meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
- 
-   return priv->displayed_cursor;
- }
-+
-+void
-+meta_cursor_renderer_add_hw_cursor_inhibitor (MetaCursorRenderer    *renderer,
-+                                              MetaHwCursorInhibitor *inhibitor)
-+{
-+  MetaCursorRendererPrivate *priv =
-+    meta_cursor_renderer_get_instance_private (renderer);
-+
-+  priv->hw_cursor_inhibitors = g_list_prepend (priv->hw_cursor_inhibitors,
-+                                               inhibitor);
-+}
-+
-+void
-+meta_cursor_renderer_remove_hw_cursor_inhibitor (MetaCursorRenderer    *renderer,
-+                                                 MetaHwCursorInhibitor *inhibitor)
-+{
-+  MetaCursorRendererPrivate *priv =
-+    meta_cursor_renderer_get_instance_private (renderer);
-+
-+  priv->hw_cursor_inhibitors = g_list_remove (priv->hw_cursor_inhibitors,
-+                                              inhibitor);
-+}
-+
-+gboolean
-+meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
-+                                              MetaCursorSprite   *cursor_sprite)
-+{
-+  MetaCursorRendererPrivate *priv =
-+    meta_cursor_renderer_get_instance_private (renderer);
-+  GList *l;
-+
-+  for (l = priv->hw_cursor_inhibitors; l; l = l->next)
-+    {
-+      MetaHwCursorInhibitor *inhibitor = l->data;
-+
-+      if (meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (inhibitor,
-+                                                               cursor_sprite))
-+        return TRUE;
-+    }
-+
-+  return FALSE;
-+}
-diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h
-index 830d16ef6..092f17f1e 100644
---- a/src/backends/meta-cursor-renderer.h
-+++ b/src/backends/meta-cursor-renderer.h
-@@ -30,6 +30,18 @@
- #include <meta/screen.h>
- #include "meta-cursor.h"
- 
-+#define META_TYPE_HW_CURSOR_INHIBITOR (meta_hw_cursor_inhibitor_get_type ())
-+G_DECLARE_INTERFACE (MetaHwCursorInhibitor, meta_hw_cursor_inhibitor,
-+                     META, HW_CURSOR_INHIBITOR, GObject)
-+
-+struct _MetaHwCursorInhibitorInterface
-+{
-+  GTypeInterface parent_iface;
-+
-+  gboolean (* is_cursor_sprite_inhibited) (MetaHwCursorInhibitor *inhibitor,
-+                                           MetaCursorSprite      *cursor_sprite);
-+};
-+
- #define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
- G_DECLARE_DERIVABLE_TYPE (MetaCursorRenderer, meta_cursor_renderer,
-                           META, CURSOR_RENDERER, GObject);
-@@ -55,6 +67,15 @@ void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
- 
- MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
- 
-+void meta_cursor_renderer_add_hw_cursor_inhibitor (MetaCursorRenderer    *renderer,
-+                                                   MetaHwCursorInhibitor *inhibitor);
-+
-+void meta_cursor_renderer_remove_hw_cursor_inhibitor (MetaCursorRenderer    *renderer,
-+                                                      MetaHwCursorInhibitor *inhibitor);
-+
-+gboolean meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
-+                                                       MetaCursorSprite   *cursor_sprite);
-+
- ClutterRect meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
-                                                  MetaCursorSprite   *cursor_sprite);
- 
-diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c
-index 29800953b..3ff4e81fb 100644
---- a/src/backends/native/meta-cursor-renderer-native.c
-+++ b/src/backends/native/meta-cursor-renderer-native.c
-@@ -587,6 +587,10 @@ should_have_hw_cursor (MetaCursorRenderer *renderer,
-   if (!cursor_sprite)
-     return FALSE;
- 
-+  if (meta_cursor_renderer_is_hw_cursors_inhibited (renderer,
-+                                                    cursor_sprite))
-+    return FALSE;
-+
-   for (l = gpus; l; l = l->next)
-     {
-       MetaGpuKms *gpu_kms = l->data;
--- 
-2.20.1
-
-
-From 65eaf0c6a12ca48fc92fbe4492726cd145549924 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Fri, 14 Dec 2018 17:47:57 +0100
-Subject: [PATCH 10/12] screen-cast: Add 'cursor-mode' to allow decoupled
- cursor updates
-
-The 'cursor-mode', which currently is limited to RecordMonitor(), allows
-the user to either do screen casts where the cursor is hidden, embedded
-in the framebuffer, or sent as PipeWire stream metadata.
-
-The latter allows the user to get cursor updates sent, including the
-cursor sprite, without requiring a stage paint each frame. Currently
-this is done by using the cursor sprite texture, and either reading
-directly from, or drawing to an offscreen framebuffer which is read from
-instead, in case the texture is scaled.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- configure.ac                                  |   2 +-
- .../meta-screen-cast-monitor-stream-src.c     | 416 +++++++++++++++++-
- .../meta-screen-cast-monitor-stream.c         |  12 +-
- .../meta-screen-cast-monitor-stream.h         |  11 +-
- src/backends/meta-screen-cast-session.c       |  31 ++
- src/backends/meta-screen-cast-stream-src.c    | 128 ++++--
- src/backends/meta-screen-cast-stream-src.h    |  24 +-
- src/backends/meta-screen-cast-stream.c        |  30 ++
- src/backends/meta-screen-cast-stream.h        |   2 +
- .../meta-screen-cast-window-stream-src.c      |   4 +-
- src/backends/meta-screen-cast.h               |   7 +
- src/org.gnome.Mutter.ScreenCast.xml           |  12 +-
- 12 files changed, 622 insertions(+), 57 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 2aa9c4352..449f3d693 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -245,7 +245,7 @@ AC_ARG_ENABLE(remote-desktop,
-   enable_remote_desktop=no
- )
- AS_IF([test "$enable_remote_desktop" = "yes"], [
--  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.2 >= 0.2.2"
-+  MUTTER_PC_MODULES="$MUTTER_PC_MODULES libpipewire-0.2 >= 0.2.5"
-   AC_DEFINE([HAVE_REMOTE_DESKTOP],[1], [Defined if screen cast and remote desktop support is enabled])
- ])
- AM_CONDITIONAL([HAVE_REMOTE_DESKTOP],[test "$enable_remote_desktop" = "yes"])
-diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
-index b240744a8..6be477989 100644
---- a/src/backends/meta-screen-cast-monitor-stream-src.c
-+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
-@@ -24,23 +24,36 @@
- 
- #include "backends/meta-screen-cast-monitor-stream-src.h"
- 
-+#include <spa/buffer/meta.h>
-+
- #include "backends/meta-backend-private.h"
-+#include "backends/meta-cursor-tracker-private.h"
- #include "backends/meta-screen-cast-monitor-stream.h"
-+#include "backends/meta-screen-cast-session.h"
- #include "backends/meta-logical-monitor.h"
- #include "backends/meta-monitor.h"
- #include "clutter/clutter.h"
- #include "clutter/clutter-mutter.h"
-+#include "core/boxes-private.h"
- 
- struct _MetaScreenCastMonitorStreamSrc
- {
-   MetaScreenCastStreamSrc parent;
- 
-   gulong actors_painted_handler_id;
-+  gulong paint_handler_id;
-+  gulong cursor_moved_handler_id;
-+  gulong cursor_changed_handler_id;
- };
- 
--G_DEFINE_TYPE (MetaScreenCastMonitorStreamSrc,
--               meta_screen_cast_monitor_stream_src,
--               META_TYPE_SCREEN_CAST_STREAM_SRC)
-+static void
-+hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface);
-+
-+G_DEFINE_TYPE_WITH_CODE (MetaScreenCastMonitorStreamSrc,
-+                         meta_screen_cast_monitor_stream_src,
-+                         META_TYPE_SCREEN_CAST_STREAM_SRC,
-+                         G_IMPLEMENT_INTERFACE (META_TYPE_HW_CURSOR_INHIBITOR,
-+                                                hw_cursor_inhibitor_iface_init))
- 
- static ClutterStage *
- get_stage (MetaScreenCastMonitorStreamSrc *monitor_src)
-@@ -102,18 +115,163 @@ stage_painted (ClutterActor                   *actor,
-   meta_screen_cast_stream_src_maybe_record_frame (src);
- }
- 
-+static MetaBackend *
-+get_backend (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
-+  MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
-+  MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
-+  MetaScreenCast *screen_cast =
-+    meta_screen_cast_session_get_screen_cast (session);
-+
-+  return meta_screen_cast_get_backend (screen_cast);
-+}
-+
-+static gboolean
-+is_cursor_in_stream (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaBackend *backend = get_backend (monitor_src);
-+  MetaCursorRenderer *cursor_renderer =
-+    meta_backend_get_cursor_renderer (backend);
-+  MetaMonitor *monitor;
-+  MetaLogicalMonitor *logical_monitor;
-+  MetaRectangle logical_monitor_layout;
-+  ClutterRect logical_monitor_rect;
-+  MetaCursorSprite *cursor_sprite;
-+
-+  monitor = get_monitor (monitor_src);
-+  logical_monitor = meta_monitor_get_logical_monitor (monitor);
-+  logical_monitor_layout = meta_logical_monitor_get_layout (logical_monitor);
-+  logical_monitor_rect =
-+    meta_rectangle_to_clutter_rect (&logical_monitor_layout);
-+
-+  cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
-+  if (cursor_sprite)
-+    {
-+      ClutterRect cursor_rect;
-+
-+      cursor_rect = meta_cursor_renderer_calculate_rect (cursor_renderer,
-+                                                         cursor_sprite);
-+      return clutter_rect_intersection (&cursor_rect,
-+                                        &logical_monitor_rect,
-+                                        NULL);
-+    }
-+  else
-+    {
-+      ClutterPoint cursor_position;
-+
-+      cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
-+      return clutter_rect_contains_point (&logical_monitor_rect,
-+                                          &cursor_position);
-+    }
-+}
-+
-+static void
-+sync_cursor_state (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
-+  ClutterStage *stage = get_stage (monitor_src);
-+
-+  if (!is_cursor_in_stream (monitor_src))
-+    return;
-+
-+  if (clutter_stage_is_redraw_queued (stage))
-+    return;
-+
-+  meta_screen_cast_stream_src_maybe_record_frame (src);
-+}
-+
-+static void
-+cursor_moved (MetaCursorTracker              *cursor_tracker,
-+              float                           x,
-+              float                           y,
-+              MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  sync_cursor_state (monitor_src);
-+}
-+
-+static void
-+cursor_changed (MetaCursorTracker              *cursor_tracker,
-+                MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  sync_cursor_state (monitor_src);
-+}
-+
-+static MetaCursorRenderer *
-+get_cursor_renderer (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
-+  MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
-+  MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
-+  MetaScreenCast *screen_cast =
-+    meta_screen_cast_session_get_screen_cast (session);
-+  MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
-+
-+  return meta_backend_get_cursor_renderer (backend);
-+}
-+
-+static void
-+inhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaCursorRenderer *cursor_renderer;
-+  MetaHwCursorInhibitor *inhibitor;
-+
-+  cursor_renderer = get_cursor_renderer (monitor_src);
-+  inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src);
-+  meta_cursor_renderer_add_hw_cursor_inhibitor (cursor_renderer, inhibitor);
-+}
-+
-+static void
-+uninhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src)
-+{
-+  MetaCursorRenderer *cursor_renderer;
-+  MetaHwCursorInhibitor *inhibitor;
-+
-+  cursor_renderer = get_cursor_renderer (monitor_src);
-+  inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src);
-+  meta_cursor_renderer_remove_hw_cursor_inhibitor (cursor_renderer, inhibitor);
-+}
-+
- static void
- meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
- {
-   MetaScreenCastMonitorStreamSrc *monitor_src =
-     META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
-+  MetaBackend *backend = get_backend (monitor_src);
-+  MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
-   ClutterStage *stage;
-+  MetaScreenCastStream *stream;
- 
-+  stream = meta_screen_cast_stream_src_get_stream (src);
-   stage = get_stage (monitor_src);
--  monitor_src->actors_painted_handler_id =
--    g_signal_connect_after (stage, "actors-painted",
--                            G_CALLBACK (stage_painted),
--                            monitor_src);
-+
-+  switch (meta_screen_cast_stream_get_cursor_mode (stream))
-+    {
-+    case META_SCREEN_CAST_CURSOR_MODE_METADATA:
-+      monitor_src->cursor_moved_handler_id =
-+        g_signal_connect_after (cursor_tracker, "cursor-moved",
-+                                G_CALLBACK (cursor_moved),
-+                                monitor_src);
-+      monitor_src->cursor_changed_handler_id =
-+        g_signal_connect_after (cursor_tracker, "cursor-changed",
-+                                G_CALLBACK (cursor_changed),
-+                                monitor_src);
-+      /* Intentional fall-through */
-+    case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
-+      monitor_src->actors_painted_handler_id =
-+        g_signal_connect (stage, "actors-painted",
-+                          G_CALLBACK (stage_painted),
-+                          monitor_src);
-+      break;
-+    case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
-+      inhibit_hw_cursor (monitor_src);
-+      monitor_src->paint_handler_id =
-+        g_signal_connect_after (stage, "paint",
-+                                G_CALLBACK (stage_painted),
-+                                monitor_src);
-+      break;
-+    }
-+
-   clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
- }
- 
-@@ -122,14 +280,43 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
- {
-   MetaScreenCastMonitorStreamSrc *monitor_src =
-     META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
-+  MetaBackend *backend = get_backend (monitor_src);
-+  MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
-   ClutterStage *stage;
- 
-   stage = get_stage (monitor_src);
--  g_signal_handler_disconnect (stage, monitor_src->actors_painted_handler_id);
--  monitor_src->actors_painted_handler_id = 0;
-+
-+  if (monitor_src->actors_painted_handler_id)
-+    {
-+      g_signal_handler_disconnect (stage,
-+                                   monitor_src->actors_painted_handler_id);
-+      monitor_src->actors_painted_handler_id = 0;
-+    }
-+
-+  if (monitor_src->paint_handler_id)
-+    {
-+      g_signal_handler_disconnect (stage,
-+                                   monitor_src->paint_handler_id);
-+      monitor_src->paint_handler_id = 0;
-+      uninhibit_hw_cursor (monitor_src);
-+    }
-+
-+  if (monitor_src->cursor_moved_handler_id)
-+    {
-+      g_signal_handler_disconnect (cursor_tracker,
-+                                   monitor_src->cursor_moved_handler_id);
-+      monitor_src->cursor_moved_handler_id = 0;
-+    }
-+
-+  if (monitor_src->cursor_changed_handler_id)
-+    {
-+      g_signal_handler_disconnect (cursor_tracker,
-+                                   monitor_src->cursor_changed_handler_id);
-+      monitor_src->cursor_changed_handler_id = 0;
-+    }
- }
- 
--static void
-+static gboolean
- meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-                                                   uint8_t                 *data)
- {
-@@ -140,9 +327,216 @@ meta_screen_cast_monitor_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-   MetaLogicalMonitor *logical_monitor;
- 
-   stage = get_stage (monitor_src);
-+  if (!clutter_stage_is_redraw_queued (stage))
-+    return FALSE;
-+
-   monitor = get_monitor (monitor_src);
-   logical_monitor = meta_monitor_get_logical_monitor (monitor);
-   clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data);
-+
-+  return TRUE;
-+}
-+
-+static gboolean
-+draw_cursor_sprite_via_offscreen (MetaScreenCastMonitorStreamSrc  *monitor_src,
-+                                  CoglTexture                     *cursor_texture,
-+                                  int                              bitmap_width,
-+                                  int                              bitmap_height,
-+                                  uint32_t                        *bitmap_data,
-+                                  GError                         **error)
-+{
-+  MetaBackend *backend = get_backend (monitor_src);
-+  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-+  CoglContext *cogl_context =
-+    clutter_backend_get_cogl_context (clutter_backend);
-+  CoglTexture2D *bitmap_texture;
-+  CoglOffscreen *offscreen;
-+  CoglFramebuffer *fb;
-+  CoglPipeline *pipeline;
-+  CoglColor clear_color;
-+
-+  bitmap_texture = cogl_texture_2d_new_with_size (cogl_context,
-+                                                  bitmap_width, bitmap_height);
-+  cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (bitmap_texture),
-+                                          FALSE);
-+  if (!cogl_texture_allocate (COGL_TEXTURE (bitmap_texture), error))
-+    {
-+      cogl_object_unref (bitmap_texture);
-+      return FALSE;
-+    }
-+
-+  offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (bitmap_texture));
-+  fb = COGL_FRAMEBUFFER (offscreen);
-+  cogl_object_unref (bitmap_texture);
-+  if (!cogl_framebuffer_allocate (fb, error))
-+    {
-+      cogl_object_unref (fb);
-+      return FALSE;
-+    }
-+
-+  pipeline = cogl_pipeline_new (cogl_context);
-+  cogl_pipeline_set_layer_texture (pipeline, 0, cursor_texture);
-+  cogl_pipeline_set_layer_filters (pipeline, 0,
-+                                   COGL_PIPELINE_FILTER_LINEAR,
-+                                   COGL_PIPELINE_FILTER_LINEAR);
-+  cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
-+  cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
-+  cogl_framebuffer_draw_rectangle (fb, pipeline,
-+                                   -1, 1, 1, -1);
-+  cogl_object_unref (pipeline);
-+
-+  cogl_framebuffer_read_pixels (fb,
-+                                0, 0,
-+                                bitmap_width, bitmap_height,
-+                                COGL_PIXEL_FORMAT_RGBA_8888_PRE,
-+                                (uint8_t *) bitmap_data);
-+  cogl_object_unref (fb);
-+
-+  return TRUE;
-+}
-+
-+static void
-+meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *src,
-+                                                         struct spa_meta_cursor  *spa_meta_cursor)
-+{
-+  MetaScreenCastMonitorStreamSrc *monitor_src =
-+    META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
-+  MetaBackend *backend = get_backend (monitor_src);
-+  MetaCursorRenderer *cursor_renderer =
-+    meta_backend_get_cursor_renderer (backend);
-+  MetaRenderer *renderer = meta_backend_get_renderer (backend);
-+  MetaSpaType *spa_type = meta_screen_cast_stream_src_get_spa_type (src);
-+  GError *error = NULL;
-+  MetaCursorSprite *cursor_sprite;
-+  CoglTexture *cursor_texture;
-+  MetaMonitor *monitor;
-+  MetaLogicalMonitor *logical_monitor;
-+  MetaRectangle logical_monitor_layout;
-+  ClutterRect logical_monitor_rect;
-+  MetaRendererView *view;
-+  float view_scale;
-+  ClutterPoint cursor_position;
-+  struct spa_meta_bitmap *spa_meta_bitmap;
-+
-+  cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
-+  if (cursor_sprite)
-+    cursor_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
-+  else
-+    cursor_texture = NULL;
-+
-+  if (!is_cursor_in_stream (monitor_src))
-+    {
-+      spa_meta_cursor->id = 0;
-+      return;
-+    }
-+
-+  monitor = get_monitor (monitor_src);
-+  logical_monitor = meta_monitor_get_logical_monitor (monitor);
-+  logical_monitor_layout = meta_logical_monitor_get_layout (logical_monitor);
-+  logical_monitor_rect =
-+    meta_rectangle_to_clutter_rect (&logical_monitor_layout);
-+
-+  view = meta_renderer_get_view_from_logical_monitor (renderer,
-+                                                      logical_monitor);
-+  if (view)
-+    view_scale = clutter_stage_view_get_scale (CLUTTER_STAGE_VIEW (view));
-+  else
-+    view_scale = 1.0;
-+
-+  cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
-+  cursor_position.x -= logical_monitor_rect.origin.x;
-+  cursor_position.y -= logical_monitor_rect.origin.y;
-+  cursor_position.x *= view_scale;
-+  cursor_position.y *= view_scale;
-+
-+  spa_meta_cursor->id = 1;
-+  spa_meta_cursor->position.x = (int32_t) roundf (cursor_position.x);
-+  spa_meta_cursor->position.y = (int32_t) roundf (cursor_position.y);
-+  spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
-+
-+  spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
-+                                spa_meta_cursor->bitmap_offset,
-+                                struct spa_meta_bitmap);
-+  spa_meta_bitmap->format = spa_type->video_format.RGBA;
-+  spa_meta_bitmap->offset = sizeof (struct spa_meta_bitmap);
-+
-+  if (cursor_texture)
-+    {
-+      float cursor_scale;
-+      float bitmap_scale;
-+      int hotspot_x, hotspot_y;
-+      int texture_width, texture_height;
-+      int bitmap_width, bitmap_height;
-+      uint32_t *bitmap_data;
-+
-+      cursor_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
-+      bitmap_scale = view_scale * cursor_scale;
-+
-+      meta_cursor_sprite_get_hotspot (cursor_sprite, &hotspot_x, &hotspot_y);
-+      spa_meta_cursor->hotspot.x = (int32_t) roundf (hotspot_x * bitmap_scale);
-+      spa_meta_cursor->hotspot.y = (int32_t) roundf (hotspot_y * bitmap_scale);
-+
-+      texture_width = cogl_texture_get_width (cursor_texture);
-+      texture_height = cogl_texture_get_height (cursor_texture);
-+      bitmap_width = texture_width * bitmap_scale;
-+      bitmap_height = texture_height * bitmap_scale;
-+
-+      spa_meta_bitmap->size.width = bitmap_width;
-+      spa_meta_bitmap->size.height = bitmap_height;
-+      spa_meta_bitmap->stride = bitmap_width * 4;
-+
-+      bitmap_data = SPA_MEMBER (spa_meta_bitmap,
-+                                spa_meta_bitmap->offset,
-+                                uint32_t);
-+
-+      if (texture_width == bitmap_width &&
-+          texture_height == bitmap_height)
-+        {
-+          cogl_texture_get_data (cursor_texture,
-+                                 COGL_PIXEL_FORMAT_RGBA_8888_PRE,
-+                                 texture_width * 4,
-+                                 (uint8_t *) bitmap_data);
-+        }
-+      else
-+        {
-+          if (!draw_cursor_sprite_via_offscreen (monitor_src,
-+                                                 cursor_texture,
-+                                                 bitmap_width,
-+                                                 bitmap_height,
-+                                                 bitmap_data,
-+                                                 &error))
-+            {
-+              g_warning ("Failed to draw cursor via offscreen: %s",
-+                         error->message);
-+              g_error_free (error);
-+              spa_meta_cursor->id = 0;
-+            }
-+        }
-+    }
-+  else
-+    {
-+      spa_meta_cursor->hotspot.x = 0;
-+      spa_meta_cursor->hotspot.y = 0;
-+
-+      *spa_meta_bitmap = (struct spa_meta_bitmap) { 0 };
-+    }
-+}
-+
-+static gboolean
-+meta_screen_cast_monitor_stream_src_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
-+                                                                MetaCursorSprite      *cursor_sprite)
-+{
-+  MetaScreenCastMonitorStreamSrc *monitor_src =
-+    META_SCREEN_CAST_MONITOR_STREAM_SRC (inhibitor);
-+
-+  return is_cursor_in_stream (monitor_src);
-+}
-+
-+static void
-+hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface)
-+{
-+  iface->is_cursor_sprite_inhibited =
-+    meta_screen_cast_monitor_stream_src_is_cursor_sprite_inhibited;
- }
- 
- MetaScreenCastMonitorStreamSrc *
-@@ -169,4 +563,6 @@ meta_screen_cast_monitor_stream_src_class_init (MetaScreenCastMonitorStreamSrcCl
-   src_class->enable = meta_screen_cast_monitor_stream_src_enable;
-   src_class->disable = meta_screen_cast_monitor_stream_src_disable;
-   src_class->record_frame = meta_screen_cast_monitor_stream_src_record_frame;
-+  src_class->set_cursor_metadata =
-+    meta_screen_cast_monitor_stream_src_set_cursor_metadata;
- }
-diff --git a/src/backends/meta-screen-cast-monitor-stream.c b/src/backends/meta-screen-cast-monitor-stream.c
-index a6bed1b52..33b9f026a 100644
---- a/src/backends/meta-screen-cast-monitor-stream.c
-+++ b/src/backends/meta-screen-cast-monitor-stream.c
-@@ -105,11 +105,12 @@ meta_screen_cast_monitor_stream_get_monitor (MetaScreenCastMonitorStream *monito
- }
- 
- MetaScreenCastMonitorStream *
--meta_screen_cast_monitor_stream_new (MetaScreenCastSession  *session,
--                                     GDBusConnection        *connection,
--                                     MetaMonitor            *monitor,
--                                     ClutterStage           *stage,
--                                     GError                **error)
-+meta_screen_cast_monitor_stream_new (MetaScreenCastSession     *session,
-+                                     GDBusConnection           *connection,
-+                                     MetaMonitor               *monitor,
-+                                     ClutterStage              *stage,
-+                                     MetaScreenCastCursorMode   cursor_mode,
-+                                     GError                   **error)
- {
-   MetaGpu *gpu = meta_monitor_get_gpu (monitor);
-   MetaMonitorManager *monitor_manager = meta_gpu_get_monitor_manager (gpu);
-@@ -126,6 +127,7 @@ meta_screen_cast_monitor_stream_new (MetaScreenCastSession  *session,
-                                    error,
-                                    "session", session,
-                                    "connection", connection,
-+                                   "cursor-mode", cursor_mode,
-                                    "monitor", monitor,
-                                    NULL);
-   if (!monitor_stream)
-diff --git a/src/backends/meta-screen-cast-monitor-stream.h b/src/backends/meta-screen-cast-monitor-stream.h
-index 98f160c88..f8dc04181 100644
---- a/src/backends/meta-screen-cast-monitor-stream.h
-+++ b/src/backends/meta-screen-cast-monitor-stream.h
-@@ -35,11 +35,12 @@ G_DECLARE_FINAL_TYPE (MetaScreenCastMonitorStream,
-                       META, SCREEN_CAST_MONITOR_STREAM,
-                       MetaScreenCastStream)
- 
--MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (MetaScreenCastSession  *session,
--                                                                   GDBusConnection        *connection,
--                                                                   MetaMonitor            *monitor,
--                                                                   ClutterStage           *stage,
--                                                                   GError                **error);
-+MetaScreenCastMonitorStream * meta_screen_cast_monitor_stream_new (MetaScreenCastSession     *session,
-+                                                                   GDBusConnection           *connection,
-+                                                                   MetaMonitor               *monitor,
-+                                                                   ClutterStage              *stage,
-+                                                                   MetaScreenCastCursorMode   cursor_mode,
-+                                                                   GError                   **error);
- 
- ClutterStage * meta_screen_cast_monitor_stream_get_stage (MetaScreenCastMonitorStream *monitor_stream);
- 
-diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c
-index 6a8f2d328..45d403dca 100644
---- a/src/backends/meta-screen-cast-session.c
-+++ b/src/backends/meta-screen-cast-session.c
-@@ -262,6 +262,20 @@ on_stream_closed (MetaScreenCastStream  *stream,
-   meta_screen_cast_session_close (session);
- }
- 
-+static gboolean
-+is_valid_cursor_mode (MetaScreenCastCursorMode cursor_mode)
-+{
-+  switch (cursor_mode)
-+    {
-+    case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
-+    case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
-+    case META_SCREEN_CAST_CURSOR_MODE_METADATA:
-+      return TRUE;
-+    }
-+
-+  return FALSE;
-+}
-+
- static gboolean
- handle_record_monitor (MetaDBusScreenCastSession *skeleton,
-                        GDBusMethodInvocation     *invocation,
-@@ -275,6 +289,7 @@ handle_record_monitor (MetaDBusScreenCastSession *skeleton,
-   MetaMonitorManager *monitor_manager =
-     meta_backend_get_monitor_manager (backend);
-   MetaMonitor *monitor;
-+  MetaScreenCastCursorMode cursor_mode;
-   ClutterStage *stage;
-   GError *error = NULL;
-   MetaScreenCastMonitorStream *monitor_stream;
-@@ -306,12 +321,28 @@ handle_record_monitor (MetaDBusScreenCastSession *skeleton,
-       return TRUE;
-     }
- 
-+  if (!g_variant_lookup (properties_variant, "cursor-mode", "u", &cursor_mode))
-+    {
-+      cursor_mode = META_SCREEN_CAST_CURSOR_MODE_HIDDEN;
-+    }
-+  else
-+    {
-+      if (!is_valid_cursor_mode (cursor_mode))
-+        {
-+          g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
-+                                                 G_DBUS_ERROR_FAILED,
-+                                                 "Unknown cursor mode");
-+          return TRUE;
-+        }
-+    }
-+
-   stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
- 
-   monitor_stream = meta_screen_cast_monitor_stream_new (session,
-                                                         connection,
-                                                         monitor,
-                                                         stage,
-+                                                        cursor_mode,
-                                                         &error);
-   if (!monitor_stream)
-     {
-diff --git a/src/backends/meta-screen-cast-stream-src.c b/src/backends/meta-screen-cast-stream-src.c
-index 673a4640b..9f97bf36d 100644
---- a/src/backends/meta-screen-cast-stream-src.c
-+++ b/src/backends/meta-screen-cast-stream-src.c
-@@ -40,6 +40,10 @@
- #define PRIVATE_OWNER_FROM_FIELD(TypeName, field_ptr, field_name) \
-   (TypeName *)((guint8 *)(field_ptr) - G_PRIVATE_OFFSET (TypeName, field_name))
- 
-+#define CURSOR_META_SIZE(width, height) \
-+  (sizeof (struct spa_meta_cursor) + \
-+   sizeof (struct spa_meta_bitmap) + width * height * 4)
-+
- enum
- {
-   PROP_0,
-@@ -57,14 +61,6 @@ enum
- 
- static guint signals[N_SIGNALS];
- 
--typedef struct _MetaSpaType
--{
--  struct spa_type_media_type media_type;
--  struct spa_type_media_subtype media_subtype;
--  struct spa_type_format_video format_video;
--  struct spa_type_video_format video_format;
--} MetaSpaType;
--
- typedef struct _MetaPipeWireSource
- {
-   GSource base;
-@@ -133,14 +129,68 @@ meta_screen_cast_stream_src_get_videocrop (MetaScreenCastStreamSrc *src,
-   return FALSE;
- }
- 
--static void
-+static gboolean
- meta_screen_cast_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-                                           uint8_t                 *data)
- {
-   MetaScreenCastStreamSrcClass *klass =
-     META_SCREEN_CAST_STREAM_SRC_GET_CLASS (src);
- 
--  klass->record_frame (src, data);
-+  return klass->record_frame (src, data);
-+}
-+
-+static void
-+meta_screen_cast_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *src,
-+                                                 struct spa_meta_cursor  *spa_meta_cursor)
-+{
-+  MetaScreenCastStreamSrcClass *klass =
-+    META_SCREEN_CAST_STREAM_SRC_GET_CLASS (src);
-+
-+  if (klass->set_cursor_metadata)
-+    klass->set_cursor_metadata (src, spa_meta_cursor);
-+}
-+
-+MetaSpaType *
-+meta_screen_cast_stream_src_get_spa_type (MetaScreenCastStreamSrc *src)
-+{
-+  MetaScreenCastStreamSrcPrivate *priv =
-+    meta_screen_cast_stream_src_get_instance_private (src);
-+
-+  return &priv->spa_type;
-+}
-+
-+static void
-+add_cursor_metadata (MetaScreenCastStreamSrc *src,
-+                     struct spa_buffer       *spa_buffer)
-+{
-+  MetaScreenCastStreamSrcPrivate *priv =
-+    meta_screen_cast_stream_src_get_instance_private (src);
-+  MetaSpaType *spa_type = &priv->spa_type;
-+  struct spa_meta_cursor *spa_meta_cursor;
-+
-+  spa_meta_cursor = spa_buffer_find_meta (spa_buffer, spa_type->meta_cursor);
-+  if (spa_meta_cursor)
-+    meta_screen_cast_stream_src_set_cursor_metadata (src, spa_meta_cursor);
-+}
-+
-+static void
-+maybe_record_cursor (MetaScreenCastStreamSrc *src,
-+                     struct spa_buffer       *spa_buffer,
-+                     uint8_t                 *data)
-+{
-+  MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
-+
-+  switch (meta_screen_cast_stream_get_cursor_mode (stream))
-+    {
-+    case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
-+    case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
-+      return;
-+    case META_SCREEN_CAST_CURSOR_MODE_METADATA:
-+      add_cursor_metadata (src, spa_buffer);
-+      return;
-+    }
-+
-+  g_assert_not_reached ();
- }
- 
- void
-@@ -151,7 +201,6 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-   MetaRectangle crop_rect;
-   struct pw_buffer *buffer;
-   struct spa_buffer *spa_buffer;
--  struct spa_meta_video_crop *spa_meta_video_crop;
-   uint8_t *map = NULL;
-   uint8_t *data;
-   uint64_t now_us;
-@@ -199,35 +248,45 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
-       return;
-     }
- 
--  meta_screen_cast_stream_src_record_frame (src, data);
--
--  /* Update VideoCrop if needed */
--  spa_meta_video_crop = spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
--  if (spa_meta_video_crop)
-+  if (meta_screen_cast_stream_src_record_frame (src, data))
-     {
--      if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
--        {
--          spa_meta_video_crop->x = crop_rect.x;
--          spa_meta_video_crop->y = crop_rect.y;
--          spa_meta_video_crop->width = crop_rect.width;
--          spa_meta_video_crop->height = crop_rect.height;
--        }
--      else
-+      struct spa_meta_video_crop *spa_meta_video_crop;
-+
-+      spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
-+
-+      /* Update VideoCrop if needed */
-+      spa_meta_video_crop =
-+        spa_buffer_find_meta (spa_buffer, priv->pipewire_type->meta.VideoCrop);
-+      if (spa_meta_video_crop)
-         {
--          spa_meta_video_crop->x = 0;
--          spa_meta_video_crop->y = 0;
--          spa_meta_video_crop->width = priv->stream_width;
--          spa_meta_video_crop->height = priv->stream_height;
-+          if (meta_screen_cast_stream_src_get_videocrop (src, &crop_rect))
-+            {
-+              spa_meta_video_crop->x = crop_rect.x;
-+              spa_meta_video_crop->y = crop_rect.y;
-+              spa_meta_video_crop->width = crop_rect.width;
-+              spa_meta_video_crop->height = crop_rect.height;
-+            }
-+          else
-+            {
-+              spa_meta_video_crop->x = 0;
-+              spa_meta_video_crop->y = 0;
-+              spa_meta_video_crop->width = priv->stream_width;
-+              spa_meta_video_crop->height = priv->stream_height;
-+            }
-         }
-     }
-+  else
-+    {
-+      spa_buffer->datas[0].chunk->size = 0;
-+    }
-+
-+  maybe_record_cursor (src, spa_buffer, data);
- 
-   priv->last_frame_timestamp_us = now_us;
- 
-   if (map)
-     munmap (map, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset);
- 
--  spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
--
-   pw_stream_queue_buffer (priv->pipewire_stream, buffer);
- }
- 
-@@ -314,7 +373,7 @@ on_stream_format_changed (void                 *data,
-   uint8_t params_buffer[1024];
-   int32_t width, height, stride, size;
-   struct spa_pod_builder pod_builder;
--  const struct spa_pod *params[2];
-+  const struct spa_pod *params[3];
-   const int bpp = 4;
- 
-   if (!format)
-@@ -348,6 +407,12 @@ on_stream_format_changed (void                 *data,
-     ":", pipewire_type->param_meta.type, "I", pipewire_type->meta.VideoCrop,
-     ":", pipewire_type->param_meta.size, "i", sizeof (struct spa_meta_video_crop));
- 
-+  params[2] = spa_pod_builder_object (
-+    &pod_builder,
-+    pipewire_type->param.idMeta, pipewire_type->param_meta.Meta,
-+    ":", pipewire_type->param_meta.type, "I", priv->spa_type.meta_cursor,
-+    ":", pipewire_type->param_meta.size, "i", CURSOR_META_SIZE (64, 64));
-+
-   pw_stream_finish_format (priv->pipewire_stream, 0,
-                            params, G_N_ELEMENTS (params));
- }
-@@ -517,6 +582,7 @@ init_spa_type (MetaSpaType         *type,
-   spa_type_media_subtype_map (map, &type->media_subtype);
-   spa_type_format_video_map (map, &type->format_video);
-   spa_type_video_format_map (map, &type->video_format);
-+  type->meta_cursor = spa_type_map_get_id(map, SPA_TYPE_META__Cursor);
- }
- 
- static MetaPipeWireSource *
-diff --git a/src/backends/meta-screen-cast-stream-src.h b/src/backends/meta-screen-cast-stream-src.h
-index f3b3fd779..f2f96f213 100644
---- a/src/backends/meta-screen-cast-stream-src.h
-+++ b/src/backends/meta-screen-cast-stream-src.h
-@@ -24,10 +24,26 @@
- #define META_SCREEN_CAST_STREAM_SRC_H
- 
- #include <glib-object.h>
-+#include <spa/param/video/format-utils.h>
-+#include <spa/buffer/meta.h>
- 
-+#include "backends/meta-backend-private.h"
-+#include "backends/meta-cursor-renderer.h"
-+#include "backends/meta-cursor.h"
-+#include "backends/meta-renderer.h"
- #include "clutter/clutter.h"
-+#include "cogl/cogl.h"
- #include "meta/boxes.h"
- 
-+typedef struct _MetaSpaType
-+{
-+  struct spa_type_media_type media_type;
-+  struct spa_type_media_subtype media_subtype;
-+  struct spa_type_format_video format_video;
-+  struct spa_type_video_format video_format;
-+  uint32_t meta_cursor;
-+} MetaSpaType;
-+
- typedef struct _MetaScreenCastStream MetaScreenCastStream;
- 
- #define META_TYPE_SCREEN_CAST_STREAM_SRC (meta_screen_cast_stream_src_get_type ())
-@@ -46,14 +62,18 @@ struct _MetaScreenCastStreamSrcClass
-                       float                   *frame_rate);
-   void (* enable) (MetaScreenCastStreamSrc *src);
-   void (* disable) (MetaScreenCastStreamSrc *src);
--  void (* record_frame) (MetaScreenCastStreamSrc *src,
--                         uint8_t                 *data);
-+  gboolean (* record_frame) (MetaScreenCastStreamSrc *src,
-+                             uint8_t                 *data);
-   gboolean (* get_videocrop) (MetaScreenCastStreamSrc *src,
-                               MetaRectangle           *crop_rect);
-+  void (* set_cursor_metadata) (MetaScreenCastStreamSrc *src,
-+                                struct spa_meta_cursor  *spa_meta_cursor);
- };
- 
- void meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src);
- 
- MetaScreenCastStream * meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src);
- 
-+MetaSpaType * meta_screen_cast_stream_src_get_spa_type (MetaScreenCastStreamSrc *src);
-+
- #endif /* META_SCREEN_CAST_STREAM_SRC_H */
-diff --git a/src/backends/meta-screen-cast-stream.c b/src/backends/meta-screen-cast-stream.c
-index 875ada01a..c14f8fd85 100644
---- a/src/backends/meta-screen-cast-stream.c
-+++ b/src/backends/meta-screen-cast-stream.c
-@@ -34,6 +34,7 @@ enum
- 
-   PROP_SESSION,
-   PROP_CONNECTION,
-+  PROP_CURSOR_MODE,
- };
- 
- enum
-@@ -52,6 +53,8 @@ typedef struct _MetaScreenCastStreamPrivate
-   GDBusConnection *connection;
-   char *object_path;
- 
-+  MetaScreenCastCursorMode cursor_mode;
-+
-   MetaScreenCastStreamSrc *src;
- } MetaScreenCastStreamPrivate;
- 
-@@ -164,6 +167,15 @@ meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
-                                                                   y);
- }
- 
-+MetaScreenCastCursorMode
-+meta_screen_cast_stream_get_cursor_mode (MetaScreenCastStream *stream)
-+{
-+  MetaScreenCastStreamPrivate *priv =
-+    meta_screen_cast_stream_get_instance_private (stream);
-+
-+  return priv->cursor_mode;
-+}
-+
- static void
- meta_screen_cast_stream_set_property (GObject      *object,
-                                       guint         prop_id,
-@@ -182,6 +194,9 @@ meta_screen_cast_stream_set_property (GObject      *object,
-     case PROP_CONNECTION:
-       priv->connection = g_value_get_object (value);
-       break;
-+    case PROP_CURSOR_MODE:
-+      priv->cursor_mode = g_value_get_uint (value);
-+      break;
-     default:
-       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-     }
-@@ -205,6 +220,9 @@ meta_screen_cast_stream_get_property (GObject    *object,
-     case PROP_CONNECTION:
-       g_value_set_object (value, priv->connection);
-       break;
-+    case PROP_CURSOR_MODE:
-+      g_value_set_uint (value, priv->cursor_mode);
-+      break;
-     default:
-       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-     }
-@@ -296,6 +314,18 @@ meta_screen_cast_stream_class_init (MetaScreenCastStreamClass *klass)
-                                                         G_PARAM_CONSTRUCT_ONLY |
-                                                         G_PARAM_STATIC_STRINGS));
- 
-+  g_object_class_install_property (object_class,
-+                                   PROP_CURSOR_MODE,
-+                                   g_param_spec_uint ("cursor-mode",
-+                                                      "cursor-mode",
-+                                                      "Cursor mode",
-+                                                      META_SCREEN_CAST_CURSOR_MODE_HIDDEN,
-+                                                      META_SCREEN_CAST_CURSOR_MODE_METADATA,
-+                                                      META_SCREEN_CAST_CURSOR_MODE_HIDDEN,
-+                                                      G_PARAM_READWRITE |
-+                                                      G_PARAM_CONSTRUCT_ONLY |
-+                                                      G_PARAM_STATIC_STRINGS));
-+
-   signals[CLOSED] = g_signal_new ("closed",
-                                   G_TYPE_FROM_CLASS (klass),
-                                   G_SIGNAL_RUN_LAST,
-diff --git a/src/backends/meta-screen-cast-stream.h b/src/backends/meta-screen-cast-stream.h
-index dcc280da6..28ca6f683 100644
---- a/src/backends/meta-screen-cast-stream.h
-+++ b/src/backends/meta-screen-cast-stream.h
-@@ -67,4 +67,6 @@ void meta_screen_cast_stream_transform_position (MetaScreenCastStream *stream,
-                                                  double               *x,
-                                                  double               *y);
- 
-+MetaScreenCastCursorMode meta_screen_cast_stream_get_cursor_mode (MetaScreenCastStream *stream);
-+
- #endif /* META_SCREEN_CAST_STREAM_H */
-diff --git a/src/backends/meta-screen-cast-window-stream-src.c b/src/backends/meta-screen-cast-window-stream-src.c
-index c3f9cf5ca..32df9f127 100644
---- a/src/backends/meta-screen-cast-window-stream-src.c
-+++ b/src/backends/meta-screen-cast-window-stream-src.c
-@@ -207,7 +207,7 @@ meta_screen_cast_window_stream_src_disable (MetaScreenCastStreamSrc *src)
-   meta_screen_cast_window_stream_src_stop (window_src);
- }
- 
--static void
-+static gboolean
- meta_screen_cast_window_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-                                                  uint8_t                 *data)
- {
-@@ -215,6 +215,8 @@ meta_screen_cast_window_stream_src_record_frame (MetaScreenCastStreamSrc *src,
-     META_SCREEN_CAST_WINDOW_STREAM_SRC (src);
- 
-   capture_into (window_src, data);
-+
-+  return TRUE;
- }
- 
- MetaScreenCastWindowStreamSrc *
-diff --git a/src/backends/meta-screen-cast.h b/src/backends/meta-screen-cast.h
-index 7e32b67b7..cadb6a2fe 100644
---- a/src/backends/meta-screen-cast.h
-+++ b/src/backends/meta-screen-cast.h
-@@ -29,6 +29,13 @@
- #include "backends/meta-dbus-session-watcher.h"
- #include "meta-dbus-screen-cast.h"
- 
-+typedef enum _MetaScreenCastCursorMode
-+{
-+  META_SCREEN_CAST_CURSOR_MODE_HIDDEN = 0,
-+  META_SCREEN_CAST_CURSOR_MODE_EMBEDDED = 1,
-+  META_SCREEN_CAST_CURSOR_MODE_METADATA = 2,
-+} MetaScreenCastCursorMode;
-+
- #define META_TYPE_SCREEN_CAST (meta_screen_cast_get_type ())
- G_DECLARE_FINAL_TYPE (MetaScreenCast, meta_screen_cast,
-                       META, SCREEN_CAST,
-diff --git a/src/org.gnome.Mutter.ScreenCast.xml b/src/org.gnome.Mutter.ScreenCast.xml
-index 3cd02b6cb..953809727 100644
---- a/src/org.gnome.Mutter.ScreenCast.xml
-+++ b/src/org.gnome.Mutter.ScreenCast.xml
-@@ -71,7 +71,15 @@
- 
- 	Record a single monitor.
- 
--	Available @properties include: (none)
-+	Available @properties include:
-+
-+	* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
-+
-+	Available cursor mode values:
-+
-+	0: hidden - cursor is not included in the stream
-+	1: embedded - cursor is included in the framebuffer
-+	2: metadata - cursor is included as metadata in the PipeWire stream
-     -->
-     <method name="RecordMonitor">
-       <arg name="connector" type="s" direction="in" />
-@@ -84,7 +92,7 @@
- 	@properties: Properties used determining what window to select
- 	@stream_path: Path to the new stream object
- 
--	Record a single window.
-+	Record a single window. The cursor will not be included.
- 
- 	Available @properties include:
- 
--- 
-2.20.1
-
-
-From 93c2b18337a8babe340775cd979ad540f0838ab3 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 3 Jan 2019 16:40:42 +0100
-Subject: [PATCH 11/12] cursor-tracker: Emit `cursor-changed` after renderer
- was updated
-
-Otherwise the cursor retrieved via meta_cursor_renderer_get_cursor() is
-out of date.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-cursor-tracker.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
-index 060b6af3b..97e7f8cb4 100644
---- a/src/backends/meta-cursor-tracker.c
-+++ b/src/backends/meta-cursor-tracker.c
-@@ -118,11 +118,15 @@ change_cursor_renderer (MetaCursorTracker *tracker)
- static void
- sync_cursor (MetaCursorTracker *tracker)
- {
--  if (update_displayed_cursor (tracker))
--    g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
-+  gboolean cursor_changed = FALSE;
-+
-+  cursor_changed = update_displayed_cursor (tracker);
- 
-   if (update_effective_cursor (tracker))
-     change_cursor_renderer (tracker);
-+
-+  if (cursor_changed)
-+    g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
- }
- 
- static void
--- 
-2.20.1
-
-
-From 392205b1d0728ac1636df90144c0fe091bd45624 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 3 Jan 2019 16:51:08 +0100
-Subject: [PATCH 12/12] screen-cast-monitor-stream-src: Only send cursor bitmap
- when it changes
-
-To avoid unnecessary pixel copying, only send the cursor bitmap when it
-changes. This also allows the receiver to know when the cursor bitmap
-actually changed.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
----
- src/backends/meta-screen-cast-monitor-stream-src.c | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
-diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
-index 6be477989..1d6aea242 100644
---- a/src/backends/meta-screen-cast-monitor-stream-src.c
-+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
-@@ -40,6 +40,8 @@ struct _MetaScreenCastMonitorStreamSrc
- {
-   MetaScreenCastStreamSrc parent;
- 
-+  gboolean cursor_bitmap_invalid;
-+
-   gulong actors_painted_handler_id;
-   gulong paint_handler_id;
-   gulong cursor_moved_handler_id;
-@@ -194,6 +196,7 @@ static void
- cursor_changed (MetaCursorTracker              *cursor_tracker,
-                 MetaScreenCastMonitorStreamSrc *monitor_src)
- {
-+  monitor_src->cursor_bitmap_invalid = TRUE;
-   sync_cursor_state (monitor_src);
- }
- 
-@@ -452,6 +455,16 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
-   spa_meta_cursor->id = 1;
-   spa_meta_cursor->position.x = (int32_t) roundf (cursor_position.x);
-   spa_meta_cursor->position.y = (int32_t) roundf (cursor_position.y);
-+
-+  if (!monitor_src->cursor_bitmap_invalid)
-+    {
-+      spa_meta_cursor->hotspot.x = 0;
-+      spa_meta_cursor->hotspot.y = 0;
-+      spa_meta_cursor->bitmap_offset = 0;
-+      return;
-+    }
-+  monitor_src->cursor_bitmap_invalid = FALSE;
-+
-   spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
- 
-   spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
-@@ -551,6 +564,7 @@ meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream  *monitor_s
- static void
- meta_screen_cast_monitor_stream_src_init (MetaScreenCastMonitorStreamSrc *monitor_src)
- {
-+  monitor_src->cursor_bitmap_invalid = TRUE;
- }
- 
- static void
--- 
-2.20.1
-
diff --git a/SOURCES/shaped-texture-get-image-via-offscreen.patch b/SOURCES/shaped-texture-get-image-via-offscreen.patch
deleted file mode 100644
index fb94954..0000000
--- a/SOURCES/shaped-texture-get-image-via-offscreen.patch
+++ /dev/null
@@ -1,1094 +0,0 @@
-From 7bbe68b149d387ce65aaf35542a67bcc93a80d70 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 19 Dec 2018 10:08:05 +0100
-Subject: [PATCH 01/10] cogl/texture-2d-gl: Try to determine format for
- external textures
-
-Don't just set the internal format to the dummy format "any", as that causes
-code intended to be unreachable code to be reached. It's not possible to
-actually know the internal format of an external texture, however, so it might
-not actually correspond to the real format.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- cogl/cogl/driver/gl/cogl-texture-2d-gl.c | 7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-index d1eff4507..53be13216 100644
---- a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-+++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-@@ -470,7 +470,12 @@ allocate_custom_egl_image_external (CoglTexture2D *tex_2d,
- {
-   CoglTexture *tex = COGL_TEXTURE (tex_2d);
-   CoglContext *ctx = tex->context;
--  CoglPixelFormat internal_format = loader->src.egl_image_external.format;
-+  CoglPixelFormat external_format;
-+  CoglPixelFormat internal_format;
-+
-+  external_format = loader->src.egl_image_external.format;
-+  internal_format = _cogl_texture_determine_internal_format (tex,
-+                                                             external_format);
- 
-   _cogl_gl_util_clear_gl_errors (ctx);
- 
--- 
-2.19.2
-
-
-From 320add39ea8e1d035f139167561ddb5ae7757d36 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 19 Dec 2018 10:12:49 +0100
-Subject: [PATCH 02/10] cogl/texture-2d-gl: Bind correct target when getting
- data
-
-While for normal textures, GL_TEXTURE_2D should be used, when it's an external
-texture, binding it using GL_TEXTURE_2D results in an error.
-
-Reading the specification for GL_TEXTURE_EXTERNAL_OES it is unclear whether
-getting pixel data from a texture is possible, and tests show it doesn't result
-in any data, but in case it would eventually start working, at least bind the
-correct target for now.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- cogl/cogl/driver/gl/cogl-texture-2d-gl.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-index 53be13216..2cf6fed51 100644
---- a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-+++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-@@ -859,12 +859,12 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
-                                                     width,
-                                                     bpp);
- 
--  _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
-+  _cogl_bind_gl_texture_transient (tex_2d->gl_target,
-                                    tex_2d->gl_texture,
-                                    tex_2d->is_foreign);
- 
-   ctx->texture_driver->gl_get_tex_image (ctx,
--                                         GL_TEXTURE_2D,
-+                                         tex_2d->gl_target,
-                                          gl_format,
-                                          gl_type,
-                                          data);
--- 
-2.19.2
-
-
-From f890ffe0f8970b640085d4cf767dc64bed1479a4 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 19 Dec 2018 11:46:45 +0100
-Subject: [PATCH 03/10] cogl/texture: Add API to check whether _get_data() will
- work
-
-Currently, GL_TEXTURE_EXTERNAL_OES textures doesn't support getting pixel data.
-Make it possible for texture users to know this.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- cogl/cogl/cogl-atlas-texture.c                   |  3 ++-
- cogl/cogl/cogl-driver.h                          |  3 +++
- cogl/cogl/cogl-sub-texture.c                     | 11 ++++++++++-
- cogl/cogl/cogl-texture-2d-sliced.c               |  3 ++-
- cogl/cogl/cogl-texture-2d.c                      | 12 +++++++++++-
- cogl/cogl/cogl-texture-3d.c                      |  3 ++-
- cogl/cogl/cogl-texture-private.h                 |  2 ++
- cogl/cogl/cogl-texture-rectangle.c               |  3 ++-
- cogl/cogl/cogl-texture.c                         |  9 +++++++++
- cogl/cogl/cogl-texture.h                         |  6 ++++++
- cogl/cogl/driver/gl/cogl-texture-2d-gl-private.h |  3 +++
- cogl/cogl/driver/gl/cogl-texture-2d-gl.c         |  9 +++++++++
- cogl/cogl/driver/gl/gl/cogl-driver-gl.c          |  1 +
- cogl/cogl/driver/gl/gles/cogl-driver-gles.c      |  1 +
- cogl/cogl/driver/nop/cogl-driver-nop.c           |  1 +
- cogl/cogl/winsys/cogl-texture-pixmap-x11.c       |  3 ++-
- 16 files changed, 66 insertions(+), 7 deletions(-)
-
-diff --git a/cogl/cogl/cogl-atlas-texture.c b/cogl/cogl/cogl-atlas-texture.c
-index 97bb84a6a..1a1f99b11 100644
---- a/cogl/cogl/cogl-atlas-texture.c
-+++ b/cogl/cogl/cogl-atlas-texture.c
-@@ -1043,5 +1043,6 @@ cogl_atlas_texture_vtable =
-     _cogl_atlas_texture_get_gl_format,
-     _cogl_atlas_texture_get_type,
-     NULL, /* is_foreign */
--    NULL /* set_auto_mipmap */
-+    NULL, /* set_auto_mipmap */
-+    NULL  /* is_get_data_supported */
-   };
-diff --git a/cogl/cogl/cogl-driver.h b/cogl/cogl/cogl-driver.h
-index 85aa0d870..33a7598a9 100644
---- a/cogl/cogl/cogl-driver.h
-+++ b/cogl/cogl/cogl-driver.h
-@@ -210,6 +210,9 @@ struct _CoglDriverVtable
-                            int rowstride,
-                            uint8_t *data);
- 
-+  CoglBool
-+  (* texture_2d_is_get_data_supported) (CoglTexture2D *tex_2d);
-+
-   /* Prepares for drawing by flushing the journal, framebuffer state,
-    * pipeline state and attribute state.
-    */
-diff --git a/cogl/cogl/cogl-sub-texture.c b/cogl/cogl/cogl-sub-texture.c
-index 9d7abea90..c3b436140 100644
---- a/cogl/cogl/cogl-sub-texture.c
-+++ b/cogl/cogl/cogl-sub-texture.c
-@@ -454,6 +454,14 @@ _cogl_sub_texture_get_type (CoglTexture *tex)
-   return _cogl_texture_get_type (sub_tex->full_texture);
- }
- 
-+static CoglBool
-+_cogl_sub_texture_is_get_data_supported (CoglTexture *tex)
-+{
-+  CoglSubTexture *sub_tex = COGL_SUB_TEXTURE (tex);
-+
-+  return cogl_texture_is_get_data_supported (sub_tex->full_texture);
-+}
-+
- static const CoglTextureVtable
- cogl_sub_texture_vtable =
-   {
-@@ -476,5 +484,6 @@ cogl_sub_texture_vtable =
-     _cogl_sub_texture_get_gl_format,
-     _cogl_sub_texture_get_type,
-     NULL, /* is_foreign */
--    NULL /* set_auto_mipmap */
-+    NULL, /* set_auto_mipmap */
-+    _cogl_sub_texture_is_get_data_supported
-   };
-diff --git a/cogl/cogl/cogl-texture-2d-sliced.c b/cogl/cogl/cogl-texture-2d-sliced.c
-index 4f586cde7..458b29ce5 100644
---- a/cogl/cogl/cogl-texture-2d-sliced.c
-+++ b/cogl/cogl/cogl-texture-2d-sliced.c
-@@ -1542,5 +1542,6 @@ cogl_texture_2d_sliced_vtable =
-     _cogl_texture_2d_sliced_get_gl_format,
-     _cogl_texture_2d_sliced_get_type,
-     _cogl_texture_2d_sliced_is_foreign,
--    NULL /* set_auto_mipmap */
-+    NULL, /* set_auto_mipmap */
-+    NULL  /* is_get_data_supported */
-   };
-diff --git a/cogl/cogl/cogl-texture-2d.c b/cogl/cogl/cogl-texture-2d.c
-index 663125890..0e4a73de0 100644
---- a/cogl/cogl/cogl-texture-2d.c
-+++ b/cogl/cogl/cogl-texture-2d.c
-@@ -94,6 +94,15 @@ _cogl_texture_2d_set_auto_mipmap (CoglTexture *tex,
-   tex_2d->auto_mipmap = value;
- }
- 
-+static CoglBool
-+_cogl_texture_2d_is_get_data_supported (CoglTexture *tex)
-+{
-+  CoglTexture2D *tex_2d = COGL_TEXTURE_2D (tex);
-+  CoglContext *ctx = tex->context;
-+
-+  return ctx->driver_vtable->texture_2d_is_get_data_supported (tex_2d);
-+}
-+
- CoglTexture2D *
- _cogl_texture_2d_create_base (CoglContext *ctx,
-                               int width,
-@@ -693,5 +702,6 @@ cogl_texture_2d_vtable =
-     _cogl_texture_2d_get_gl_format,
-     _cogl_texture_2d_get_type,
-     _cogl_texture_2d_is_foreign,
--    _cogl_texture_2d_set_auto_mipmap
-+    _cogl_texture_2d_set_auto_mipmap,
-+    _cogl_texture_2d_is_get_data_supported
-   };
-diff --git a/cogl/cogl/cogl-texture-3d.c b/cogl/cogl/cogl-texture-3d.c
-index 5644119d7..00b3447ec 100644
---- a/cogl/cogl/cogl-texture-3d.c
-+++ b/cogl/cogl/cogl-texture-3d.c
-@@ -755,5 +755,6 @@ cogl_texture_3d_vtable =
-     _cogl_texture_3d_get_gl_format,
-     _cogl_texture_3d_get_type,
-     NULL, /* is_foreign */
--    _cogl_texture_3d_set_auto_mipmap
-+    _cogl_texture_3d_set_auto_mipmap,
-+    NULL  /* is_get_data_supported */
-   };
-diff --git a/cogl/cogl/cogl-texture-private.h b/cogl/cogl/cogl-texture-private.h
-index 742983e2d..44100f0b7 100644
---- a/cogl/cogl/cogl-texture-private.h
-+++ b/cogl/cogl/cogl-texture-private.h
-@@ -149,6 +149,8 @@ struct _CoglTextureVtable
-   /* Only needs to be implemented if is_primitive == TRUE */
-   void (* set_auto_mipmap) (CoglTexture *texture,
-                             CoglBool value);
-+
-+  CoglBool (* is_get_data_supported) (CoglTexture *texture);
- };
- 
- typedef enum _CoglTextureSoureType {
-diff --git a/cogl/cogl/cogl-texture-rectangle.c b/cogl/cogl/cogl-texture-rectangle.c
-index cc2e642d3..0179324a4 100644
---- a/cogl/cogl/cogl-texture-rectangle.c
-+++ b/cogl/cogl/cogl-texture-rectangle.c
-@@ -773,5 +773,6 @@ cogl_texture_rectangle_vtable =
-     _cogl_texture_rectangle_get_gl_format,
-     _cogl_texture_rectangle_get_type,
-     _cogl_texture_rectangle_is_foreign,
--    _cogl_texture_rectangle_set_auto_mipmap
-+    _cogl_texture_rectangle_set_auto_mipmap,
-+    NULL  /* is_get_data_supported */
-   };
-diff --git a/cogl/cogl/cogl-texture.c b/cogl/cogl/cogl-texture.c
-index e2d37e225..eef2abdbe 100644
---- a/cogl/cogl/cogl-texture.c
-+++ b/cogl/cogl/cogl-texture.c
-@@ -205,6 +205,15 @@ _cogl_texture_is_foreign (CoglTexture *texture)
-     return FALSE;
- }
- 
-+CoglBool
-+cogl_texture_is_get_data_supported (CoglTexture *texture)
-+{
-+  if (texture->vtable->is_get_data_supported)
-+    return texture->vtable->is_get_data_supported (texture);
-+  else
-+    return TRUE;
-+}
-+
- unsigned int
- cogl_texture_get_width (CoglTexture *texture)
- {
-diff --git a/cogl/cogl/cogl-texture.h b/cogl/cogl/cogl-texture.h
-index ef7d14281..67647aa9c 100644
---- a/cogl/cogl/cogl-texture.h
-+++ b/cogl/cogl/cogl-texture.h
-@@ -511,6 +511,12 @@ CoglBool
- cogl_texture_allocate (CoglTexture *texture,
-                        CoglError **error);
- 
-+/**
-+ * cogl_texture_is_get_data_supported: (skip)
-+ */
-+CoglBool
-+cogl_texture_is_get_data_supported (CoglTexture *texture);
-+
- COGL_END_DECLS
- 
- #endif /* __COGL_TEXTURE_H__ */
-diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl-private.h b/cogl/cogl/driver/gl/cogl-texture-2d-gl-private.h
-index e5c658534..1379e9a93 100644
---- a/cogl/cogl/driver/gl/cogl-texture-2d-gl-private.h
-+++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl-private.h
-@@ -116,4 +116,7 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
-                               int rowstride,
-                               uint8_t *data);
- 
-+CoglBool
-+_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d);
-+
- #endif /* _COGL_TEXTURE_2D_GL_PRIVATE_H_ */
-diff --git a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-index 2cf6fed51..f04e3ebca 100644
---- a/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-+++ b/cogl/cogl/driver/gl/cogl-texture-2d-gl.c
-@@ -869,3 +869,12 @@ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
-                                          gl_type,
-                                          data);
- }
-+
-+CoglBool
-+_cogl_texture_2d_gl_is_get_data_supported (CoglTexture2D *tex_2d)
-+{
-+  if (tex_2d->gl_target == GL_TEXTURE_EXTERNAL_OES)
-+    return FALSE;
-+  else
-+    return TRUE;
-+}
-diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
-index 178262ac0..9247e4e78 100644
---- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
-+++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
-@@ -714,6 +714,7 @@ _cogl_driver_gl =
-     _cogl_texture_2d_gl_generate_mipmap,
-     _cogl_texture_2d_gl_copy_from_bitmap,
-     _cogl_texture_2d_gl_get_data,
-+    _cogl_texture_2d_gl_is_get_data_supported,
-     _cogl_gl_flush_attributes_state,
-     _cogl_clip_stack_gl_flush,
-     _cogl_buffer_gl_create,
-diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
-index 521f6ef3d..14f9b282c 100644
---- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
-+++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
-@@ -493,6 +493,7 @@ _cogl_driver_gles =
-     _cogl_texture_2d_gl_generate_mipmap,
-     _cogl_texture_2d_gl_copy_from_bitmap,
-     NULL, /* texture_2d_get_data */
-+    NULL, /* texture_2d_is_get_data_supported */
-     _cogl_gl_flush_attributes_state,
-     _cogl_clip_stack_gl_flush,
-     _cogl_buffer_gl_create,
-diff --git a/cogl/cogl/driver/nop/cogl-driver-nop.c b/cogl/cogl/driver/nop/cogl-driver-nop.c
-index 6e04e7164..8424c64ef 100644
---- a/cogl/cogl/driver/nop/cogl-driver-nop.c
-+++ b/cogl/cogl/driver/nop/cogl-driver-nop.c
-@@ -82,6 +82,7 @@ _cogl_driver_nop =
-     _cogl_texture_2d_nop_generate_mipmap,
-     _cogl_texture_2d_nop_copy_from_bitmap,
-     NULL, /* texture_2d_get_data */
-+    NULL, /* texture_2d_is_get_data_supported */
-     _cogl_nop_flush_attributes_state,
-     _cogl_clip_stack_nop_flush,
-   };
-diff --git a/cogl/cogl/winsys/cogl-texture-pixmap-x11.c b/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
-index d03040c24..3bb057f4a 100644
---- a/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
-+++ b/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
-@@ -1180,5 +1180,6 @@ cogl_texture_pixmap_x11_vtable =
-     _cogl_texture_pixmap_x11_get_gl_format,
-     _cogl_texture_pixmap_x11_get_type,
-     NULL, /* is_foreign */
--    NULL /* set_auto_mipmap */
-+    NULL, /* set_auto_mipmap */
-+    NULL  /* is_get_data_supported */
-   };
--- 
-2.19.2
-
-
-From 363816fab233b965ff8b9e3a55bdb80b9cee4515 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 19 Dec 2018 11:55:43 +0100
-Subject: [PATCH 04/10] compositor: Make meta_actor_painting_untransformed take
- a framebuffer
-
-Stop using the cogl draw framebuffer implicitly.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/clutter-utils.c         | 9 +++++----
- src/compositor/clutter-utils.h         | 9 +++++----
- src/compositor/meta-background-actor.c | 7 ++++++-
- src/compositor/meta-shaped-texture.c   | 7 +++++--
- src/compositor/meta-window-group.c     | 6 +++++-
- 5 files changed, 26 insertions(+), 12 deletions(-)
-
-diff --git a/src/compositor/clutter-utils.c b/src/compositor/clutter-utils.c
-index fb74732ce..6591ee2d3 100644
---- a/src/compositor/clutter-utils.c
-+++ b/src/compositor/clutter-utils.c
-@@ -143,7 +143,8 @@ meta_actor_is_untransformed (ClutterActor *actor,
-  * transform.
-  */
- gboolean
--meta_actor_painting_untransformed (int              paint_width,
-+meta_actor_painting_untransformed (CoglFramebuffer *fb,
-+                                   int              paint_width,
-                                    int              paint_height,
-                                    int             *x_origin,
-                                    int             *y_origin)
-@@ -153,8 +154,8 @@ meta_actor_painting_untransformed (int              paint_width,
-   float viewport[4];
-   int i;
- 
--  cogl_get_modelview_matrix (&modelview);
--  cogl_get_projection_matrix (&projection);
-+  cogl_framebuffer_get_modelview_matrix (fb, &modelview);
-+  cogl_framebuffer_get_projection_matrix (fb, &projection);
- 
-   cogl_matrix_multiply (&modelview_projection,
-                         &projection,
-@@ -173,7 +174,7 @@ meta_actor_painting_untransformed (int              paint_width,
-   vertices[3].y = paint_height;
-   vertices[3].z = 0;
- 
--  cogl_get_viewport (viewport);
-+  cogl_framebuffer_get_viewport4fv (fb, viewport);
- 
-   for (i = 0; i < 4; i++)
-     {
-diff --git a/src/compositor/clutter-utils.h b/src/compositor/clutter-utils.h
-index 36a5925cf..b96733e4a 100644
---- a/src/compositor/clutter-utils.h
-+++ b/src/compositor/clutter-utils.h
-@@ -31,9 +31,10 @@ gboolean meta_actor_is_untransformed (ClutterActor *actor,
-                                       int          *x_origin,
-                                       int          *y_origin);
- 
--gboolean meta_actor_painting_untransformed (int         paint_width,
--                                            int         paint_height,
--                                            int        *x_origin,
--                                            int        *y_origin);
-+gboolean meta_actor_painting_untransformed (CoglFramebuffer *fb,
-+                                            int              paint_width,
-+                                            int              paint_height,
-+                                            int             *x_origin,
-+                                            int             *y_origin);
- 
- #endif /* __META_CLUTTER_UTILS_H__ */
-diff --git a/src/compositor/meta-background-actor.c b/src/compositor/meta-background-actor.c
-index 197a62c0f..c4c0f9561 100644
---- a/src/compositor/meta-background-actor.c
-+++ b/src/compositor/meta-background-actor.c
-@@ -325,6 +325,7 @@ setup_pipeline (MetaBackgroundActor   *self,
-   PipelineFlags pipeline_flags = 0;
-   guint8 opacity;
-   float color_component;
-+  CoglFramebuffer *fb;
-   CoglPipelineFilter filter;
- 
-   opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self));
-@@ -417,8 +418,12 @@ setup_pipeline (MetaBackgroundActor   *self,
-                              color_component,
-                              opacity / 255.);
- 
-+  fb = cogl_get_draw_framebuffer ();
-   if (!priv->force_bilinear &&
--      meta_actor_painting_untransformed (actor_pixel_rect->width, actor_pixel_rect->height, NULL, NULL))
-+      meta_actor_painting_untransformed (fb,
-+                                         actor_pixel_rect->width,
-+                                         actor_pixel_rect->height,
-+                                         NULL, NULL))
-     filter = COGL_PIPELINE_FILTER_NEAREST;
-   else
-     filter = COGL_PIPELINE_FILTER_LINEAR;
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 98346c6ae..133041ba9 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -422,17 +422,20 @@ meta_shaped_texture_paint (ClutterActor *actor)
- 
-   cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
- 
-+  fb = cogl_get_draw_framebuffer ();
-+
-   /* Use nearest-pixel interpolation if the texture is unscaled. This
-    * improves performance, especially with software rendering.
-    */
- 
-   filter = COGL_PIPELINE_FILTER_LINEAR;
- 
--  if (meta_actor_painting_untransformed (tex_width, tex_height, NULL, NULL))
-+  if (meta_actor_painting_untransformed (fb,
-+                                         tex_width, tex_height,
-+                                         NULL, NULL))
-     filter = COGL_PIPELINE_FILTER_NEAREST;
- 
-   ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
--  fb = cogl_get_draw_framebuffer ();
- 
-   opacity = clutter_actor_get_paint_opacity (actor);
-   clutter_actor_get_allocation_box (actor, &alloc);
-diff --git a/src/compositor/meta-window-group.c b/src/compositor/meta-window-group.c
-index 665adee77..d41c00783 100644
---- a/src/compositor/meta-window-group.c
-+++ b/src/compositor/meta-window-group.c
-@@ -81,7 +81,11 @@ meta_window_group_paint (ClutterActor *actor)
-    */
-   if (clutter_actor_is_in_clone_paint (actor))
-     {
--      if (!meta_actor_painting_untransformed (screen_width,
-+      CoglFramebuffer *fb;
-+
-+      fb = cogl_get_draw_framebuffer ();
-+      if (!meta_actor_painting_untransformed (fb,
-+                                              screen_width,
-                                               screen_height,
-                                               &paint_x_origin,
-                                               &paint_y_origin) ||
--- 
-2.19.2
-
-
-From ff3110a1a547e0a5523cc5ef33f52b1d706c072e Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Wed, 19 Dec 2018 12:52:58 +0100
-Subject: [PATCH 05/10] shaped-texture: Put actual texture painting in helper
-
-This is so that it can be reused later by meta_shaped_texture_get_image() for
-drawing via an offscreen framebuffer.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/meta-shaped-texture.c | 89 ++++++++++++++++------------
- 1 file changed, 52 insertions(+), 37 deletions(-)
-
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 133041ba9..68098a536 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -373,47 +373,18 @@ set_cogl_texture (MetaShapedTexture *stex,
- }
- 
- static void
--meta_shaped_texture_paint (ClutterActor *actor)
-+do_paint (MetaShapedTexture *stex,
-+          CoglFramebuffer   *fb,
-+          CoglTexture       *paint_tex,
-+          cairo_region_t    *clip_region)
- {
--  MetaShapedTexture *stex = (MetaShapedTexture *) actor;
-   MetaShapedTexturePrivate *priv = stex->priv;
-   guint tex_width, tex_height;
-   guchar opacity;
-   CoglContext *ctx;
--  CoglFramebuffer *fb;
--  CoglTexture *paint_tex;
-   ClutterActorBox alloc;
-   CoglPipelineFilter filter;
- 
--  if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
--    return;
--
--  if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex)))
--    clutter_actor_realize (CLUTTER_ACTOR (stex));
--
--  /* The GL EXT_texture_from_pixmap extension does allow for it to be
--   * used together with SGIS_generate_mipmap, however this is very
--   * rarely supported. Also, even when it is supported there
--   * are distinct performance implications from:
--   *
--   *  - Updating mipmaps that we don't need
--   *  - Having to reallocate pixmaps on the server into larger buffers
--   *
--   * So, we just unconditionally use our mipmap emulation code. If we
--   * wanted to use SGIS_generate_mipmap, we'd have to  query COGL to
--   * see if it was supported (no API currently), and then if and only
--   * if that was the case, set the clutter texture quality to HIGH.
--   * Setting the texture quality to high without SGIS_generate_mipmap
--   * support for TFP textures will result in fallbacks to XGetImage.
--   */
--  if (priv->create_mipmaps)
--    paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
--  else
--    paint_tex = COGL_TEXTURE (priv->texture);
--
--  if (paint_tex == NULL)
--    return;
--
-   tex_width = priv->tex_width;
-   tex_height = priv->tex_height;
- 
-@@ -422,8 +393,6 @@ meta_shaped_texture_paint (ClutterActor *actor)
- 
-   cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
- 
--  fb = cogl_get_draw_framebuffer ();
--
-   /* Use nearest-pixel interpolation if the texture is unscaled. This
-    * improves performance, especially with software rendering.
-    */
-@@ -437,8 +406,8 @@ meta_shaped_texture_paint (ClutterActor *actor)
- 
-   ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
- 
--  opacity = clutter_actor_get_paint_opacity (actor);
--  clutter_actor_get_allocation_box (actor, &alloc);
-+  opacity = clutter_actor_get_paint_opacity (CLUTTER_ACTOR (stex));
-+  clutter_actor_get_allocation_box (CLUTTER_ACTOR (stex), &alloc);
- 
-   cairo_region_t *blended_region;
-   gboolean use_opaque_region = (priv->opaque_region != NULL && opacity == 255);
-@@ -576,6 +545,52 @@ meta_shaped_texture_paint (ClutterActor *actor)
-     cairo_region_destroy (blended_region);
- }
- 
-+static void
-+meta_shaped_texture_paint (ClutterActor *actor)
-+{
-+  MetaShapedTexture *stex = META_SHAPED_TEXTURE (actor);
-+  MetaShapedTexturePrivate *priv = stex->priv;
-+  CoglTexture *paint_tex = NULL;
-+  CoglFramebuffer *fb;
-+
-+  if (!priv->texture)
-+    return;
-+
-+  if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
-+    return;
-+
-+  if (!CLUTTER_ACTOR_IS_REALIZED (CLUTTER_ACTOR (stex)))
-+    clutter_actor_realize (CLUTTER_ACTOR (stex));
-+
-+  /* The GL EXT_texture_from_pixmap extension does allow for it to be
-+   * used together with SGIS_generate_mipmap, however this is very
-+   * rarely supported. Also, even when it is supported there
-+   * are distinct performance implications from:
-+   *
-+   *  - Updating mipmaps that we don't need
-+   *  - Having to reallocate pixmaps on the server into larger buffers
-+   *
-+   * So, we just unconditionally use our mipmap emulation code. If we
-+   * wanted to use SGIS_generate_mipmap, we'd have to  query COGL to
-+   * see if it was supported (no API currently), and then if and only
-+   * if that was the case, set the clutter texture quality to HIGH.
-+   * Setting the texture quality to high without SGIS_generate_mipmap
-+   * support for TFP textures will result in fallbacks to XGetImage.
-+   */
-+  if (priv->create_mipmaps)
-+    paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
-+
-+  if (!paint_tex)
-+    paint_tex = COGL_TEXTURE (priv->texture);
-+
-+  if (cogl_texture_get_width (paint_tex) == 0 ||
-+      cogl_texture_get_height (paint_tex) == 0)
-+    return;
-+
-+  fb = cogl_get_draw_framebuffer ();
-+  do_paint (META_SHAPED_TEXTURE (actor), fb, paint_tex, priv->clip_region);
-+}
-+
- static void
- meta_shaped_texture_get_preferred_width (ClutterActor *self,
-                                          gfloat        for_height,
--- 
-2.19.2
-
-
-From f594c31d3f9fad5cafced8dc3e8cacb459f87bb0 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 20 Dec 2018 16:58:03 +0100
-Subject: [PATCH 06/10] boxes: Add helper to scale rectangles by a double
-
-And change the similar region scaling helper to use this one.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/core/boxes-private.h | 10 ++++++++++
- src/core/boxes.c         | 22 ++++++++++++++++++++++
- 2 files changed, 32 insertions(+)
-
-diff --git a/src/core/boxes-private.h b/src/core/boxes-private.h
-index bf019b4d6..793f39527 100644
---- a/src/core/boxes-private.h
-+++ b/src/core/boxes-private.h
-@@ -38,6 +38,12 @@ typedef enum
-   FIXED_DIRECTION_Y    = 1 << 1,
- } FixedDirections;
- 
-+typedef enum _MetaRoundingStrategy
-+{
-+  META_ROUNDING_STRATEGY_SHRINK,
-+  META_ROUNDING_STRATEGY_GROW,
-+} MetaRoundingStrategy;
-+
- /* Output functions -- note that the output buffer had better be big enough:
-  *   rect_to_string:   RECT_LENGTH
-  *   region_to_string: (RECT_LENGTH+strlen(separator_string)) *
-@@ -218,6 +224,10 @@ GList* meta_rectangle_find_nonintersected_monitor_edges (
- gboolean meta_rectangle_is_adjecent_to (MetaRectangle *rect,
-                                         MetaRectangle *other);
- 
-+void meta_rectangle_scale_double (MetaRectangle        *rect,
-+                                  double                scale,
-+                                  MetaRoundingStrategy  rounding_strategy);
-+
- static inline ClutterRect
- meta_rectangle_to_clutter_rect (MetaRectangle *rect)
- {
-diff --git a/src/core/boxes.c b/src/core/boxes.c
-index 35e9ac3cd..0854ecf94 100644
---- a/src/core/boxes.c
-+++ b/src/core/boxes.c
-@@ -2036,3 +2036,25 @@ meta_rectangle_is_adjecent_to (MetaRectangle *rect,
-   else
-     return FALSE;
- }
-+
-+void
-+meta_rectangle_scale_double (MetaRectangle        *rect,
-+                             double                scale,
-+                             MetaRoundingStrategy  rounding_strategy)
-+{
-+  switch (rounding_strategy)
-+    {
-+    case META_ROUNDING_STRATEGY_SHRINK:
-+      rect->x = (int) ceil (rect->x * scale);
-+      rect->y = (int) ceil (rect->y * scale);
-+      rect->width = (int) floor (rect->width * scale);
-+      rect->height = (int) floor (rect->height * scale);
-+      break;
-+    case META_ROUNDING_STRATEGY_GROW:
-+      rect->x = (int) floor (rect->x * scale);
-+      rect->y = (int) floor (rect->y * scale);
-+      rect->width = (int) ceil (rect->width * scale);
-+      rect->height = (int) ceil (rect->height * scale);
-+      break;
-+    }
-+}
--- 
-2.19.2
-
-
-From 7826c0fdc45a62c6ca563d2f1526b81975243dbb Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 20 Dec 2018 17:21:26 +0100
-Subject: [PATCH 07/10] shaped-texture: Stop using gdk rect helper
-
-We have our own version, just use that.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/meta-shaped-texture.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 68098a536..6cde86390 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -940,9 +940,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
- 
-   if (clip != NULL)
-     {
--      /* GdkRectangle is just a typedef of cairo_rectangle_int_t,
--       * so we can use the gdk_rectangle_* APIs on these. */
--      if (!gdk_rectangle_intersect (&texture_rect, clip, clip))
-+      if (!meta_rectangle_intersect (&texture_rect, clip, clip))
-         return NULL;
-     }
- 
--- 
-2.19.2
-
-
-From a8cecf4997d28e6672bc51afea9682504225c997 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 20 Dec 2018 17:22:37 +0100
-Subject: [PATCH 08/10] shaped-texture: Add priv pointer to _get_image()
-
-The MetaShapedTexturePrivate is accessed more than once, so keep a
-pointer to it.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/meta-shaped-texture.c | 5 +++--
- 1 file changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 6cde86390..0fa5fa92f 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -924,13 +924,14 @@ cairo_surface_t *
- meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-                                cairo_rectangle_int_t *clip)
- {
-+  MetaShapedTexturePrivate *priv = stex->priv;
-   CoglTexture *texture, *mask_texture;
-   cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
-   cairo_surface_t *surface;
- 
-   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
- 
--  texture = COGL_TEXTURE (stex->priv->texture);
-+  texture = COGL_TEXTURE (priv->texture);
- 
-   if (texture == NULL)
-     return NULL;
-@@ -964,7 +965,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-   if (clip != NULL)
-     cogl_object_unref (texture);
- 
--  mask_texture = stex->priv->mask_texture;
-+  mask_texture = priv->mask_texture;
-   if (mask_texture != NULL)
-     {
-       cairo_t *cr;
--- 
-2.19.2
-
-
-From a2fb231955a41a9e87ffcdf845fa4dbca0d31dc4 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 20 Dec 2018 17:32:27 +0100
-Subject: [PATCH 09/10] shaped-texture: Don't change the callers clip rect
-
-We intersected the callers clip rect. That is probably not a good idea,
-and easily avoided, so lets avoid it.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/meta-shaped-texture.c | 36 +++++++++++++++-------------
- 1 file changed, 20 insertions(+), 16 deletions(-)
-
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 0fa5fa92f..823bd47f2 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -925,6 +925,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-                                cairo_rectangle_int_t *clip)
- {
-   MetaShapedTexturePrivate *priv = stex->priv;
-+  cairo_rectangle_int_t *transformed_clip = NULL;
-   CoglTexture *texture, *mask_texture;
-   cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
-   cairo_surface_t *surface;
-@@ -936,21 +937,23 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-   if (texture == NULL)
-     return NULL;
- 
--  texture_rect.width = cogl_texture_get_width (texture);
--  texture_rect.height = cogl_texture_get_height (texture);
- 
-   if (clip != NULL)
-     {
--      if (!meta_rectangle_intersect (&texture_rect, clip, clip))
-+      transformed_clip = alloca (sizeof (cairo_rectangle_int_t));
-+      *transformed_clip = *clip;
-+
-+      if (!meta_rectangle_intersect (&texture_rect, transformed_clip,
-+                                     transformed_clip))
-         return NULL;
-     }
- 
--  if (clip != NULL)
-+  if (transformed_clip)
-     texture = cogl_texture_new_from_sub_texture (texture,
--                                                 clip->x,
--                                                 clip->y,
--                                                 clip->width,
--                                                 clip->height);
-+                                                 transformed_clip->x,
-+                                                 transformed_clip->y,
-+                                                 transformed_clip->width,
-+                                                 transformed_clip->height);
- 
-   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-                                         cogl_texture_get_width (texture),
-@@ -962,7 +965,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
- 
-   cairo_surface_mark_dirty (surface);
- 
--  if (clip != NULL)
-+  if (transformed_clip)
-     cogl_object_unref (texture);
- 
-   mask_texture = priv->mask_texture;
-@@ -971,12 +974,13 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-       cairo_t *cr;
-       cairo_surface_t *mask_surface;
- 
--      if (clip != NULL)
--        mask_texture = cogl_texture_new_from_sub_texture (mask_texture,
--                                                          clip->x,
--                                                          clip->y,
--                                                          clip->width,
--                                                          clip->height);
-+      if (transformed_clip)
-+        mask_texture =
-+          cogl_texture_new_from_sub_texture (mask_texture,
-+                                             transformed_clip->x,
-+                                             transformed_clip->y,
-+                                             transformed_clip->width,
-+                                             transformed_clip->height);
- 
-       mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
-                                                  cogl_texture_get_width (mask_texture),
-@@ -996,7 +1000,7 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
- 
-       cairo_surface_destroy (mask_surface);
- 
--      if (clip != NULL)
-+      if (transformed_clip)
-         cogl_object_unref (mask_texture);
-     }
- 
--- 
-2.19.2
-
-
-From 0adfd8966c2de7bfb3223911d194119f1ab46828 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
-Date: Thu, 20 Dec 2018 17:34:18 +0100
-Subject: [PATCH 10/10] shaped-texture: Draw external textures via offscreen
-
-EGLStream textures are imported as GL_TEXTURE_EXTERNAL_OES and reading
-pixels directly from them is not supported. To make it possible to get
-pixels, create an offscreen framebuffer and paint the actor to it, then
-read pixels from the framebuffer instead of the texture directly.
-
-https://gitlab.gnome.org/GNOME/mutter/merge_requests/362
----
- src/compositor/meta-shaped-texture.c | 136 ++++++++++++++++++++++++++-
- 1 file changed, 134 insertions(+), 2 deletions(-)
-
-diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
-index 823bd47f2..d8c250fc9 100644
---- a/src/compositor/meta-shaped-texture.c
-+++ b/src/compositor/meta-shaped-texture.c
-@@ -35,6 +35,7 @@
- 
- #include "clutter-utils.h"
- #include "meta-texture-tower.h"
-+#include "core/boxes-private.h"
- 
- #include "meta-cullable.h"
- 
-@@ -906,6 +907,121 @@ meta_shaped_texture_get_opaque_region (MetaShapedTexture *stex)
-   return priv->opaque_region;
- }
- 
-+static gboolean
-+should_get_via_offscreen (MetaShapedTexture *stex)
-+{
-+  MetaShapedTexturePrivate *priv = stex->priv;
-+
-+  if (!cogl_texture_is_get_data_supported (priv->texture))
-+    return TRUE;
-+
-+  return FALSE;
-+}
-+
-+static cairo_surface_t *
-+get_image_via_offscreen (MetaShapedTexture     *stex,
-+                         cairo_rectangle_int_t *clip)
-+{
-+  MetaShapedTexturePrivate *priv = stex->priv;
-+  ClutterBackend *clutter_backend = clutter_get_default_backend ();
-+  CoglContext *cogl_context =
-+    clutter_backend_get_cogl_context (clutter_backend);
-+  CoglTexture *image_texture;
-+  GError *error = NULL;
-+  CoglOffscreen *offscreen;
-+  CoglFramebuffer *fb;
-+  CoglMatrix projection_matrix;
-+  unsigned int fb_width, fb_height;
-+  cairo_rectangle_int_t fallback_clip;
-+  CoglColor clear_color;
-+  cairo_surface_t *surface;
-+
-+  if (cogl_has_feature (cogl_context, COGL_FEATURE_ID_TEXTURE_NPOT))
-+    {
-+      fb_width = priv->tex_width;
-+      fb_height = priv->tex_height;
-+    }
-+  else
-+    {
-+      fb_width = clutter_util_next_p2 (priv->tex_width);
-+      fb_height = clutter_util_next_p2 (priv->tex_height);
-+    }
-+
-+  if (!clip)
-+    {
-+      fallback_clip = (cairo_rectangle_int_t) {
-+        .width = priv->tex_width,
-+        .height = priv->tex_height,
-+      };
-+      clip = &fallback_clip;
-+    }
-+
-+  image_texture =
-+    COGL_TEXTURE (cogl_texture_2d_new_with_size (cogl_context,
-+                                                 fb_width, fb_height));
-+  cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (image_texture),
-+                                          FALSE);
-+  if (!cogl_texture_allocate (COGL_TEXTURE (image_texture), &error))
-+    {
-+      g_error_free (error);
-+      cogl_object_unref (image_texture);
-+      return FALSE;
-+    }
-+
-+  if (fb_width != priv->tex_width || fb_height != priv->tex_height)
-+    {
-+      CoglSubTexture *sub_texture;
-+
-+      sub_texture = cogl_sub_texture_new (cogl_context,
-+                                          image_texture,
-+                                          0, 0,
-+                                          priv->tex_width, priv->tex_height);
-+      cogl_object_unref (image_texture);
-+      image_texture = COGL_TEXTURE (sub_texture);
-+    }
-+
-+  offscreen = cogl_offscreen_new_with_texture (COGL_TEXTURE (image_texture));
-+  fb = COGL_FRAMEBUFFER (offscreen);
-+  cogl_object_unref (image_texture);
-+  if (!cogl_framebuffer_allocate (fb, &error))
-+    {
-+      g_error_free (error);
-+      cogl_object_unref (fb);
-+      return FALSE;
-+    }
-+
-+  cogl_framebuffer_push_matrix (fb);
-+  cogl_matrix_init_identity (&projection_matrix);
-+  cogl_matrix_scale (&projection_matrix,
-+                     1.0 / (priv->tex_width / 2.0),
-+                     -1.0 / (priv->tex_height / 2.0), 0);
-+  cogl_matrix_translate (&projection_matrix,
-+                         -(priv->tex_width / 2.0),
-+                         -(priv->tex_height / 2.0), 0);
-+
-+  cogl_framebuffer_set_projection_matrix (fb, &projection_matrix);
-+
-+  cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
-+  cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
-+
-+  do_paint (stex, fb, priv->texture, NULL);
-+
-+  cogl_framebuffer_pop_matrix (fb);
-+
-+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-+                                        clip->width, clip->height);
-+  cogl_framebuffer_read_pixels (fb,
-+                                clip->x, clip->y,
-+                                clip->width, clip->height,
-+                                CLUTTER_CAIRO_FORMAT_ARGB32,
-+                                cairo_image_surface_get_data (surface));
-+  cogl_object_unref (fb);
-+
-+  cairo_surface_mark_dirty (surface);
-+
-+  return surface;
-+}
-+
- /**
-  * meta_shaped_texture_get_image:
-  * @stex: A #MetaShapedTexture
-@@ -927,7 +1043,6 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-   MetaShapedTexturePrivate *priv = stex->priv;
-   cairo_rectangle_int_t *transformed_clip = NULL;
-   CoglTexture *texture, *mask_texture;
--  cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
-   cairo_surface_t *surface;
- 
-   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
-@@ -937,17 +1052,34 @@ meta_shaped_texture_get_image (MetaShapedTexture     *stex,
-   if (texture == NULL)
-     return NULL;
- 
-+  if (priv->tex_width == 0 || priv->tex_height == 0)
-+    return NULL;
- 
-   if (clip != NULL)
-     {
-+      double tex_scale;
-+      cairo_rectangle_int_t tex_rect;
-+
-       transformed_clip = alloca (sizeof (cairo_rectangle_int_t));
-       *transformed_clip = *clip;
- 
--      if (!meta_rectangle_intersect (&texture_rect, transformed_clip,
-+      clutter_actor_get_scale (CLUTTER_ACTOR (stex), &tex_scale, NULL);
-+      meta_rectangle_scale_double (transformed_clip, 1.0 / tex_scale,
-+                                   META_ROUNDING_STRATEGY_GROW);
-+
-+      tex_rect = (cairo_rectangle_int_t) {
-+        .width = priv->tex_width,
-+        .height = priv->tex_height,
-+      };
-+
-+      if (!meta_rectangle_intersect (&tex_rect, transformed_clip,
-                                      transformed_clip))
-         return NULL;
-     }
- 
-+  if (should_get_via_offscreen (stex))
-+    return get_image_via_offscreen (stex, transformed_clip);
-+
-   if (transformed_clip)
-     texture = cogl_texture_new_from_sub_texture (texture,
-                                                  transformed_clip->x,
--- 
-2.19.2
-
diff --git a/SOURCES/startup-notification.patch b/SOURCES/startup-notification.patch
deleted file mode 100644
index 1a4dd0b..0000000
--- a/SOURCES/startup-notification.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 4ed430b4ef3013c96fa56cdc57b925b42d20ead9 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
-Date: Thu, 20 Oct 2016 18:00:04 +0200
-Subject: [PATCH] gtk-shell: Work around non-working startup notifications
-
-GNOME Shell relies on the MetaScreen::startup-sequence-changed signal,
-which is tied to (lib)startup-notification and therefore X11. As a result,
-when we remove the startup sequence of a wayland client, GNOME Shell will
-not be notified about this until startup-notification's timeout is hit.
-As a temporary stop-gap, go through XWayland even for wayland clients,
-so that the signal is emitted when expected.
-
-https://bugzilla.gnome.org/show_bug.cgi?id=768531
----
- src/wayland/meta-wayland-gtk-shell.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c
-index d6e249f..9d1a19e 100644
---- a/src/wayland/meta-wayland-gtk-shell.c
-+++ b/src/wayland/meta-wayland-gtk-shell.c
-@@ -219,11 +219,21 @@ gtk_shell_set_startup_id (struct wl_client   *client,
-                           struct wl_resource *resource,
-                           const char         *startup_id)
- {
-+#if 0
-   MetaDisplay *display;
- 
-   display = meta_get_display ();
-   meta_startup_notification_remove_sequence (display->startup_notification,
-                                              startup_id);
-+#else
-+  /* HACK: MetaScreen::startup-sequence-changed is currently tied to
-+           (lib)startup-notification, which means it only works on X11;
-+           so for now, always go through XWayland, even for wayland clients */
-+  gdk_x11_display_broadcast_startup_message (gdk_display_get_default (),
-+                                             "remove",
-+                                             "ID", startup_id,
-+                                             NULL);
-+#endif
- }
- 
- static void
--- 
-2.9.3
diff --git a/SPECS/mutter.spec b/SPECS/mutter.spec
index f5c4062..b24e8e4 100644
--- a/SPECS/mutter.spec
+++ b/SPECS/mutter.spec
@@ -4,160 +4,29 @@
 %global json_glib_version 0.12.0
 %global libinput_version 1.4
 %global pipewire_version 0.2.2
+%global mutter_api_version 4
 
 Name:          mutter
-Version:       3.28.3
-Release:       19%{?dist}
+Version:       3.32.2
+Release:       10%{?dist}
 Summary:       Window and compositing manager based on Clutter
 
 License:       GPLv2+
 #VCS:          git:git://git.gnome.org/mutter
 URL:           http://www.gnome.org
-Source0:       http://download.gnome.org/sources/%{name}/3.28/%{name}-%{version}.tar.xz
+Source0:       http://download.gnome.org/sources/%{name}/3.32/%{name}-%{version}.tar.xz
 
-Patch0:        startup-notification.patch
-
-# Upload HW cursor on demand, avoiding stuttering on hybrid GPU laptops
-Patch1:        hw-cursor-on-demand-gnome-3-28.patch
-
-# Check hw support for calculated view transform
-Patch2:        0001-renderer-native-Check-calculated-transform-when-crea.patch
-
-# PipeWire 0.2.2+ support
-Patch3:        mutter-search-for-libpipewire-0_2.patch
-Patch4:        mutter-pipewire-0_2-API.patch
-
-# Backport remote desktop related fixes and features
-# From master/gnome-3-29
-Patch5:        0001-virtual-input-evdev-Translate-from-button-codes-inte.patch
-Patch6:        0001-Make-screen-cast-and-remote-desktop-non-experimental.patch
-Patch7:        0001-Add-remote-access-controller-API.patch
+# Work-around for OpenJDK's compliance test
+Patch0:        0001-window-actor-Special-case-shaped-Java-windows.patch
 
 # Allow Xwayland grabs by default, on a selected set of X11 apps
 # https://bugzilla.redhat.com/1500399
-Patch8: 0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch
-
-# From gnome-3-28
-#
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/189
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/192
-# Downstream bug: https://bugzilla.redhat.com/1635123
-Patch10: 0001-window-wayland-Always-update-monitor-for-non-user-op.patch
-Patch11: 0001-window-Pass-flag-to-meta_window_update_monitor-inste.patch
-Patch12: 0002-window-Force-update-monitor-on-hot-plugs.patch
-Patch13: 0001-window-wayland-Don-t-recursive-indefinitely-when-upd.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/194
-# Downstream bug: https://bugzilla.redhat.com/1635106
-Patch14: 0001-wayland-Nullify-monitor-resources-when-updating-outp.patch
-Patch15: 0001-wayland-No-xdg-output-events-without-a-logical-monit.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/255
-# Downstream bug: https://bugzilla.redhat.com/1635106
-Patch16: 0001-wayland-Clean-up-xwayland-grabs-even-if-surface-is-g.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/70
-# Downstream bug: https://bugzilla.redhat.com/1635155
-Patch17: 0001-native-gpu-Handle-drmModeSetCrtc-failing-gracefully.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/15
-# Downstream bug: https://bugzilla.redhat.com/1635159
-Patch18: 0001-window-Don-t-refuse-to-move-focus-to-the-grab-window.patch
-Patch19: 0002-window-Explicitly-exclude-unmanaging-window-from-foc.patch
-Patch20: 0003-tests-Add-closed-transient-test.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/130
-# Downstream bug: https://bugzilla.redhat.com/1635164
-Patch21: 0001-monitor-Use-current-monitor-mode-to-check-whether-ac.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/223
-# Downstream bug: https://bugzilla.redhat.com/1635167
-Patch22: 0001-gpu-kms-Don-t-crash-if-drmModeGetResources-returns-N.patch
-Patch23: 0001-gpu-kms-Handle-drmModeGetResources-failing.patch
-Patch24: 0002-monitor-manager-kms-Check-if-GPUs-can-have-outputs.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/127
-# Downstream bug: https://bugzilla.redhat.com/1635170
-Patch25: 0001-renderer-native-Fallback-to-non-planar-API-if-gbm_bo.patch
-
-# Upstream issue: https://bugzilla.gnome.org/show_bug.cgi?id=784206
-# Downstream bug: https://bugzilla.redhat.com/1635235
-Patch26: 0001-wayland-keyboard-Create-a-separate-keymap-shm-file-p.patch
-
-# Upstream issue: https://bugzilla.gnome.org/show_bug.cgi?id=788834
-# Downstream bug: https://bugzilla.redhat.com/1635237
-Patch27: 0001-window-Return-1-if-meta_window_get_monitor-is-called.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/254
-# Downstream bug: https://bugzilla.redhat.com/1635241
-Patch28: 0001-backends-x11-Only-free-cursor-if-it-was-created-succ.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/134
-# Downstream bug: https://bugzilla.redhat.com/1635248
-Patch29: 0001-idle-monitor-Don-t-try-to-auto-start-SessionManager.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/240
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/174
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/221
-# Downstream bug: https://bugzilla.redhat.com/1635718
-Patch30: 0001-window-unmanage-dialog-when-clearing-transient_for.patch
-Patch31: 0001-wayland-xdg-shell-Queue-frame-callbacks-on-new-actor.patch
-Patch32: 0002-wayland-surface-Add-API-to-cache-frame-callbacks.patch
-Patch33: 0003-wayland-xdg-shell-Cache-pending-frame-callbacks-on-p.patch
-Patch34: 0004-wayland-xdg-shell-Cache-frame-callbacks-if-toplevel-.patch
-Patch35: 0005-wayland-xdg-shell-Handle-requests-after-toplevel-was.patch
-Patch36: 0006-wayland-legacy-xdg-shell-Cache-frame-callbacks-if-to.patch
-Patch37: 0007-wayland-legacy-xdg-shell-Handle-requests-after-tople.patch
-Patch38: 0008-wayland-gtk-shell-Handle-requests-after-toplevel-was.patch
-
-# Fix garbled window titles (rhbz#1639194)
-Patch39: 0001-x11-window-props-Do-not-convert-WM_NAME.patch
-Patch40: 0002-xprops-Make-sure-text_property_to_utf8-returns-UTF8.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/2
-# Upstream issue: https://bugzilla.gnome.org/show_bug.cgi?id=782575
-Patch41: 0001-renderer-native-Choose-first-EGL-config-for-non-GBM-.patch
-Patch42: 0001-wayland-buffer-Create-EGLStream-texture-at-buffer_re.patch
-Patch43: 0001-wayland-Always-realize-buffers-at-surface-commit-tim.patch
-Patch44: 0001-wayland-Realize-dmabuf-buffers-before-trying-to-atta.patch
-Patch45: 0001-wayland-Create-EGLStream-backed-buffers-through-wl_e.patch
-
-# Upstream issue: https://bugzilla.gnome.org/show_bug.cgi?id=790316
-Patch46: 0001-renderer-native-Also-wrap-flip-closures-for-EGLStrea.patch
-
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/106
-# Downstream bug: https://bugzilla.redhat.com/show_bug.cgi?id=1591250
-Patch51: 0001-renderer-native-Use-shadow-fb-on-software-GL-if-pref.patch
-
-# RecordWindow
-Patch61: 0001-clutter-evdev-Use-clutter_event_set_device.patch
-Patch62: 0002-clutter-Keep-a-device-reference-with-events.patch
-Patch63: 0003-remote-desktop-Do-not-leak-the-virtual-touchscreen.patch
-Patch64: 0004-screen-cast-src-Add-VideoCrop-support.patch
-Patch65: 0005-screen-cast-Add-screen-cast-window-interface.patch
-Patch66: 0006-window-actor-Implement-MetaScreenCastWindow-interfac.patch
-Patch67: 0007-screen-cast-session-Add-screen-cast-window-mode.patch
-Patch68: 0008-screen-cast-session-Add-support-for-RecordWindow.patch
-Patch69: 0009-window-Add-window-id.patch
-Patch70: 0010-screen-cast-session-Add-window-id-support.patch
-Patch71: 0011-window-Expose-the-client-type-in-the-API.patch
-Patch72: 0012-window-Fix-introspection-warnings.patch
-
-# Get texture pixels via offscreen for EGLStreams (rhbz#1656926)
-Patch80: shaped-texture-get-image-via-offscreen.patch
-
-# Avoid EGLStream backend deadlock (rhbz#1656905)
-Patch81: eglstream-mailbox-mode.patch
-
-# Screen cast cursor side channel (rhbz#1658971)
-Patch82: screen-cast-cursor-side-channel.patch
-
-# Regression due to a change in meta_shaped_texture_get_image() not
-# updating the callers' clipping rectangle anymore.
-Patch83: 0001-window-actor-Use-actual-image-size-for-capture.patch
-
-# Fix for HiDPI screen recording (rhbz#1670287)
-Patch84: 0001-screen-cast-Fix-monitor-recording-on-HiDPI.patch
+Patch1: 0001-wayland-Allow-Xwayland-grabs-on-selected-apps.patch
+
+Patch2: fix-text-selection-drawing.patch
+Patch3: covscan-fixes.patch
+Patch4: 0001-enum-types-Use-basename-in-header-comment.patch
+Patch5: 0001-workspace-manager-Expose-layout-properties.patch
 
 # Fix corruption on suspend and resume with nvidia (rhbz#1663440)
 Patch10001: 0001-cogl-add-new-UNSTABLE_TEXTURES-feature.patch
@@ -170,10 +39,6 @@ Patch10007: 0007-backends-native-update-cursor-on-resume.patch
 Patch10008: 0008-background-purge-all-background-textures-on-suspend.patch
 Patch10009: 0009-MetaShapedTexture-save-and-restore-textures-on-suspe.patch
 
-# Restore "Always update monitor for non user op" previously dropped
-# Upstream issue: https://gitlab.gnome.org/GNOME/mutter/issues/189
-Patch10010: 0001-window-Really-force-update-monitor-on-hot-plugs.patch
-
 # RHEL 7 downstream patches
 Patch100: deal-more-gracefully-with-oversized-windows.patch
 # Work-around for Xvnc resizing (rhbz#1265511)
@@ -182,21 +47,25 @@ Patch102: 0001-monitor-manager-xrandr-Force-an-update-when-resuming.patch
 Patch103: 0001-monitor-manager-Consider-external-layout-before-defa.patch
 Patch104: 0001-events-Don-t-move-sloppy-focus-while-buttons-are-pre.patch
 Patch105: 0001-backends-x11-Support-synaptics-configuration.patch
-Patch106: 0001-window-actor-Special-case-shaped-Java-windows.patch
 Patch107: 0001-clutter-Extend-touchpad-device-property-check-for-Sy.patch
-Patch108: 0001-clutter-x11-Implement-keycode-lookup-from-keysyms-on.patch
 # http://bugzilla.gnome.org/show_bug.cgi?id=733277
 Patch109: 0001-Add-support-for-quad-buffer-stereo.patch
 # https://bugzilla.redhat.com/show_bug.cgi?id=1618632
 # https://bugzilla.redhat.com/show_bug.cgi?id=1497303
 Patch110: 0001-monitor-manager-only-reuse-initial-config-if-monitor.patch
-Patch111: 0001-clutter-Do-not-latch-modifiers-on-modifier-keys.patch
 Patch112: add-support-for-plain-old-x-device-configuration.patch
 Patch113: 0001-main-be-more-aggressive-in-assuming-X11-backend.patch
 Patch114: 0001-clutter-Only-reset-scroll-axes-on-slave-devices.patch
-# https://bugzilla.redhat.com/show_bug.cgi?id=1668979
-Patch115: 0001-wayland-Relax-requirements-for-evdev-events-to-have-.patch
-Patch116: 0001-clutter-Add-clutter_input_method_forward_key-method.patch
+
+# Inherit xorg.conf (rhbz#1690506)
+Patch115: inherit-xrandr-metamodes.patch
+
+# Fix test blocker when running on cirrus (rhbz#1735382)
+Patch116: 0001-iconcache-Avoid-xrender-picture-formats-when-creatin.patch
+
+# Don't focus or activate unmanaging windows (rhbz#1741547)
+Patch117: 0001-workspace-Focus-only-ancestors-that-are-focusable.patch
+Patch118: 0002-window-Emit-an-error-and-return-when-trying-to-activ.patch
 
 BuildRequires: chrpath
 BuildRequires: pango-devel
@@ -230,6 +99,7 @@ BuildRequires: pam-devel
 BuildRequires: pipewire-devel >= %{pipewire_version}
 BuildRequires: systemd-devel
 BuildRequires: upower-devel
+BuildRequires: xorg-x11-server-Xorg
 BuildRequires: xkeyboard-config-devel
 BuildRequires: zenity
 BuildRequires: desktop-file-utils
@@ -237,7 +107,8 @@ BuildRequires: desktop-file-utils
 BuildRequires: gtk-doc gnome-common gettext-devel git
 BuildRequires: libcanberra-devel
 BuildRequires: gsettings-desktop-schemas-devel >= %{gsettings_desktop_schemas_version}
-BuildRequires: automake, autoconf, libtool
+BuildRequires: gnome-settings-daemon-devel
+BuildRequires: meson
 BuildRequires: pkgconfig(gudev-1.0)
 BuildRequires: pkgconfig(libdrm)
 BuildRequires: pkgconfig(gbm)
@@ -246,8 +117,8 @@ BuildRequires: pkgconfig(wayland-eglstream)
 
 BuildRequires: json-glib-devel >= %{json_glib_version}
 BuildRequires: libgudev1-devel
-BuildRequires: libwayland-server-devel
 BuildRequires: libinput-devel >= %{libinput_version}
+BuildRequires: xorg-x11-server-Xwayland
 
 Obsoletes: mutter-wayland < 3.13.0
 Obsoletes: mutter-wayland-devel < 3.13.0
@@ -261,7 +132,7 @@ Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_versi
 Requires: gtk3%{?_isa} >= %{gtk3_version}
 Requires: pipewire%{_isa} >= %{pipewire_version}
 Requires: startup-notification
-Requires: dbus-x11
+Requires: dbus
 Requires: zenity
 
 Requires:      json-glib%{?_isa} >= %{json_glib_version}
@@ -299,39 +170,18 @@ the functionality of the installed %{name} package.
 %autosetup -S git
 
 %build
-autoreconf -f -i
-(if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; fi;
- %configure --disable-static --enable-compile-warnings=maximum --enable-remote-desktop --enable-installed-tests --with-libwacom --enable-egl-device)
-
-SHOULD_HAVE_DEFINED="HAVE_SM HAVE_RANDR HAVE_STARTUP_NOTIFICATION"
-
-for I in $SHOULD_HAVE_DEFINED; do
-  if ! grep -q "define $I" config.h; then
-    echo "$I was not defined in config.h"
-    grep "$I" config.h
-    exit 1
-  else
-    echo "$I was defined as it should have been"
-    grep "$I" config.h
-  fi
-done
-
-make %{?_smp_mflags} V=1
+%meson -Degl_device=true -Dwayland_eglstream=true
+%meson_build
 
 %install
-%make_install
-
-#Remove libtool archives.
-rm -rf %{buildroot}/%{_libdir}/*.la
+%meson_install
 
 %find_lang %{name}
 
 # Mutter contains a .desktop file so we just need to validate it
 desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
 
-%post -p /sbin/ldconfig
-
-%postun -p /sbin/ldconfig
+%ldconfig_scriptlets
 
 %files -f %{name}.lang
 %license COPYING
@@ -339,7 +189,7 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
 %{_bindir}/mutter
 %{_datadir}/applications/*.desktop
 %{_libdir}/lib*.so.*
-%{_libdir}/mutter/
+%{_libdir}/mutter-%{mutter_api_version}/
 %{_libexecdir}/mutter-restart-helper
 %{_datadir}/GConf/gsettings/mutter-schemas.convert
 %{_datadir}/glib-2.0/schemas/org.gnome.mutter.gschema.xml
@@ -353,15 +203,51 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
 %{_libdir}/pkgconfig/*
 
 %files tests
-%{_libexecdir}/installed-tests/mutter
-%{_libexecdir}/installed-tests/mutter-clutter
-%{_libexecdir}/installed-tests/mutter-cogl
-%{_datadir}/installed-tests/mutter
-%{_datadir}/installed-tests/mutter-clutter
-%{_datadir}/installed-tests/mutter-cogl
-%{_datadir}/mutter/tests
+%{_libexecdir}/installed-tests/mutter-%{mutter_api_version}
+%{_datadir}/installed-tests/mutter-%{mutter_api_version}
+%{_datadir}/mutter-%{mutter_api_version}/tests
 
 %changelog
+* Fri Aug 16 2019 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-10
+- Don't focus or activate unmanaging windows
+  Resolves: #1741547
+
+* Mon Aug 05 2019 Ray Strode <rstrode@redhat.com> - 3.32.2-9
+- Another 16bpp graphics card crash
+  Related: #1735382
+  Resolves: #1737326
+
+* Fri Aug 02 2019 Ray Strode <rstrode@redhat.com> - 3.32.2-8
+- Fix crash in window icon handling on 16bpp graphics cards
+  Resolves: #1735382
+
+* Tue Jul 23 2019 Ray Strode <rstrode@redhat.com> - 3.32.2-7
+- Fix bug leading to 100% cpu usage on suspend/resume
+  Resolves: #1724551
+
+* Mon Jul 15 2019 Jonas Ådahl <jadahl@redhat.com> - 3.32.2-6
+- Don't ignore current mode when deriving current config
+  Resolves: #1690506
+
+* Thu Jun 20 2019 Carlos Garnacho <cgarnach@redhat.com> - 3.32.2-5
+- Ensure pad XDevices do not get buttons remapped
+  Resolves: #1687949
+
+* Wed Jun 12 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-4
+- Expose workspace layout as properties
+  Related: #1704360
+
+* Thu May 30 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-3
+- Avoid arch-specific bits in header comments
+  Related: #1698884
+* Tue May 28 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-2
+- Fix a couple of issues pointed out by covscan
+  Resolves: #1698884
+
+* Thu May 23 2019 Florian Müllner <fmuellner@redhat.com> - 3.32.2-1
+- Update to 3.32.2
+  Resolves: #1698884
+
 * Tue Apr 02 2019 Carlos Garnacho <cgarnach@redhat.com> - 3.28.3-19
 - Fix synaptics/evdev driver support forward port to not break tablet pads
   Resolves: #1687949