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);