[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#993656: bullseye-pu: package mutter/3.38.6-2~deb11u1



Package: release.debian.org
Severity: normal
Tags: bullseye
User: release.debian.org@packages.debian.org
Usertags: pu
X-Debbugs-Cc: debian-gtk-gnome@lists.debian.org

I updated mutter and gnome-shell along the 3.38.x branch in unstable
while we're waiting for the gnome-shell 40 transition to be ready,
and I think it could make sense to backport them to bullseye and take
the benefit of upstream's stable-branch maintenance.

[ Reason ]
New upstream bugfix release backported from unstable.

[ Impact ]
If not updated, assorted bugs fixed on upstream's 3.38.x stable branch
remain unfixed:

    - xwayland: Check permissions on /tmp/.X11-unix before use
    - Ensure valid window texture size after viewport changes
    - kms: Avoid using common video modes if they exceed the available
      bandwidth
    - Fix damage propagation for rotated transforms with viewport
    - Improve Wayland subsurface reordering

Additionally, this version fixes an intermittent FTBFS caused by a race
condition in the build system, which for whatever reason seems to happen
most often on s390x (presumably its CPU speed : I/O speed ratio is one
where we happen to lose the race more often than on other architectures).

[ Tests ]
autopkgtests pass, routine use of GNOME on a desktop seems fine, and the
version it's based on has been in unstable for a while with no new bug
reports.

[ Risks ]
It's a key package and high-visibility, but upstream's stable branches
tend to be good about sticking to bugfix-only.

"Drop unnecessary -dev dependency on libudev-dev" could conceivably
cause FTBFS in related packages, but I've checked the -dev package and
its only mentions of udev are in documentation, so this seems harmless.

[ Checklist ]
  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in (old)stable
      - I have edited this to exclude the content of the Russian
        translation update
  [x] the issue is verified as fixed in unstable

[ Changes ]
* New upstream release, as described above
* Add patch from upstream 40.1 to fix FTBFS seen on s390x
* Update GLib build-dependency (no practical effect, the new dependency
  is already in bullseye)
* Partial fixes for build-dependencies on non-Linux ports

[ Other info ]
I can revert the build-dependency changes if necessary, but they seem
harmless, and minimal delta from unstable to this bullseye backport seems
good too; so I'd prefer to upload the version that has had more testing
as-is if that's OK.

I have also proposed a gnome-shell update. These have only been tested
together, although they should be separable.
diffstat for mutter-3.38.4 mutter-3.38.6

 NEWS                                                                           |   21 
 debian/changelog                                                               |   41 
 debian/control                                                                 |   13 
 debian/control.in                                                              |   13 
 debian/gbp.conf                                                                |    2 
 debian/patches/meson-add-back-default_driver-option.patch                      |    2 
 debian/patches/monitor-manager-Don-t-include-generated-code-in-header-fi.patch |   67 +
 debian/patches/series                                                          |    1 
 meson.build                                                                    |    4 
 po/ru.po                                                                       |  453 ++++++----
 src/backends/native/meta-output-kms.c                                          |   15 
 src/compositor/meta-shaped-texture-private.h                                   |    2 
 src/compositor/meta-shaped-texture.c                                           |   53 -
 src/compositor/meta-window-actor-wayland.c                                     |   63 -
 src/compositor/region-utils.c                                                  |    4 
 src/wayland/meta-wayland-actor-surface.c                                       |    2 
 src/wayland/meta-wayland-subsurface.c                                          |   16 
 src/wayland/meta-wayland-subsurface.h                                          |    2 
 src/wayland/meta-xwayland.c                                                    |   82 +
 19 files changed, 622 insertions(+), 234 deletions(-)

diff -Nru mutter-3.38.4/debian/changelog mutter-3.38.6/debian/changelog
--- mutter-3.38.4/debian/changelog	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/changelog	2021-09-01 21:25:34.000000000 +0100
@@ -1,3 +1,44 @@
+mutter (3.38.6-2~deb11u1) bullseye; urgency=medium
+
+  * Rebuild for bullseye
+
+ -- Simon McVittie <smcv@debian.org>  Wed, 01 Sep 2021 21:25:34 +0100
+
+mutter (3.38.6-2) unstable; urgency=medium
+
+  * Team upload
+  * d/p/monitor-manager-Don-t-include-generated-code-in-header-fi.patch:
+    Add patch from upstream 40.1 to fix FTBFS seen on s390x.
+    Thanks to Adrian Bunk.
+
+ -- Simon McVittie <smcv@debian.org>  Thu, 26 Aug 2021 16:12:19 +0100
+
+mutter (3.38.6-1) unstable; urgency=medium
+
+  [ Marco Trevisan ]
+  * d/gbp.conf, d/control.in: Update VCS details for debian/unstable branch
+
+  [ Simon McVittie ]
+  * New upstream release
+    - xwayland: Check permissions on /tmp/.X11-unix
+    - Ensure valid window texture size after viewport changes
+    - kms: Improve handling of common video modes that might exceed the
+      possible bandwidth
+    - Fix damage propagation for rotated transforms with viewport
+    - Improve Wayland subsurface reordering
+  * Update GLib build-dependency (no practical effect, the new dependency
+    is already in bullseye)
+
+  [ Laurent Bigonville ]
+  * Fixes for non-Linux ports:
+    - Build-depend on libegl1-mesa-dev on all architectures (not just Linux).
+      It is required for EGL support.
+    - Only build-depend on udev on Linux architectures
+    - Only depend on libwayland on Linux architectures
+    - Drop unnecessary -dev dependency on libudev-dev
+
+ -- Simon McVittie <smcv@debian.org>  Thu, 26 Aug 2021 08:54:46 +0100
+
 mutter (3.38.4-1) unstable; urgency=medium
 
   * Team upload
diff -Nru mutter-3.38.4/debian/control mutter-3.38.6/debian/control
--- mutter-3.38.4/debian/control	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/control	2021-09-01 21:25:34.000000000 +0100
@@ -25,14 +25,14 @@
                libcanberra-gtk3-dev,
                libdrm-dev (>= 2.4.83) [linux-any],
                libegl-dev,
-               libegl1-mesa-dev (>= 17) [linux-any],
+               libegl1-mesa-dev (>= 17),
                libfribidi-dev (>= 1.0.0),
                libgbm-dev (>= 17.3) [linux-any],
                libgdk-pixbuf-2.0-dev | libgdk-pixbuf2.0-dev,
                libgirepository1.0-dev (>= 0.9.12),
                libgl1-mesa-dev (>= 7.1~rc3-1~),
                libgles2-mesa-dev (>= 7.1~rc3-1~) | libgles2-dev,
-               libglib2.0-dev (>= 2.61.1),
+               libglib2.0-dev (>= 2.64.0),
                libgnome-desktop-3-dev (>= 3.36.0),
                libgraphene-1.0-dev (>= 1.9.3),
                libgtk-3-dev (>= 3.19.8),
@@ -69,7 +69,7 @@
                libxt-dev,
                meson (>= 0.51),
                pkg-config (>= 0.22),
-               udev,
+               udev [linux-any],
                wayland-protocols (>= 1.19) [linux-any],
                xauth <!nocheck>,
                xkb-data,
@@ -79,8 +79,8 @@
                zenity
 Rules-Requires-Root: no
 Standards-Version: 4.5.1
-Vcs-Git: https://salsa.debian.org/gnome-team/mutter.git
-Vcs-Browser: https://salsa.debian.org/gnome-team/mutter
+Vcs-Git: https://salsa.debian.org/gnome-team/mutter.git -b debian/unstable
+Vcs-Browser: https://salsa.debian.org/gnome-team/mutter/tree/debian/unstable
 
 Package: mutter
 Architecture: any
@@ -175,8 +175,7 @@
          libjson-glib-dev,
          libmutter-7-0 (= ${binary:Version}),
          libpango1.0-dev,
-         libudev-dev,
-         libwayland-dev,
+         libwayland-dev [linux-any],
          libx11-dev,
          libxcomposite-dev,
          libxdamage-dev,
diff -Nru mutter-3.38.4/debian/control.in mutter-3.38.6/debian/control.in
--- mutter-3.38.4/debian/control.in	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/control.in	2021-09-01 21:25:34.000000000 +0100
@@ -21,14 +21,14 @@
                libcanberra-gtk3-dev,
                libdrm-dev (>= 2.4.83) [linux-any],
                libegl-dev,
-               libegl1-mesa-dev (>= 17) [linux-any],
+               libegl1-mesa-dev (>= 17),
                libfribidi-dev (>= 1.0.0),
                libgbm-dev (>= 17.3) [linux-any],
                libgdk-pixbuf-2.0-dev | libgdk-pixbuf2.0-dev,
                libgirepository1.0-dev (>= 0.9.12),
                libgl1-mesa-dev (>= 7.1~rc3-1~),
                libgles2-mesa-dev (>= 7.1~rc3-1~) | libgles2-dev,
-               libglib2.0-dev (>= 2.61.1),
+               libglib2.0-dev (>= 2.64.0),
                libgnome-desktop-3-dev (>= 3.36.0),
                libgraphene-1.0-dev (>= 1.9.3),
                libgtk-3-dev (>= 3.19.8),
@@ -65,7 +65,7 @@
                libxt-dev,
                meson (>= 0.51),
                pkg-config (>= 0.22),
-               udev,
+               udev [linux-any],
                wayland-protocols (>= 1.19) [linux-any],
                xauth <!nocheck>,
                xkb-data,
@@ -75,8 +75,8 @@
                zenity
 Rules-Requires-Root: no
 Standards-Version: 4.5.1
-Vcs-Git: https://salsa.debian.org/gnome-team/mutter.git
-Vcs-Browser: https://salsa.debian.org/gnome-team/mutter
+Vcs-Git: https://salsa.debian.org/gnome-team/mutter.git -b debian/unstable
+Vcs-Browser: https://salsa.debian.org/gnome-team/mutter/tree/debian/unstable
 
 Package: mutter
 Architecture: any
@@ -171,8 +171,7 @@
          libjson-glib-dev,
          libmutter-7-0 (= ${binary:Version}),
          libpango1.0-dev,
-         libudev-dev,
-         libwayland-dev,
+         libwayland-dev [linux-any],
          libx11-dev,
          libxcomposite-dev,
          libxdamage-dev,
diff -Nru mutter-3.38.4/debian/gbp.conf mutter-3.38.6/debian/gbp.conf
--- mutter-3.38.4/debian/gbp.conf	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/gbp.conf	2021-09-01 21:25:34.000000000 +0100
@@ -1,6 +1,6 @@
 [DEFAULT]
 pristine-tar = True
-debian-branch = debian/master
+debian-branch = debian/bullseye
 upstream-branch = upstream/3.38.x
 upstream-vcs-tag = %(version)s
 
diff -Nru mutter-3.38.4/debian/patches/meson-add-back-default_driver-option.patch mutter-3.38.6/debian/patches/meson-add-back-default_driver-option.patch
--- mutter-3.38.4/debian/patches/meson-add-back-default_driver-option.patch	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/patches/meson-add-back-default_driver-option.patch	2021-09-01 21:25:34.000000000 +0100
@@ -44,7 +44,7 @@
    input: 'cogl-config.h.meson',
    output: 'cogl-config.h',
 diff --git a/meson.build b/meson.build
-index 2604ec9..4d8bdaf 100644
+index 3b328c8..ced0b83 100644
 --- a/meson.build
 +++ b/meson.build
 @@ -224,6 +224,8 @@ if have_wayland_eglstream
diff -Nru mutter-3.38.4/debian/patches/monitor-manager-Don-t-include-generated-code-in-header-fi.patch mutter-3.38.6/debian/patches/monitor-manager-Don-t-include-generated-code-in-header-fi.patch
--- mutter-3.38.4/debian/patches/monitor-manager-Don-t-include-generated-code-in-header-fi.patch	1970-01-01 01:00:00.000000000 +0100
+++ mutter-3.38.6/debian/patches/monitor-manager-Don-t-include-generated-code-in-header-fi.patch	2021-09-01 21:25:34.000000000 +0100
@@ -0,0 +1,67 @@
+From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
+Date: Mon, 12 Apr 2021 11:46:30 +0200
+Subject: monitor-manager: Don't include generated code in header file
+
+Meson doesn't seem to handle depending on generated headers, at least
+when those headers are pulled in indirectly via another header file.
+
+Luckily, we don't actually need to include the generated D-Bus boiler
+plate in meta-monitor-manager-private.h, since the MetaMonitorManager
+type no longer is based on the D-Bus service skeleton.
+
+So, by moving the inclusion of the generated D-Bus header file into
+meta-monitor-manager.c, we should hopefully get rid of the sporadic
+build issues.
+
+Bug: https://gitlab.gnome.org/GNOME/mutter/-/issues/1682
+Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1819>
+Origin: upstream, 40.1, commit:91117bb052ed0d69c8ea4159c1df15c814d90627
+---
+ src/backends/meta-monitor-manager-private.h | 6 +++---
+ src/backends/meta-monitor-manager.c         | 2 ++
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
+index ac3bc94..ddc3a41 100644
+--- a/src/backends/meta-monitor-manager-private.h
++++ b/src/backends/meta-monitor-manager-private.h
+@@ -35,8 +35,6 @@
+ #include "meta/display.h"
+ #include "meta/meta-monitor-manager.h"
+ 
+-#include "meta-dbus-display-config.h"
+-
+ #define META_MONITOR_MANAGER_MIN_SCREEN_WIDTH 640
+ #define META_MONITOR_MANAGER_MIN_SCREEN_HEIGHT 480
+ 
+@@ -98,6 +96,8 @@ struct _MetaOutputAssignment
+ #define META_IS_MONITOR_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_MONITOR_MANAGER))
+ #define META_MONITOR_MANAGER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_MONITOR_MANAGER, MetaMonitorManagerClass))
+ 
++typedef struct _MetaDBusDisplayConfig MetaDBusDisplayConfig;
++
+ G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaMonitorManager, g_object_unref)
+ 
+ struct _MetaMonitorManager
+@@ -184,7 +184,7 @@ struct _MetaMonitorManager
+  */
+ struct _MetaMonitorManagerClass
+ {
+-  MetaDBusDisplayConfigSkeletonClass parent_class;
++  GObjectClass parent_class;
+ 
+   GBytes* (*read_edid) (MetaMonitorManager *,
+                         MetaOutput         *);
+diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
+index 1beb658..548ca80 100644
+--- a/src/backends/meta-monitor-manager.c
++++ b/src/backends/meta-monitor-manager.c
+@@ -60,6 +60,8 @@
+ #include "meta/main.h"
+ #include "meta/meta-x11-errors.h"
+ 
++#include "meta-dbus-display-config.h"
++
+ #define DEFAULT_DISPLAY_CONFIGURATION_TIMEOUT 20
+ 
+ enum
diff -Nru mutter-3.38.4/debian/patches/series mutter-3.38.6/debian/patches/series
--- mutter-3.38.4/debian/patches/series	2021-03-17 09:52:33.000000000 +0000
+++ mutter-3.38.6/debian/patches/series	2021-09-01 21:25:34.000000000 +0100
@@ -1,3 +1,4 @@
+monitor-manager-Don-t-include-generated-code-in-header-fi.patch
 theme-use-gtk_render_icon_suface-to-paint-button-icon.patch
 theme-load-icons-as-Gtk-does-with-fallback-and-RTL-suppor.patch
 meson-add-back-default_driver-option.patch
diff -Nru mutter-3.38.4/meson.build mutter-3.38.6/meson.build
--- mutter-3.38.4/meson.build	2021-03-15 19:33:09.319134500 +0000
+++ mutter-3.38.6/meson.build	2021-08-18 00:29:42.687382700 +0100
@@ -1,5 +1,5 @@
 project('mutter', 'c',
-  version: '3.38.4',
+  version: '3.38.6',
   meson_version: '>= 0.51.0',
   license: 'GPLv2+'
 )
@@ -15,7 +15,7 @@
 
 # generic version requirements
 fribidi_req = '>= 1.0.0'
-glib_req = '>= 2.61.1'
+glib_req = '>= 2.64.0'
 gi_req = '>= 0.9.5'
 graphene_req = '>= 1.9.3'
 gtk3_req = '>= 3.19.8'
diff -Nru mutter-3.38.4/NEWS mutter-3.38.6/NEWS
--- mutter-3.38.4/NEWS	2021-03-15 19:33:09.232137000 +0000
+++ mutter-3.38.6/NEWS	2021-08-18 00:29:42.621382500 +0100
@@ -1,3 +1,24 @@
+3.38.6
+======
+* Misc. bug fixes [James; !1907]
+
+Contributors:
+  James Dominic P. Guana
+
+Translators:
+  Alexey Rubtsov [ru]
+
+3.38.5
+======
+* xwayland: Check permissions on /tmp/.X11-unix [Jonas, Olivier; !1788]
+* Ensure valid window texture size after viewport changes [Robert; !1808]
+* kms: Don't add common modes that exceed the max bandwidth [Robert; !1834]
+* Misc. bug fixes [Jonas, Robert; !1825, !1837]
+
+Contributors:
+  Jonas Ådahl, Olivier Fourdan, Robert Mader
+
+
 3.38.4
 ======
 * Do not ping unmanaging windows [Florian; gnome-shell#2467]
diff -Nru mutter-3.38.4/po/ru.po mutter-3.38.6/po/ru.po
diff -Nru mutter-3.38.4/src/backends/native/meta-output-kms.c mutter-3.38.6/src/backends/native/meta-output-kms.c
--- mutter-3.38.4/src/backends/native/meta-output-kms.c	2021-03-15 19:33:09.390132700 +0000
+++ mutter-3.38.6/src/backends/native/meta-output-kms.c	2021-08-18 00:29:42.743383000 +0100
@@ -147,10 +147,12 @@
   MetaCrtcMode *crtc_mode;
   GPtrArray *array;
   float refresh_rate;
+  float bandwidth;
   unsigned i;
   unsigned max_hdisplay = 0;
   unsigned max_vdisplay = 0;
   float max_refresh_rate = 0.0;
+  float max_bandwidth = 0.0;
 
   for (i = 0; i < output_info->n_modes; i++)
     {
@@ -159,9 +161,11 @@
 
       drm_mode = meta_crtc_mode_kms_get_drm_mode (crtc_mode_kms);
       refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
+      bandwidth = refresh_rate * drm_mode->hdisplay * drm_mode->vdisplay;
       max_hdisplay = MAX (max_hdisplay, drm_mode->hdisplay);
       max_vdisplay = MAX (max_vdisplay, drm_mode->vdisplay);
       max_refresh_rate = MAX (max_refresh_rate, refresh_rate);
+      max_bandwidth = MAX (max_bandwidth, bandwidth);
     }
 
   max_refresh_rate = MAX (max_refresh_rate, 60.0);
@@ -174,9 +178,11 @@
         {
           drm_mode = &meta_default_landscape_drm_mode_infos[i];
           refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
+          bandwidth = refresh_rate * drm_mode->hdisplay * drm_mode->vdisplay;
           if (drm_mode->hdisplay > max_hdisplay ||
               drm_mode->vdisplay > max_vdisplay ||
-              refresh_rate > max_refresh_rate)
+              refresh_rate > max_refresh_rate ||
+              bandwidth > max_bandwidth)
             continue;
 
           crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
@@ -190,9 +196,11 @@
         {
           drm_mode = &meta_default_portrait_drm_mode_infos[i];
           refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
+          bandwidth = refresh_rate * drm_mode->hdisplay * drm_mode->vdisplay;
           if (drm_mode->hdisplay > max_hdisplay ||
               drm_mode->vdisplay > max_vdisplay ||
-              refresh_rate > max_refresh_rate)
+              refresh_rate > max_refresh_rate ||
+              bandwidth > max_bandwidth)
             continue;
 
           crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
@@ -259,9 +267,6 @@
         output_info->preferred_mode = output_info->modes[i];
     }
 
-  /* Presume that if the output supports scaling, then we have
-   * a panel fitter capable of adjusting any mode to suit.
-   */
   if (connector_state->has_scaling)
     add_common_modes (output_info, gpu_kms);
 
diff -Nru mutter-3.38.4/src/compositor/meta-shaped-texture.c mutter-3.38.6/src/compositor/meta-shaped-texture.c
--- mutter-3.38.4/src/compositor/meta-shaped-texture.c	2021-03-15 19:33:09.404132100 +0000
+++ mutter-3.38.6/src/compositor/meta-shaped-texture.c	2021-08-18 00:29:42.753383000 +0100
@@ -220,8 +220,8 @@
     }
 }
 
-static void
-ensure_size_valid (MetaShapedTexture *stex)
+void
+meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex)
 {
   if (stex->size_invalid)
     update_size (stex);
@@ -596,7 +596,7 @@
   int sample_width, sample_height;
   gboolean debug_paint_opaque_region;
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   dst_width = stex->dst_width;
   dst_height = stex->dst_height;
@@ -910,7 +910,7 @@
 {
   MetaShapedTexture *stex = META_SHAPED_TEXTURE (content);
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   if (width)
     *width = stex->dst_width;
@@ -985,6 +985,8 @@
                                  cairo_rectangle_int_t *clip)
 {
   MetaMonitorTransform inverted_transform;
+  int scaled_and_transformed_width;
+  int scaled_and_transformed_height;
 
   if (stex->texture == NULL)
     return FALSE;
@@ -1001,12 +1003,21 @@
                                META_ROUNDING_STRATEGY_SHRINK,
                                clip);
 
+  if (meta_monitor_transform_is_rotated (stex->transform))
+    {
+      scaled_and_transformed_width = stex->tex_height / stex->buffer_scale;
+      scaled_and_transformed_height = stex->tex_width / stex->buffer_scale;
+    }
+  else
+    {
+      scaled_and_transformed_width = stex->tex_width / stex->buffer_scale;
+      scaled_and_transformed_height = stex->tex_height / stex->buffer_scale;
+    }
   inverted_transform = meta_monitor_transform_invert (stex->transform);
-  ensure_size_valid (stex);
   meta_rectangle_transform (clip,
                             inverted_transform,
-                            stex->dst_width,
-                            stex->dst_height,
+                            scaled_and_transformed_width,
+                            scaled_and_transformed_height,
                             clip);
 
   if (stex->has_viewport_src_rect || stex->has_viewport_dst_size)
@@ -1027,8 +1038,8 @@
           viewport = (graphene_rect_t) {
             .origin.x = 0,
             .origin.y = 0,
-            .size.width = stex->tex_width,
-            .size.height = stex->tex_height,
+            .size.width = scaled_and_transformed_width,
+            .size.height = scaled_and_transformed_height,
           };
         }
 
@@ -1039,8 +1050,8 @@
         }
       else
         {
-          dst_width = (float) stex->tex_width;
-          dst_height = (float) stex->tex_height;
+          dst_width = (float) viewport.size.width;
+          dst_height = (float) viewport.size.height;
         }
 
       inverted_viewport = (graphene_rect_t) {
@@ -1215,7 +1226,7 @@
 
   cairo_region_get_extents (stex->opaque_region, &opaque_rect);
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   return meta_rectangle_equal (&opaque_rect,
                                &(MetaRectangle) {
@@ -1260,10 +1271,14 @@
                                            graphene_rect_t   *src_rect)
 {
   if (!stex->has_viewport_src_rect ||
-      stex->viewport_src_rect.origin.x != src_rect->origin.x ||
-      stex->viewport_src_rect.origin.y != src_rect->origin.y ||
-      stex->viewport_src_rect.size.width != src_rect->size.width ||
-      stex->viewport_src_rect.size.height != src_rect->size.height)
+      !G_APPROX_VALUE (stex->viewport_src_rect.origin.x,
+                       src_rect->origin.x, FLT_EPSILON) ||
+      !G_APPROX_VALUE (stex->viewport_src_rect.origin.y,
+                       src_rect->origin.y, FLT_EPSILON) ||
+      !G_APPROX_VALUE (stex->viewport_src_rect.size.width,
+                       src_rect->size.width, FLT_EPSILON) ||
+      !G_APPROX_VALUE (stex->viewport_src_rect.size.height,
+                       src_rect->size.height, FLT_EPSILON))
     {
       stex->has_viewport_src_rect = TRUE;
       stex->viewport_src_rect = *src_rect;
@@ -1477,7 +1492,7 @@
   if (texture == NULL)
     return NULL;
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   if (stex->dst_width == 0 || stex->dst_height == 0)
     return NULL;
@@ -1635,7 +1650,7 @@
 {
   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), 0);
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   return stex->dst_width;
 }
@@ -1651,7 +1666,7 @@
 {
   g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), 0);
 
-  ensure_size_valid (stex);
+  meta_shaped_texture_ensure_size_valid (stex);
 
   return stex->dst_height;
 }
diff -Nru mutter-3.38.4/src/compositor/meta-shaped-texture-private.h mutter-3.38.6/src/compositor/meta-shaped-texture-private.h
--- mutter-3.38.4/src/compositor/meta-shaped-texture-private.h	2021-03-15 19:33:09.404132100 +0000
+++ mutter-3.38.6/src/compositor/meta-shaped-texture-private.h	2021-08-18 00:29:42.753383000 +0100
@@ -71,4 +71,6 @@
 void meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
                                             cairo_region_t    *opaque_region);
 
+void meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex);
+
 #endif
diff -Nru mutter-3.38.4/src/compositor/meta-window-actor-wayland.c mutter-3.38.6/src/compositor/meta-window-actor-wayland.c
--- mutter-3.38.4/src/compositor/meta-window-actor-wayland.c	2021-03-15 19:33:09.406132200 +0000
+++ mutter-3.38.6/src/compositor/meta-window-actor-wayland.c	2021-08-18 00:29:42.754382800 +0100
@@ -32,37 +32,36 @@
 
 G_DEFINE_TYPE (MetaWindowActorWayland, meta_window_actor_wayland, META_TYPE_WINDOW_ACTOR)
 
-static gboolean
-remove_surface_actor_from_children (GNode    *node,
-                                    gpointer  data)
+typedef struct _SurfaceTreeTraverseData
 {
-  MetaWaylandSurface *surface = node->data;
-  MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
-  MetaWindowActor *window_actor = data;
-  ClutterActor *parent;
-
-  parent = clutter_actor_get_parent (CLUTTER_ACTOR (surface_actor));
-  if (!parent)
-    return FALSE;
-
-  g_return_val_if_fail (parent == CLUTTER_ACTOR (window_actor), FALSE);
-
-  clutter_actor_remove_child (CLUTTER_ACTOR (window_actor),
-                              CLUTTER_ACTOR (surface_actor));
-
-  return FALSE;
-}
+  MetaWindowActor *window_actor;
+  int index;
+} SurfaceTreeTraverseData;
 
 static gboolean
-add_surface_actor_to_children (GNode    *node,
-                               gpointer  data)
+set_surface_actor_index (GNode    *node,
+                         gpointer  data)
 {
   MetaWaylandSurface *surface = node->data;
   MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
-  MetaWindowActor *window_actor = data;
+  SurfaceTreeTraverseData *traverse_data = data;
 
-  clutter_actor_add_child (CLUTTER_ACTOR (window_actor),
-                           CLUTTER_ACTOR (surface_actor));
+  if (clutter_actor_contains (CLUTTER_ACTOR (traverse_data->window_actor),
+                              CLUTTER_ACTOR (surface_actor)))
+    {
+      clutter_actor_set_child_at_index (
+        CLUTTER_ACTOR (traverse_data->window_actor),
+        CLUTTER_ACTOR (surface_actor),
+        traverse_data->index);
+    }
+  else
+    {
+      clutter_actor_insert_child_at_index (
+        CLUTTER_ACTOR (traverse_data->window_actor),
+        CLUTTER_ACTOR (surface_actor),
+        traverse_data->index);
+    }
+  traverse_data->index++;
 
   return FALSE;
 }
@@ -75,20 +74,18 @@
   MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (
     META_SURFACE_ACTOR_WAYLAND (surface_actor));
   GNode *root_node = surface->subsurface_branch_node;
+  SurfaceTreeTraverseData traverse_data;
 
+  traverse_data = (SurfaceTreeTraverseData) {
+    .window_actor = actor,
+    .index = 0,
+  };
   g_node_traverse (root_node,
                    G_IN_ORDER,
                    G_TRAVERSE_LEAVES,
                    -1,
-                   remove_surface_actor_from_children,
-                   actor);
-
-  g_node_traverse (root_node,
-                   G_IN_ORDER,
-                   G_TRAVERSE_LEAVES,
-                   -1,
-                   add_surface_actor_to_children,
-                   actor);
+                   set_surface_actor_index,
+                   &traverse_data);
 }
 
 static void
diff -Nru mutter-3.38.4/src/compositor/region-utils.c mutter-3.38.6/src/compositor/region-utils.c
--- mutter-3.38.4/src/compositor/region-utils.c	2021-03-15 19:33:09.407132100 +0000
+++ mutter-3.38.6/src/compositor/region-utils.c	2021-08-18 00:29:42.755382800 +0100
@@ -428,8 +428,8 @@
     {
       viewport_region = cairo_region_copy (region);
 
-      if (G_APPROX_VALUE (src_rect->origin.x, 0, FLT_EPSILON) ||
-          G_APPROX_VALUE (src_rect->origin.y, 0, FLT_EPSILON))
+      if (!G_APPROX_VALUE (src_rect->origin.x, 0, FLT_EPSILON) ||
+          !G_APPROX_VALUE (src_rect->origin.y, 0, FLT_EPSILON))
         {
           cairo_region_translate (viewport_region,
                                   (int) src_rect->origin.x,
diff -Nru mutter-3.38.4/src/wayland/meta-wayland-actor-surface.c mutter-3.38.6/src/wayland/meta-wayland-actor-surface.c
--- mutter-3.38.4/src/wayland/meta-wayland-actor-surface.c	2021-03-15 19:33:09.443131200 +0000
+++ mutter-3.38.6/src/wayland/meta-wayland-actor-surface.c	2021-08-18 00:29:42.783383000 +0100
@@ -271,6 +271,8 @@
       meta_surface_actor_reset_viewport_dst_size (surface_actor);
     }
 
+  meta_shaped_texture_ensure_size_valid (stex);
+
   META_WAYLAND_SURFACE_FOREACH_SUBSURFACE (surface, subsurface_surface)
     {
       MetaWaylandActorSurface *actor_surface;
diff -Nru mutter-3.38.4/src/wayland/meta-wayland-subsurface.c mutter-3.38.6/src/wayland/meta-wayland-subsurface.c
--- mutter-3.38.4/src/wayland/meta-wayland-subsurface.c	2021-03-15 19:33:09.449131000 +0000
+++ mutter-3.38.6/src/wayland/meta-wayland-subsurface.c	2021-08-18 00:29:42.787383000 +0100
@@ -343,11 +343,11 @@
 }
 
 static void
-subsurface_handle_pending_surface_destroyed (struct wl_listener *listener,
-                                             void               *data)
+subsurface_handle_pending_subsurface_destroyed (struct wl_listener *listener,
+                                                void               *data)
 {
   MetaWaylandSubsurfacePlacementOp *op =
-    wl_container_of (listener, op, surface_destroy_listener);
+    wl_container_of (listener, op, subsurface_destroy_listener);
 
   op->surface = NULL;
 }
@@ -366,7 +366,7 @@
 meta_wayland_subsurface_placement_op_free (MetaWaylandSubsurfacePlacementOp *op)
 {
   if (op->surface)
-    wl_list_remove (&op->surface_destroy_listener.link);
+    wl_list_remove (&op->subsurface_destroy_listener.link);
   if (op->sibling)
     wl_list_remove (&op->sibling_destroy_listener.link);
   g_free (op);
@@ -384,12 +384,12 @@
   op->placement = placement;
   op->surface = surface;
   op->sibling = sibling;
-  op->surface_destroy_listener.notify =
-    subsurface_handle_pending_surface_destroyed;
+  op->subsurface_destroy_listener.notify =
+    subsurface_handle_pending_subsurface_destroyed;
   op->sibling_destroy_listener.notify =
     subsurface_handle_pending_sibling_destroyed;
-  wl_resource_add_destroy_listener (surface->resource,
-                                    &op->surface_destroy_listener);
+  wl_resource_add_destroy_listener (surface->wl_subsurface,
+                                    &op->subsurface_destroy_listener);
   wl_resource_add_destroy_listener (sibling->resource,
                                     &op->sibling_destroy_listener);
 
diff -Nru mutter-3.38.4/src/wayland/meta-wayland-subsurface.h mutter-3.38.6/src/wayland/meta-wayland-subsurface.h
--- mutter-3.38.4/src/wayland/meta-wayland-subsurface.h	2021-03-15 19:33:09.449131000 +0000
+++ mutter-3.38.6/src/wayland/meta-wayland-subsurface.h	2021-08-18 00:29:42.787383000 +0100
@@ -40,7 +40,7 @@
   MetaWaylandSubsurfacePlacement placement;
   MetaWaylandSurface *surface;
   MetaWaylandSurface *sibling;
-  struct wl_listener surface_destroy_listener;
+  struct wl_listener subsurface_destroy_listener;
   struct wl_listener sibling_destroy_listener;
 } MetaWaylandSubsurfacePlacementOp;
 
diff -Nru mutter-3.38.4/src/wayland/meta-xwayland.c mutter-3.38.6/src/wayland/meta-xwayland.c
--- mutter-3.38.4/src/wayland/meta-xwayland.c	2021-03-15 19:33:09.454131000 +0000
+++ mutter-3.38.6/src/wayland/meta-xwayland.c	2021-08-18 00:29:42.791383000 +0100
@@ -30,6 +30,7 @@
 #include <glib-unix.h>
 #include <glib.h>
 #include <sys/socket.h>
+#include <sys/stat.h>
 #include <sys/un.h>
 #if defined(HAVE_SYS_RANDOM)
 #include <sys/random.h>
@@ -48,6 +49,9 @@
 #include "wayland/meta-xwayland-surface.h"
 #include "x11/meta-x11-display-private.h"
 
+#define X11_TMP_UNIX_DIR     "/tmp/.X11-unix"
+#define X11_TMP_UNIX_PATH    "/tmp/.X11-unix/X"
+
 static int display_number_override = -1;
 
 static void meta_xwayland_stop_xserver (MetaXWaylandManager *manager);
@@ -260,7 +264,7 @@
 
   addr.sun_family = AF_LOCAL;
   name_size = snprintf (addr.sun_path, sizeof addr.sun_path,
-                        "%c/tmp/.X11-unix/X%d", 0, display);
+                        "%c%s%d", 0, X11_TMP_UNIX_PATH, display);
   size = offsetof (struct sockaddr_un, sun_path) + name_size;
   if (bind (fd, (struct sockaddr *) &addr, size) < 0)
     {
@@ -295,7 +299,7 @@
 
   addr.sun_family = AF_LOCAL;
   name_size = snprintf (addr.sun_path, sizeof addr.sun_path,
-                        "/tmp/.X11-unix/X%d", display) + 1;
+                        "%s%d", X11_TMP_UNIX_PATH, display) + 1;
   size = offsetof (struct sockaddr_un, sun_path) + name_size;
   unlink (addr.sun_path);
   if (bind (fd, (struct sockaddr *) &addr, size) < 0)
@@ -414,9 +418,70 @@
 }
 
 static gboolean
+ensure_x11_unix_perms (GError **error)
+{
+  struct stat buf;
+
+  if (lstat (X11_TMP_UNIX_DIR, &buf) != 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
+                   "Failed to check permissions on directory \"%s\": %s",
+                   X11_TMP_UNIX_DIR, g_strerror (errno));
+      return FALSE;
+    }
+
+  /* If the directory already exists, it should belong to root or ourselves ... */
+  if (buf.st_uid != 0 && buf.st_uid != getuid ())
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+                   "Wrong ownership for directory \"%s\"",
+                   X11_TMP_UNIX_DIR);
+      return FALSE;
+    }
+
+  /* ... be writable ... */
+  if ((buf.st_mode & 0022) != 0022)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+                   "Directory \"%s\" is not writable",
+                   X11_TMP_UNIX_DIR);
+      return FALSE;
+    }
+
+  /* ... and have the sticky bit set */
+  if ((buf.st_mode & 01000) != 01000)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
+                   "Directory \"%s\" is missing the sticky bit",
+                   X11_TMP_UNIX_DIR);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+static gboolean
+ensure_x11_unix_dir (GError **error)
+{
+  if (mkdir (X11_TMP_UNIX_DIR, 01777) != 0)
+    {
+      if (errno == EEXIST)
+        return ensure_x11_unix_perms (error);
+
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno),
+                   "Failed to create directory \"%s\": %s",
+                   X11_TMP_UNIX_DIR, g_strerror (errno));
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+static gboolean
 choose_xdisplay (MetaXWaylandManager    *manager,
                  MetaXWaylandConnection *connection)
 {
+  g_autoptr (GError) error = NULL;
   int display = 0;
   char *lock_file = NULL;
   gboolean fatal = FALSE;
@@ -426,6 +491,13 @@
   else if (g_getenv ("RUNNING_UNDER_GDM"))
     display = 1024;
 
+  if (!ensure_x11_unix_dir (&error))
+    {
+      g_warning ("Failed to ensure X11 socket directory: %s",
+                 error->message);
+      return FALSE;
+    }
+
   do
     {
       lock_file = create_lock_file (display, &display);
@@ -925,10 +997,12 @@
 
   g_cancellable_cancel (manager->xserver_died_cancellable);
 
-  snprintf (path, sizeof path, "/tmp/.X11-unix/X%d", manager->public_connection.display_index);
+  snprintf (path, sizeof path, "%s%d", X11_TMP_UNIX_PATH,
+            manager->public_connection.display_index);
   unlink (path);
 
-  snprintf (path, sizeof path, "/tmp/.X11-unix/X%d", manager->private_connection.display_index);
+  snprintf (path, sizeof path, "%s%d", X11_TMP_UNIX_PATH,
+            manager->private_connection.display_index);
   unlink (path);
 
   g_clear_pointer (&manager->public_connection.name, g_free);

Reply to: