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