diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5501531b1..0bad9a6fa 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -101,7 +101,7 @@ variables:
- .skip-git-clone
variables:
FDO_DISTRIBUTION_VERSION: 41
- BASE_TAG: '2024-09-20.2'
+ BASE_TAG: '2024-10-15.0'
MUTTER_USER: 'meta-user'
FDO_DISTRIBUTION_PACKAGES:
clang
@@ -150,6 +150,10 @@ variables:
https://gitlab.gnome.org/GNOME/gi-docgen.git \
main
+ ./.gitlab-ci/install-meson-project.sh \
+ https://gitlab.freedesktop.org/wayland/wayland-protocols.git \
+ 1.38
+
./.gitlab-ci/install-common-dependencies.sh
rpm -e --nodeps gnome-bluetooth-libs-devel \
diff --git a/meson.build b/meson.build
index 86d665b1b..1e117de5d 100644
--- a/meson.build
+++ b/meson.build
@@ -47,7 +47,7 @@ gudev_req = '>= 238'
# wayland version requirements
wayland_server_req = '>= 1.23'
-wayland_protocols_req = '>= 1.36'
+wayland_protocols_req = '>= 1.38'
# native backend version requirements
libinput_req = '>= 1.26.0'
diff --git a/src/meson.build b/src/meson.build
index 71e46e4fd..102d83367 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -671,6 +671,8 @@ if have_wayland
'wayland/meta-wayland-subsurface.h',
'wayland/meta-wayland-surface.c',
'wayland/meta-wayland-surface-private.h',
+ 'wayland/meta-wayland-system-bell.c',
+ 'wayland/meta-wayland-system-bell.h',
'wayland/meta-wayland-tablet.c',
'wayland/meta-wayland-tablet-cursor-surface.c',
'wayland/meta-wayland-tablet-cursor-surface.h',
@@ -1102,6 +1104,7 @@ if have_wayland
['primary-selection', 'unstable', 'v1', ],
['relative-pointer', 'unstable', 'v1', ],
['single-pixel-buffer', 'staging', 'v1', ],
+ ['xdg-system-bell', 'staging', 'v1', ],
['tablet', 'unstable', 'v2', ],
['text-input', 'unstable', 'v3', ],
['viewporter', 'stable', ],
diff --git a/src/wayland/meta-wayland-system-bell.c b/src/wayland/meta-wayland-system-bell.c
new file mode 100644
index 000000000..a526753a0
--- /dev/null
+++ b/src/wayland/meta-wayland-system-bell.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2024 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ *
+ */
+
+#include "config.h"
+
+#include "wayland/meta-wayland-system-bell.h"
+
+#include "core/bell.h"
+#include "wayland/meta-wayland-surface-private.h"
+#include "wayland/meta-wayland-versions.h"
+#include "wayland/meta-wayland.h"
+
+#include "xdg-system-bell-v1-server-protocol.h"
+
+static void
+system_bell_destroy (struct wl_client *client,
+ struct wl_resource *resource)
+{
+ wl_resource_destroy (resource);
+}
+
+static MetaWindow *
+find_window_from_resource (struct wl_resource *surface_resource)
+{
+ MetaWaylandSurface *surface;
+
+ surface = wl_resource_get_user_data (surface_resource);
+ if (!surface)
+ return NULL;
+
+ return meta_wayland_surface_get_window (surface);
+}
+
+static void
+system_bell_ring (struct wl_client *client,
+ struct wl_resource *resource,
+ struct wl_resource *surface_resource)
+{
+ MetaWaylandCompositor *compositor =
+ META_WAYLAND_COMPOSITOR (wl_resource_get_user_data (resource));
+ MetaContext *context = meta_wayland_compositor_get_context (compositor);
+ MetaDisplay *display = meta_context_get_display (context);
+
+ if (surface_resource)
+ meta_bell_notify (display, find_window_from_resource (surface_resource));
+ else
+ meta_bell_notify (display, NULL);
+}
+
+static const struct xdg_system_bell_v1_interface system_bell_implementation =
+{
+ system_bell_destroy,
+ system_bell_ring,
+};
+
+static void
+system_bell_bind (struct wl_client *client,
+ void *user_data,
+ uint32_t version,
+ uint32_t id)
+{
+ MetaWaylandCompositor *compositor = user_data;
+ struct wl_resource *resource;
+
+ resource = wl_resource_create (client,
+ &xdg_system_bell_v1_interface,
+ version, id);
+ wl_resource_set_implementation (resource,
+ &system_bell_implementation,
+ compositor, NULL);
+}
+
+void
+meta_wayland_init_system_bell (MetaWaylandCompositor *compositor)
+{
+ struct wl_display *wl_display =
+ meta_wayland_compositor_get_wayland_display (compositor);
+
+ if (!wl_global_create (wl_display,
+ &xdg_system_bell_v1_interface,
+ META_WP_SYSTEM_BELL_V1_VERSION,
+ compositor,
+ system_bell_bind))
+ g_error ("Failed to create xdg_system_bell_v1 global");
+}
diff --git a/src/wayland/meta-wayland-system-bell.h b/src/wayland/meta-wayland-system-bell.h
new file mode 100644
index 000000000..5c2949a7c
--- /dev/null
+++ b/src/wayland/meta-wayland-system-bell.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2024 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ *
+ */
+
+#pragma once
+
+#include "wayland/meta-wayland-types.h"
+
+void meta_wayland_init_system_bell (MetaWaylandCompositor *compositor);
diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h
index f0d035506..bfd8608eb 100644
--- a/src/wayland/meta-wayland-versions.h
+++ b/src/wayland/meta-wayland-versions.h
@@ -61,3 +61,4 @@
#define META_XDG_DIALOG_VERSION 1
#define META_WP_DRM_LEASE_DEVICE_V1_VERSION 1
#define META_XDG_SESSION_MANAGER_V1_VERSION 1
+#define META_WP_SYSTEM_BELL_V1_VERSION 1
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index fd7b6e473..9ce6bf301 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -55,6 +55,7 @@
#include "wayland/meta-wayland-region.h"
#include "wayland/meta-wayland-seat.h"
#include "wayland/meta-wayland-subsurface.h"
+#include "wayland/meta-wayland-system-bell.h"
#include "wayland/meta-wayland-tablet-manager.h"
#include "wayland/meta-wayland-transaction.h"
#include "wayland/meta-wayland-xdg-dialog.h"
@@ -895,6 +896,7 @@ meta_wayland_compositor_new (MetaContext *context)
meta_wayland_init_xdg_wm_dialog (compositor);
meta_wayland_init_color_management (compositor);
meta_wayland_xdg_session_management_init (compositor);
+ meta_wayland_init_system_bell (compositor);
#ifdef HAVE_NATIVE_BACKEND
meta_wayland_drm_lease_manager_init (compositor);