Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package mutter for openSUSE:Factory checked 
in at 2025-07-03 12:09:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mutter (Old)
 and      /work/SRC/openSUSE:Factory/.mutter.new.1903 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mutter"

Thu Jul  3 12:09:26 2025 rev:252 rq:1289812 version:48.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/mutter/mutter.changes    2025-06-10 
08:57:19.987690392 +0200
+++ /work/SRC/openSUSE:Factory/.mutter.new.1903/mutter.changes  2025-07-03 
12:11:29.512267816 +0200
@@ -1,0 +2,13 @@
+Sun Jun 29 17:23:25 UTC 2025 - Bjørn Lie <bjorn....@gmail.com>
+
+- Update to version 48.4:
+  + Unlink outputs from unused connectors in update_outputs
+  + Add speed limit to Visual alerts
+  + Fix behavior of windows that get activated before mapped
+  + Fix incorrect cursor over Xwayland clients
+  + Fix hi-res scroll events getting converted to flip-flopping
+    discrete events
+  + Fixed crash
+  + Misc. bug fixes and cleanups
+
+-------------------------------------------------------------------

Old:
----
  mutter-48.3.1.obscpio

New:
----
  mutter-48.4.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mutter.spec ++++++
--- /var/tmp/diff_new_pack.ifaDtx/_old  2025-07-03 12:11:30.328301586 +0200
+++ /var/tmp/diff_new_pack.ifaDtx/_new  2025-07-03 12:11:30.328301586 +0200
@@ -23,7 +23,7 @@
 %define libmutter libmutter-%{api_major}-%{api_minor}
 
 Name:           mutter
-Version:        48.3.1
+Version:        48.4
 Release:        0
 Summary:        Window and compositing manager based on Clutter
 License:        GPL-2.0-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.ifaDtx/_old  2025-07-03 12:11:30.360302910 +0200
+++ /var/tmp/diff_new_pack.ifaDtx/_new  2025-07-03 12:11:30.364303076 +0200
@@ -3,7 +3,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param name="url">https://gitlab.gnome.org/GNOME/mutter.git</param>
-    <param name="revision">48.3.1</param>
+    <param name="revision">48.4</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ mutter-48.3.1.obscpio -> mutter-48.4.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/NEWS new/mutter-48.4/NEWS
--- old/mutter-48.3.1/NEWS      2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/NEWS        2025-06-29 12:00:20.000000000 +0200
@@ -1,3 +1,21 @@
+48.4
+====
+* Unlink outputs from unused connectors in update_outputs [Michel; !4474]
+* Add speed limit to Visual alerts [Sergio; !4487]
+* Fix behavior of windows that get activated before mapped [Alessandro; !4462]
+* Fix incorrect cursor over Xwayland clients [Carlos; !4433]
+* Fix hi-res scroll events getting converted to flip-flopping discrete events
+  [Peter; !4459]
+* Fixed crash [Daniel; !4303]
+* Misc. bug fixes and cleanups [Alessandro, Jonas, Jordan, Alessandro, 
Corentin,
+  Daniel, Lukáš, Rémi, Michel; !4481, !4482, !4485, !4492, !4496, !4495, !4444,
+  !4447, !4442, !4452]
+
+Contributors:
+  Alessandro Astone, Rémi Bernon, Sergio Costas Rodriguez, Michel Dänzer,
+  Carlos Garnacho, Peter Hutterer, Corentin Noël, Jordan Petridis,
+  Lukáš Tyrychtr, Daniel van Vugt, Jonas Ådahl
+
 48.3.1
 ======
 * Fix Xwayland windows becoming unresponsive to events [Jonas; !4475]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/cogl/cogl/cogl-pipeline.c 
new/mutter-48.4/cogl/cogl/cogl-pipeline.c
--- old/mutter-48.3.1/cogl/cogl/cogl-pipeline.c 2025-06-03 00:01:18.000000000 
+0200
+++ new/mutter-48.4/cogl/cogl/cogl-pipeline.c   2025-06-29 12:00:20.000000000 
+0200
@@ -121,11 +121,14 @@
 {
 
   for (CoglPipeline *child = pipeline->first_child;
-       child != NULL;
-       child = child->next_sibling)
+       child != NULL;)
     {
+      CoglPipeline *next = child->next_sibling;
+
       if (!callback (child, user_data))
         break;
+
+      child = next;
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/doc/reference/clutter/clutter.toml.in 
new/mutter-48.4/doc/reference/clutter/clutter.toml.in
--- old/mutter-48.3.1/doc/reference/clutter/clutter.toml.in     2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/doc/reference/clutter/clutter.toml.in       2025-06-29 
12:00:20.000000000 +0200
@@ -2,8 +2,8 @@
 version = "@version@"
 browse_url = "https://gitlab.gnome.org/GNOME/mutter/";
 repository_url = "https://gitlab.gnome.org/GNOME/mutter.git";
-website_url = "https://blogs.gnome.org/shell-dev/";
-docs_url = "https://mutter.gnome.org/";
+website_url = "https://mutter.gnome.org";
+docs_url = "https://mutter.gnome.org/clutter";
 logo_url = "logo.svg"
 authors = "Mutter Development Team"
 license = "GPL-2.0-or-later"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/doc/reference/cogl/cogl.toml.in 
new/mutter-48.4/doc/reference/cogl/cogl.toml.in
--- old/mutter-48.3.1/doc/reference/cogl/cogl.toml.in   2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/doc/reference/cogl/cogl.toml.in     2025-06-29 
12:00:20.000000000 +0200
@@ -2,8 +2,8 @@
 version = "@version@"
 browse_url = "https://gitlab.gnome.org/GNOME/mutter/";
 repository_url = "https://gitlab.gnome.org/GNOME/mutter.git";
-website_url = "https://blogs.gnome.org/shell-dev/";
-docs_url = "https://mutter.gnome.org/";
+website_url = "https://mutter.gnome.org";
+docs_url = "https://mutter.gnome.org/cogl";
 logo_url = "logo.svg"
 authors = "Mutter Development Team"
 license = "GPL-2.0-or-later"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/doc/reference/meta/meta.toml.in 
new/mutter-48.4/doc/reference/meta/meta.toml.in
--- old/mutter-48.3.1/doc/reference/meta/meta.toml.in   2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/doc/reference/meta/meta.toml.in     2025-06-29 
12:00:20.000000000 +0200
@@ -2,8 +2,8 @@
 version = "@version@"
 browse_url = "https://gitlab.gnome.org/GNOME/mutter/";
 repository_url = "https://gitlab.gnome.org/GNOME/mutter.git";
-website_url = "https://blogs.gnome.org/shell-dev/";
-docs_url = "https://mutter.gnome.org/";
+website_url = "https://mutter.gnome.org";
+docs_url = "https://mutter.gnome.org/meta";
 logo_url = "logo.svg"
 authors = "Mutter Development Team"
 license = "GPL-2.0-or-later"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/doc/reference/mtk/mtk.toml.in 
new/mutter-48.4/doc/reference/mtk/mtk.toml.in
--- old/mutter-48.3.1/doc/reference/mtk/mtk.toml.in     2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/doc/reference/mtk/mtk.toml.in       2025-06-29 
12:00:20.000000000 +0200
@@ -2,8 +2,8 @@
 version = "@version@"
 browse_url = "https://gitlab.gnome.org/GNOME/mutter/";
 repository_url = "https://gitlab.gnome.org/GNOME/mutter.git";
-website_url = "https://blogs.gnome.org/shell-dev/";
-docs_url = "https://mutter.gnome.org/";
+website_url = "https://mutter.gnome.org";
+docs_url = "https://mutter.gnome.org/mtk";
 logo_url = "logo.svg"
 authors = "Mutter Development Team"
 license = "GPL-2.0-or-later"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/doc/website/index.html 
new/mutter-48.4/doc/website/index.html
--- old/mutter-48.3.1/doc/website/index.html    2025-06-03 00:01:18.000000000 
+0200
+++ new/mutter-48.4/doc/website/index.html      2025-06-29 12:00:20.000000000 
+0200
@@ -126,6 +126,7 @@
       <li><a
           
href="https://gitlab.gnome.org/GNOME/mutter/-/jobs/artifacts/main/file/coveragereport/index.html?job=coverage";>Code
           Coverage Report</a></li>
+      <li><a href="https://blogs.gnome.org/shell-dev/";>Development 
blog</a></li>
     </ul>
 
   </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/meson.build new/mutter-48.4/meson.build
--- old/mutter-48.3.1/meson.build       2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/meson.build 2025-06-29 12:00:20.000000000 +0200
@@ -1,5 +1,5 @@
 project('mutter', 'c',
-  version: '48.3.1',
+  version: '48.4',
   meson_version: '>= 1.3.0',
   license: 'GPL-2.0-or-later',
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/backends/native/meta-gpu-kms.c 
new/mutter-48.4/src/backends/native/meta-gpu-kms.c
--- old/mutter-48.3.1/src/backends/native/meta-gpu-kms.c        2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-gpu-kms.c  2025-06-29 
12:00:20.000000000 +0200
@@ -351,6 +351,8 @@
       MetaOutput *old_output;
       GError *error = NULL;
 
+      meta_unlink_kms_connector (kms_connector);
+
       if (!meta_kms_connector_get_current_state (kms_connector))
         continue;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-48.3.1/src/backends/native/meta-kms-impl-device.c 
new/mutter-48.4/src/backends/native/meta-kms-impl-device.c
--- old/mutter-48.3.1/src/backends/native/meta-kms-impl-device.c        
2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-kms-impl-device.c  2025-06-29 
12:00:20.000000000 +0200
@@ -1131,11 +1131,13 @@
   drmModeRes *drm_resources;
   MetaKmsResourceChanges changes;
   GList *l;
+  gboolean had_fd_open;
 
   meta_assert_in_kms_impl (meta_kms_impl_get_kms (priv->impl));
 
   meta_topic (META_DEBUG_KMS, "Updating device state for %s", priv->path);
 
+  had_fd_open = !!priv->device_file;
   if (!ensure_device_file (impl_device, &error))
     {
       g_warning ("Failed to reopen '%s': %s", priv->path, error->message);
@@ -1172,6 +1174,9 @@
 
   drmModeFreeResources (drm_resources);
 
+  if (changes == META_KMS_RESOURCE_CHANGE_NONE && !had_fd_open)
+    clear_latched_fd_hold (impl_device);
+
   return changes;
 
 err:
@@ -1781,11 +1786,14 @@
   crtc_frame = get_crtc_frame (impl_device, latch_crtc);
   if (!crtc_frame)
     {
+      const MetaKmsCrtcState *crtc_state =
+        meta_kms_crtc_get_current_state (latch_crtc);
+
       crtc_frame = g_new0 (CrtcFrame, 1);
       crtc_frame->impl_device = impl_device;
       crtc_frame->crtc = latch_crtc;
       crtc_frame->deadline.timer_fd = -1;
-      crtc_frame->await_flush = TRUE;
+      crtc_frame->await_flush = !crtc_state->is_active;
       g_hash_table_insert (priv->crtc_frames, latch_crtc, crtc_frame);
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/backends/native/meta-kms.c 
new/mutter-48.4/src/backends/native/meta-kms.c
--- old/mutter-48.3.1/src/backends/native/meta-kms.c    2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-kms.c      2025-06-29 
12:00:20.000000000 +0200
@@ -373,7 +373,7 @@
     }
 
   ensure_hotplug_timeout_source (kms);
-  g_source_set_ready_time (kms->hotplug_timeout, now + 2 * G_USEC_PER_SEC);
+  g_source_set_ready_time (kms->hotplug_timeout, now + 3 * G_USEC_PER_SEC);
 
   g_hash_table_insert (kms->hotplug_events, g_steal_pointer (&hotplug_event),
                        NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mutter-48.3.1/src/backends/native/meta-onscreen-native.c 
new/mutter-48.4/src/backends/native/meta-onscreen-native.c
--- old/mutter-48.3.1/src/backends/native/meta-onscreen-native.c        
2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-onscreen-native.c  2025-06-29 
12:00:20.000000000 +0200
@@ -1833,7 +1833,7 @@
       g_warning ("Direct scanout page flip failed: %s", error->message);
 
       cogl_scanout_notify_failed (scanout, onscreen);
-      if (onscreen_native->next_frame == NULL)
+      if (onscreen_native->next_frame == NULL && view != NULL)
         {
           clutter_stage_view_add_redraw_clip (view, NULL);
           clutter_stage_view_schedule_update_now (view);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/backends/native/meta-output-kms.c 
new/mutter-48.4/src/backends/native/meta-output-kms.c
--- old/mutter-48.3.1/src/backends/native/meta-output-kms.c     2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-output-kms.c       2025-06-29 
12:00:20.000000000 +0200
@@ -99,6 +99,17 @@
                              kms_connector_output_kms_quark);
 }
 
+void
+meta_unlink_kms_connector (MetaKmsConnector *connector)
+{
+  if (!kms_connector_output_kms_quark)
+    return;
+
+  g_object_set_qdata (G_OBJECT (connector),
+                      kms_connector_output_kms_quark,
+                      NULL);
+}
+
 static GBytes *
 meta_output_kms_read_edid (MetaOutputNative *output_native)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/backends/native/meta-output-kms.h 
new/mutter-48.4/src/backends/native/meta-output-kms.h
--- old/mutter-48.3.1/src/backends/native/meta-output-kms.h     2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-output-kms.h       2025-06-29 
12:00:20.000000000 +0200
@@ -41,6 +41,8 @@
 
 MetaOutputKms * meta_output_kms_from_kms_connector (MetaKmsConnector 
*connector);
 
+void meta_unlink_kms_connector (MetaKmsConnector *connector);
+
 MetaOutputKms * meta_output_kms_new (MetaGpuKms        *gpu_kms,
                                      MetaKmsConnector  *kms_connector,
                                      MetaOutput        *old_output,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/backends/native/meta-seat-impl.c 
new/mutter-48.4/src/backends/native/meta-seat-impl.c
--- old/mutter-48.3.1/src/backends/native/meta-seat-impl.c      2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/backends/native/meta-seat-impl.c        2025-06-29 
12:00:20.000000000 +0200
@@ -1218,7 +1218,7 @@
   evdev_device->value120.acc_dx += (int32_t) dx_value120;
   evdev_device->value120.acc_dy += (int32_t) dy_value120;
 
-  if (abs (evdev_device->value120.acc_dx) >= 60)
+  if (dx_value120 != 0 && abs (evdev_device->value120.acc_dx) >= 60)
     {
       low_res_value = (evdev_device->value120.acc_dx / 120);
       if (low_res_value == 0)
@@ -1230,7 +1230,7 @@
       evdev_device->value120.acc_dx -= (low_res_value * 120);
     }
 
-  if (abs (evdev_device->value120.acc_dy) >= 60)
+  if (dy_value120 != 0 && abs (evdev_device->value120.acc_dy) >= 60)
     {
       low_res_value = (evdev_device->value120.acc_dy / 120);
       if (low_res_value == 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/compositor/compositor-private.h 
new/mutter-48.4/src/compositor/compositor-private.h
--- old/mutter-48.3.1/src/compositor/compositor-private.h       2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/compositor/compositor-private.h 2025-06-29 
12:00:20.000000000 +0200
@@ -52,7 +52,8 @@
                                                             int64_t         
monotonic_time_us);
 
 void meta_compositor_flash_window (MetaCompositor *compositor,
-                                   MetaWindow     *window);
+                                   MetaWindow     *window,
+                                   int             n_flashes);
 
 MetaCloseDialog * meta_compositor_create_close_dialog (MetaCompositor 
*compositor,
                                                        MetaWindow     *window);
@@ -141,7 +142,8 @@
                                  GList          *stack);
 
 void meta_compositor_flash_display (MetaCompositor *compositor,
-                                    MetaDisplay    *display);
+                                    MetaDisplay    *display,
+                                    int             n_flashes);
 
 void meta_compositor_show_tile_preview (MetaCompositor *compositor,
                                         MetaWindow     *window,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/compositor/compositor.c 
new/mutter-48.4/src/compositor/compositor.c
--- old/mutter-48.3.1/src/compositor/compositor.c       2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/compositor/compositor.c 2025-06-29 12:00:20.000000000 
+0200
@@ -1282,7 +1282,8 @@
 
 void
 meta_compositor_flash_display (MetaCompositor *compositor,
-                               MetaDisplay    *display)
+                               MetaDisplay    *display,
+                               int             n_flashes)
 {
   MetaBackend *backend;
   ClutterActor *stage;
@@ -1308,7 +1309,7 @@
 
   transition = clutter_actor_get_transition (flash, "opacity");
   clutter_timeline_set_auto_reverse (CLUTTER_TIMELINE (transition), TRUE);
-  clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 2);
+  clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), n_flashes);
 
   g_signal_connect (transition, "stopped",
                     G_CALLBACK (flash_out_completed), flash);
@@ -1327,7 +1328,8 @@
 
 void
 meta_compositor_flash_window (MetaCompositor *compositor,
-                              MetaWindow     *window)
+                              MetaWindow     *window,
+                              int             n_flashes)
 {
   ClutterActor *window_actor =
     CLUTTER_ACTOR (meta_window_actor_from_window (window));
@@ -1356,7 +1358,7 @@
   if (transition)
     {
       clutter_timeline_set_auto_reverse (CLUTTER_TIMELINE (transition), TRUE);
-      clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 2);
+      clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 
n_flashes);
 
       g_signal_connect (transition, "stopped",
                         G_CALLBACK (window_flash_out_completed), flash);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/core/bell.c 
new/mutter-48.4/src/core/bell.c
--- old/mutter-48.3.1/src/core/bell.c   2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/src/core/bell.c     2025-06-29 12:00:20.000000000 +0200
@@ -54,6 +54,11 @@
 #include "core/util-private.h"
 #include "core/window-private.h"
 #include "meta/compositor.h"
+#include "mtk/mtk.h"
+
+/* Time limits to prevent Photosensitive Seizures */
+#define MIN_TIME_BETWEEN_VISUAL_ALERTS_MS 500
+#define MIN_TIME_BETWEEN_DOUBLE_VISUAL_ALERT_MS 3000
 
 G_DEFINE_TYPE (MetaBell, meta_bell, G_TYPE_OBJECT)
 
@@ -120,7 +125,7 @@
 /**
  * bell_flash_fullscreen:
  * @display: The display the event came in on
- * @xkb_ev: The bell event
+ * @n_flashes: The number of times to flash the screen
  *
  * Flashes one screen, or all screens, in response to a bell event.
  * If the event is on a particular window, flash the screen that
@@ -129,15 +134,17 @@
  * If the configure script found we had no XKB, this does not exist.
  */
 static void
-bell_flash_fullscreen (MetaDisplay *display)
+bell_flash_fullscreen (MetaDisplay *display,
+                       int          n_flashes)
 {
-  meta_compositor_flash_display (display->compositor, display);
+  meta_compositor_flash_display (display->compositor, display, n_flashes);
 }
 
 static void
-bell_flash_window (MetaWindow *window)
+bell_flash_window (MetaWindow *window,
+                   int         n_flashes)
 {
-  meta_compositor_flash_window (window->display->compositor, window);
+  meta_compositor_flash_window (window->display->compositor, window, 
n_flashes);
 }
 
 /**
@@ -150,12 +157,13 @@
  */
 static void
 bell_flash_frame (MetaDisplay *display,
-                  MetaWindow  *window)
+                  MetaWindow  *window,
+                  int          n_flashes)
 {
   if (window)
-    bell_flash_window (window);
+    bell_flash_window (window, n_flashes);
   else
-    bell_flash_fullscreen (display);
+    bell_flash_fullscreen (display, n_flashes);
 }
 
 /**
@@ -170,13 +178,49 @@
 bell_visual_notify (MetaDisplay *display,
                     MetaWindow  *window)
 {
+  /*
+   * The European Accessibility Act (EAA), in the Annex I, Section I, 2.J,
+   * specifies that products "shall avoid triggering photosensitive seizures".
+   *
+   * According to the Web Content Accessibility Guidelines (WCAG), any
+   * element that flashes in the screen must have a maximum period of
+   * 3Hz to avoid the risk of Photosensitivity Seizures.
+   *
+   * If several alarm bells are sent fast enough, the Visual alerts could
+   * flash the screen or the window at speeds about 8-9Hz (tested with a
+   * simple BASH script), which is greater than the currently accepted
+   * limit of 3Hz.
+   *
+   * To avoid this, a timeout is added to ensure that no visual alerts are
+   * sent with less than 500ms of difference, to set a maximum flash speed
+   * of 2Hz.
+   *
+   * A property in display is used to keep the last time a visual alert has 
been
+   * sent because not only a "single flash zone" can trigger a seizure, but 
also
+   * slower patterns combined. So a global timeout for all the desktop is the
+   * safest approach.
+   */
+  int64_t now_us;
+  int64_t time_difference_ms;
+  int n_flashes;
+
+  now_us = g_get_monotonic_time ();
+  time_difference_ms = us2ms (now_us - display->last_visual_bell_time_us);
+
+  if (time_difference_ms < MIN_TIME_BETWEEN_VISUAL_ALERTS_MS)
+    return;
+
+  display->last_visual_bell_time_us = now_us;
+
+  n_flashes = (time_difference_ms < MIN_TIME_BETWEEN_DOUBLE_VISUAL_ALERT_MS) ? 
1 : 2;
+
   switch (meta_prefs_get_visual_bell_type ())
     {
     case G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH:
-      bell_flash_fullscreen (display);
+      bell_flash_fullscreen (display, n_flashes);
       break;
     case G_DESKTOP_VISUAL_BELL_FRAME_FLASH:
-      bell_flash_frame (display, window);
+      bell_flash_frame (display, window, n_flashes);
       break;
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/core/display-private.h 
new/mutter-48.4/src/core/display-private.h
--- old/mutter-48.3.1/src/core/display-private.h        2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/core/display-private.h  2025-06-29 12:00:20.000000000 
+0200
@@ -120,11 +120,11 @@
   GSList     *pending_pings;
 
   /* Pending focus change */
-  guint       focus_timeout_id;
+  guint focus_timeout_id;
 
   /* Pending autoraise */
-  guint       autoraise_timeout_id;
-  MetaWindow* autoraise_window;
+  guint autoraise_timeout_id;
+  MetaWindow *autoraise_window;
 
   MetaKeyBindingManager key_binding_manager;
 
@@ -157,6 +157,7 @@
   guint check_fullscreen_later;
 
   MetaBell *bell;
+  int64_t last_visual_bell_time_us;
   MetaWorkspaceManager *workspace_manager;
 
   MetaSoundPlayer *sound_player;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/core/meta-context-main.c 
new/mutter-48.4/src/core/meta-context-main.c
--- old/mutter-48.3.1/src/core/meta-context-main.c      2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/core/meta-context-main.c        2025-06-29 
12:00:20.000000000 +0200
@@ -666,6 +666,8 @@
       N_("Run as a nested compositor"),
       NULL
     },
+#endif
+#ifdef HAVE_XWAYLAND
     {
       "no-x11", 0, 0, G_OPTION_ARG_NONE,
       &context_main->options.no_x11,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/core/window.c 
new/mutter-48.4/src/core/window.c
--- old/mutter-48.3.1/src/core/window.c 2025-06-03 00:01:18.000000000 +0200
+++ new/mutter-48.4/src/core/window.c   2025-06-29 12:00:20.000000000 +0200
@@ -5181,6 +5181,13 @@
 
   g_return_if_fail (!window->override_redirect);
 
+  /* Flush pending visible state now.
+   * It is important that this runs before meta_stack_raise() because
+   * showing a window may overwrite its stacking order based on the
+   * stacking rules for newly shown windows.
+   */
+  meta_window_flush_calc_showing (window);
+
   ancestor = meta_window_find_root_ancestor (window);
 
   meta_topic (META_DEBUG_WINDOW_OPS,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/tests/test-runner.c 
new/mutter-48.4/src/tests/test-runner.c
--- old/mutter-48.3.1/src/tests/test-runner.c   2025-06-03 00:01:18.000000000 
+0200
+++ new/mutter-48.4/src/tests/test-runner.c     2025-06-29 12:00:20.000000000 
+0200
@@ -296,7 +296,7 @@
       if ((filter & STACK_FILTER_SHOWING) && window && window->hidden)
         continue;
 
-      if (workspace && !meta_window_located_on_workspace (window, workspace))
+      if (window && workspace && !meta_window_located_on_workspace (window, 
workspace))
         continue;
 
       if (window != NULL && window->title)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/wayland/meta-wayland-data-device.c 
new/mutter-48.4/src/wayland/meta-wayland-data-device.c
--- old/mutter-48.3.1/src/wayland/meta-wayland-data-device.c    2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/wayland/meta-wayland-data-device.c      2025-06-29 
12:00:20.000000000 +0200
@@ -26,8 +26,6 @@
 
 #include "wayland/meta-wayland-data-device.h"
 
-#include <gio/gunixoutputstream.h>
-#include <glib-unix.h>
 #include <glib.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -235,6 +233,12 @@
   g_autoptr (MetaCursorSprite) cursor_sprite = NULL;
   MetaCursorRenderer *cursor_renderer;
 
+#ifdef HAVE_X11_CLIENT
+  /* X11 DnD lets the drag source client drive pointer cursor updates */
+  if (META_IS_WAYLAND_DATA_SOURCE_XWAYLAND (drag_grab->drag_data_source))
+    return;
+#endif
+
   cursor_sprite =
     META_CURSOR_SPRITE (meta_cursor_sprite_xcursor_new (cursor, 
cursor_tracker));
   cursor_renderer =
@@ -276,10 +280,7 @@
 on_data_source_action_changed (MetaWaylandDataSource *source,
                                MetaWaylandDragGrab   *drag_grab)
 {
-#ifdef HAVE_X11_CLIENT
-  if (!META_IS_WAYLAND_DATA_SOURCE_XWAYLAND (source))
-#endif
-    meta_wayland_drag_grab_update_cursor (drag_grab);
+  meta_wayland_drag_grab_update_cursor (drag_grab);
 }
 
 static void
@@ -453,6 +454,8 @@
   MetaDisplay *display = display_from_data_device (data_device);
   MetaCompositor *compositor = meta_display_get_compositor (display);
 
+  meta_wayland_drag_grab_set_cursor (drag_grab, META_CURSOR_DEFAULT);
+
   meta_wayland_drag_grab_set_source (drag_grab, NULL);
   meta_wayland_drag_grab_set_focus (drag_grab, NULL);
 
@@ -485,55 +488,11 @@
       drag_grab->handler = NULL;
     }
 
-  meta_wayland_drag_grab_set_cursor (drag_grab, META_CURSOR_DEFAULT);
   meta_dnd_wayland_handle_end_modal (compositor);
 
   g_free (drag_grab);
 }
 
-static gboolean
-on_fake_read_hup (GIOChannel   *channel,
-                  GIOCondition  condition,
-                  gpointer      data)
-{
-  MetaWaylandDataSource *source = data;
-
-  meta_wayland_data_source_notify_finish (source);
-  g_io_channel_shutdown (channel, FALSE, NULL);
-  g_io_channel_unref (channel);
-
-  return G_SOURCE_REMOVE;
-}
-
-static void
-meta_wayland_data_source_fake_read (MetaWaylandDataSource *source,
-                                    const gchar           *mimetype)
-{
-  GIOChannel *channel;
-  int p[2];
-
-  if (!g_unix_open_pipe (p, FD_CLOEXEC, NULL))
-    {
-      meta_wayland_data_source_notify_finish (source);
-      return;
-    }
-
-  if (!g_unix_set_fd_nonblocking (p[0], TRUE, NULL) ||
-      !g_unix_set_fd_nonblocking (p[1], TRUE, NULL))
-    {
-      meta_wayland_data_source_notify_finish (source);
-      close (p[0]);
-      close (p[1]);
-      return;
-    }
-
-  meta_wayland_data_source_send (source, mimetype, p[1]);
-  close (p[1]);
-  channel = g_io_channel_unix_new (p[0]);
-  g_io_channel_set_close_on_unref (channel, TRUE);
-  g_io_add_watch (channel, G_IO_HUP, on_fake_read_hup, source);
-}
-
 static MetaWaylandSurface *
 drag_grab_get_focus_surface (MetaWaylandEventHandler *handler,
                              ClutterInputDevice      *device,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/wayland/meta-wayland-data-source.c 
new/mutter-48.4/src/wayland/meta-wayland-data-source.c
--- old/mutter-48.3.1/src/wayland/meta-wayland-data-source.c    2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/wayland/meta-wayland-data-source.c      2025-06-29 
12:00:20.000000000 +0200
@@ -23,6 +23,8 @@
 
 #include "config.h"
 
+#include <gio/gunixoutputstream.h>
+#include <glib-unix.h>
 #include <unistd.h>
 
 #include "wayland/meta-wayland-data-source.h"
@@ -46,6 +48,10 @@
   enum wl_data_device_manager_dnd_action current_dnd_action;
   MetaWaylandSeat *seat;
   MetaWaylandToplevelDrag *toplevel_drag;
+
+  GIOChannel *fake_read_channel;
+  guint fake_read_watch_id;
+
   guint actions_set : 1;
   guint in_ask : 1;
   guint drop_performed : 1;
@@ -160,6 +166,9 @@
     meta_wayland_data_source_get_instance_private (source);
   char **pos;
 
+  g_clear_handle_id (&priv->fake_read_watch_id, g_source_remove);
+  g_clear_pointer (&priv->fake_read_channel, g_io_channel_unref);
+
   wl_array_for_each (pos, &priv->mime_types)
     g_free (*pos);
   wl_array_release (&priv->mime_types);
@@ -582,6 +591,56 @@
   META_WAYLAND_DATA_SOURCE_GET_CLASS (source)->drag_finished (source);
 }
 
+static gboolean
+on_fake_read_hup (GIOChannel   *channel,
+                  GIOCondition  condition,
+                  gpointer      user_data)
+{
+  MetaWaylandDataSource *source = META_WAYLAND_DATA_SOURCE (user_data);
+  MetaWaylandDataSourcePrivate *priv =
+    meta_wayland_data_source_get_instance_private (source);
+
+  priv->fake_read_watch_id = 0;
+  meta_wayland_data_source_notify_finish (source);
+  g_io_channel_shutdown (channel, FALSE, NULL);
+  g_clear_pointer (&priv->fake_read_channel, g_io_channel_unref);
+
+  return G_SOURCE_REMOVE;
+}
+
+void
+meta_wayland_data_source_fake_read (MetaWaylandDataSource *source,
+                                    const char            *mimetype)
+{
+  MetaWaylandDataSourcePrivate *priv =
+    meta_wayland_data_source_get_instance_private (source);
+  GIOChannel *channel;
+  int p[2];
+
+  if (!g_unix_open_pipe (p, FD_CLOEXEC, NULL))
+    {
+      meta_wayland_data_source_notify_finish (source);
+      return;
+    }
+
+  if (!g_unix_set_fd_nonblocking (p[0], TRUE, NULL) ||
+      !g_unix_set_fd_nonblocking (p[1], TRUE, NULL))
+    {
+      meta_wayland_data_source_notify_finish (source);
+      close (p[0]);
+      close (p[1]);
+      return;
+    }
+
+  meta_wayland_data_source_send (source, mimetype, p[1]);
+  close (p[1]);
+  channel = g_io_channel_unix_new (p[0]);
+  g_io_channel_set_close_on_unref (channel, TRUE);
+  priv->fake_read_channel = channel;
+  priv->fake_read_watch_id =
+    g_io_add_watch (channel, G_IO_HUP, on_fake_read_hup, source);
+}
+
 gboolean
 meta_wayland_data_source_add_mime_type (MetaWaylandDataSource *source,
                                         const char            *mime_type)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/wayland/meta-wayland-data-source.h 
new/mutter-48.4/src/wayland/meta-wayland-data-source.h
--- old/mutter-48.3.1/src/wayland/meta-wayland-data-source.h    2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/wayland/meta-wayland-data-source.h      2025-06-29 
12:00:20.000000000 +0200
@@ -111,6 +111,9 @@
 void meta_wayland_data_source_notify_drop_performed (MetaWaylandDataSource 
*source);
 void meta_wayland_data_source_notify_finish (MetaWaylandDataSource *source);
 
+void meta_wayland_data_source_fake_read (MetaWaylandDataSource *source,
+                                         const char            *mimetype);
+
 void
 meta_wayland_data_source_set_toplevel_drag (MetaWaylandDataSource   *source,
                                             MetaWaylandToplevelDrag 
*toplevel_drag);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/wayland/meta-wayland-seat.c 
new/mutter-48.4/src/wayland/meta-wayland-seat.c
--- old/mutter-48.3.1/src/wayland/meta-wayland-seat.c   2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/wayland/meta-wayland-seat.c     2025-06-29 
12:00:20.000000000 +0200
@@ -98,10 +98,10 @@
   wl_resource_set_implementation (resource, &seat_interface, seat, 
unbind_resource);
   wl_list_insert (&seat->base_resource_list, wl_resource_get_link (resource));
 
-  wl_seat_send_capabilities (resource, seat->capabilities);
-
   if (version >= WL_SEAT_NAME_SINCE_VERSION)
     wl_seat_send_name (resource, "seat0");
+
+  wl_seat_send_capabilities (resource, seat->capabilities);
 }
 
 static uint32_t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mutter-48.3.1/src/x11/meta-x11-display.c 
new/mutter-48.4/src/x11/meta-x11-display.c
--- old/mutter-48.3.1/src/x11/meta-x11-display.c        2025-06-03 
00:01:18.000000000 +0200
+++ new/mutter-48.4/src/x11/meta-x11-display.c  2025-06-29 12:00:20.000000000 
+0200
@@ -2261,6 +2261,14 @@
 
   if (focus_window)
     data[0] = meta_window_x11_get_xwindow (focus_window);
+#ifdef HAVE_XWAYLAND
+  else if (x11_display->focus_xwindow && meta_is_wayland_compositor ())
+    /* On Wayland, when a Wayland window is focused, indicate that an
+     * actual window is focused rather than None, as None is otherwise
+     * also used during transient focus changes.
+     */
+    data[0] = x11_display->no_focus_window;
+#endif
   else
     data[0] = None;
 

++++++ mutter.obsinfo ++++++
--- /var/tmp/diff_new_pack.ifaDtx/_old  2025-07-03 12:11:32.004370948 +0200
+++ /var/tmp/diff_new_pack.ifaDtx/_new  2025-07-03 12:11:32.008371113 +0200
@@ -1,5 +1,5 @@
 name: mutter
-version: 48.3.1
-mtime: 1748901678
-commit: b8eb8246ffa306adbada1106d3a6a7d5a609530a
+version: 48.4
+mtime: 1751191220
+commit: d7dc2308e095f4267c7e5994b4d66b5f991b7afc
 

Reply via email to