Wayland: Add support for ext-background-effects

Fixes #9536
Fixes #9534
This commit is contained in:
copilot-swe-agent[bot] 2026-02-21 14:47:15 +00:00 committed by Kovid Goyal
parent 6bd0aa5269
commit bcba8fc04c
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
4 changed files with 47 additions and 4 deletions

View file

@ -90,7 +90,8 @@
"staging/xdg-toplevel-tag/xdg-toplevel-tag-v1.xml",
"kwin-blur-v1.xml",
"wlr-layer-shell-unstable-v1.xml"
"wlr-layer-shell-unstable-v1.xml",
"staging/ext-background-effect/ext-background-effect-v1.xml"
],
"sources": [
"wl_init.c",

20
glfw/wl_init.c vendored
View file

@ -513,6 +513,17 @@ static const struct xdg_wm_base_listener wmBaseListener = {
wmBaseHandlePing
};
static void extBackgroundEffectHandleCapabilities(void* data UNUSED,
struct ext_background_effect_manager_v1* manager UNUSED,
uint32_t flags)
{
_glfw.wl.ext_background_effect_capabilities = flags;
}
static const struct ext_background_effect_manager_v1_listener extBackgroundEffectManagerListener = {
extBackgroundEffectHandleCapabilities
};
static void registryHandleGlobal(void* data UNUSED,
struct wl_registry* registry,
uint32_t name,
@ -641,6 +652,10 @@ static void registryHandleGlobal(void* data UNUSED,
else if (is(org_kde_kwin_blur_manager)) {
_glfw.wl.org_kde_kwin_blur_manager = wl_registry_bind(registry, name, &org_kde_kwin_blur_manager_interface, 1);
}
else if (is(ext_background_effect_manager_v1)) {
_glfw.wl.ext_background_effect_manager_v1 = wl_registry_bind(registry, name, &ext_background_effect_manager_v1_interface, 1);
ext_background_effect_manager_v1_add_listener(_glfw.wl.ext_background_effect_manager_v1, &extBackgroundEffectManagerListener, NULL);
}
else if (is(zwlr_layer_shell_v1)) {
if (version >= 4) {
_glfw.wl.zwlr_layer_shell_v1_version = version;
@ -766,7 +781,8 @@ get_compositor_missing_capabilities(void) {
char *p = buf;
*p = 0;
C(viewporter, wp_viewporter); C(fractional_scale, wp_fractional_scale_manager_v1);
C(blur, org_kde_kwin_blur_manager); C(server_side_decorations, decorationManager);
if (!_glfw.wl.org_kde_kwin_blur_manager && !_glfw.wl.ext_background_effect_manager_v1) p += snprintf(p, sizeof(buf) - (p - buf), "%s ", "blur");
C(server_side_decorations, decorationManager);
C(cursor_shape, wp_cursor_shape_manager_v1); C(layer_shell, zwlr_layer_shell_v1);
C(single_pixel_buffer, wp_single_pixel_buffer_manager_v1); C(preferred_scale, has_preferred_buffer_scale);
C(idle_inhibit, idle_inhibit_manager); C(icon, xdg_toplevel_icon_manager_v1); C(bell, xdg_system_bell_v1);
@ -969,6 +985,8 @@ void _glfwPlatformTerminate(void)
wp_fractional_scale_manager_v1_destroy(_glfw.wl.wp_fractional_scale_manager_v1);
if (_glfw.wl.org_kde_kwin_blur_manager)
org_kde_kwin_blur_manager_destroy(_glfw.wl.org_kde_kwin_blur_manager);
if (_glfw.wl.ext_background_effect_manager_v1)
ext_background_effect_manager_v1_destroy(_glfw.wl.ext_background_effect_manager_v1);
if (_glfw.wl.zwlr_layer_shell_v1)
zwlr_layer_shell_v1_destroy(_glfw.wl.zwlr_layer_shell_v1);
if (_glfw.wl.idle_inhibit_manager)

4
glfw/wl_platform.h vendored
View file

@ -63,6 +63,7 @@ typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR
#include "wayland-fractional-scale-v1-client-protocol.h"
#include "wayland-viewporter-client-protocol.h"
#include "wayland-kwin-blur-v1-client-protocol.h"
#include "wayland-ext-background-effect-v1-client-protocol.h"
#include "wayland-wlr-layer-shell-unstable-v1-client-protocol.h"
#include "wayland-single-pixel-buffer-v1-client-protocol.h"
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
@ -184,6 +185,7 @@ typedef struct _GLFWwindowWayland
struct wp_fractional_scale_v1 *wp_fractional_scale_v1;
struct wp_viewport *wp_viewport;
struct org_kde_kwin_blur *org_kde_kwin_blur;
struct ext_background_effect_surface_v1 *ext_background_effect_surface_v1;
bool has_blur, expect_scale_from_compositor, window_fully_created;
struct {
bool surface_configured, preferred_scale_received, fractional_scale_received;
@ -349,6 +351,8 @@ typedef struct _GLFWlibraryWayland
struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1;
struct wp_viewporter *wp_viewporter;
struct org_kde_kwin_blur_manager *org_kde_kwin_blur_manager;
struct ext_background_effect_manager_v1 *ext_background_effect_manager_v1;
uint32_t ext_background_effect_capabilities;
struct zwlr_layer_shell_v1* zwlr_layer_shell_v1; uint32_t zwlr_layer_shell_v1_version;
struct wp_single_pixel_buffer_manager_v1 *wp_single_pixel_buffer_manager_v1;
struct zwp_idle_inhibit_manager_v1* idle_inhibit_manager;

24
glfw/wl_window.c vendored
View file

@ -344,7 +344,25 @@ update_regions(_GLFWwindow* window) {
wl_region_destroy(region);
}
// Set blur region
if (_glfw.wl.org_kde_kwin_blur_manager) {
if (_glfw.wl.ext_background_effect_manager_v1) {
if (window->wl.has_blur && (_glfw.wl.ext_background_effect_capabilities & EXT_BACKGROUND_EFFECT_MANAGER_V1_CAPABILITY_BLUR)) {
if (!window->wl.ext_background_effect_surface_v1)
window->wl.ext_background_effect_surface_v1 = ext_background_effect_manager_v1_get_background_effect(
_glfw.wl.ext_background_effect_manager_v1, window->wl.surface);
if (window->wl.ext_background_effect_surface_v1) {
struct wl_region* region = wl_compositor_create_region(_glfw.wl.compositor);
if (region) {
wl_region_add(region, 0, 0, window->wl.width, window->wl.height);
ext_background_effect_surface_v1_set_blur_region(window->wl.ext_background_effect_surface_v1, region);
wl_region_destroy(region);
}
}
} else {
if (window->wl.ext_background_effect_surface_v1) {
ext_background_effect_surface_v1_set_blur_region(window->wl.ext_background_effect_surface_v1, NULL);
}
}
} else if (_glfw.wl.org_kde_kwin_blur_manager) {
if (window->wl.has_blur) {
if (!window->wl.org_kde_kwin_blur)
window->wl.org_kde_kwin_blur = org_kde_kwin_blur_manager_create(_glfw.wl.org_kde_kwin_blur_manager, window->wl.surface);
@ -606,7 +624,7 @@ create_surface(_GLFWwindow* window, const _GLFWwndconfig* wndconfig) {
}
}
window->wl.window_fully_created = !window->wl.expect_scale_from_compositor;
if (_glfw.wl.org_kde_kwin_blur_manager && wndconfig->blur_radius > 0) _glfwPlatformSetWindowBlur(window, wndconfig->blur_radius);
if ((_glfw.wl.ext_background_effect_manager_v1 || _glfw.wl.org_kde_kwin_blur_manager) && wndconfig->blur_radius > 0) _glfwPlatformSetWindowBlur(window, wndconfig->blur_radius);
window->wl.integer_scale.deduced = scale;
if (_glfw.wl.has_preferred_buffer_scale) { scale = 1; window->wl.integer_scale.preferred = 1; }
@ -1512,6 +1530,8 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
wp_viewport_destroy(window->wl.wp_viewport);
if (window->wl.org_kde_kwin_blur)
org_kde_kwin_blur_release(window->wl.org_kde_kwin_blur);
if (window->wl.ext_background_effect_surface_v1)
ext_background_effect_surface_v1_destroy(window->wl.ext_background_effect_surface_v1);
if (window->context.destroy)
window->context.destroy(window);