diff --git a/glfw/source-info.json b/glfw/source-info.json index df7159406..eddfd6674 100644 --- a/glfw/source-info.json +++ b/glfw/source-info.json @@ -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", diff --git a/glfw/wl_init.c b/glfw/wl_init.c index 98b012dbc..6414e3f32 100644 --- a/glfw/wl_init.c +++ b/glfw/wl_init.c @@ -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) diff --git a/glfw/wl_platform.h b/glfw/wl_platform.h index e53975424..66b6ce539 100644 --- a/glfw/wl_platform.h +++ b/glfw/wl_platform.h @@ -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; diff --git a/glfw/wl_window.c b/glfw/wl_window.c index df15b0cd2..4b142d553 100644 --- a/glfw/wl_window.c +++ b/glfw/wl_window.c @@ -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);