mirror of
https://github.com/kovidgoyal/kitty.git
synced 2026-06-27 03:11:46 +00:00
Wayland: Add support for ext-background-effects
Fixes #9536 Fixes #9534
This commit is contained in:
parent
6bd0aa5269
commit
bcba8fc04c
4 changed files with 47 additions and 4 deletions
|
|
@ -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
20
glfw/wl_init.c
vendored
|
|
@ -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
4
glfw/wl_platform.h
vendored
|
|
@ -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
24
glfw/wl_window.c
vendored
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue