diff options
| author | outfoxxed <outfoxxed@outfoxxed.me> | 2025-01-23 13:57:33 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-23 22:57:33 +0100 |
| commit | 465cf66df14c28427ba30580253be6e3908bd28c (patch) | |
| tree | 93bc76546ffa329972863fd2716e8856debaeef8 /src/protocols/HyprlandSurface.cpp | |
| parent | 1a0a22ad038bbd51c4e1514868d6dcd505af0242 (diff) | |
protocols: add hyprland_surface_v1.set_visible_region implementation (#9120)
Diffstat (limited to 'src/protocols/HyprlandSurface.cpp')
| -rw-r--r-- | src/protocols/HyprlandSurface.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/protocols/HyprlandSurface.cpp b/src/protocols/HyprlandSurface.cpp index ca133b78..e3716f10 100644 --- a/src/protocols/HyprlandSurface.cpp +++ b/src/protocols/HyprlandSurface.cpp @@ -3,6 +3,8 @@ #include "../render/Renderer.hpp" #include "core/Compositor.hpp" #include "hyprland-surface-v1.hpp" +#include <hyprutils/math/Region.hpp> +#include <wayland-server.h> CHyprlandSurface::CHyprlandSurface(SP<CHyprlandSurfaceV1> resource, SP<CWLSurfaceResource> surface) : m_pSurface(surface) { setResource(std::move(resource)); @@ -36,11 +38,25 @@ void CHyprlandSurface::setResource(SP<CHyprlandSurfaceV1> resource) { m_fOpacity = fOpacity; }); + m_pResource->setSetVisibleRegion([this](CHyprlandSurfaceV1* resource, wl_resource* region) { + if (!region) { + if (!m_visibleRegion.empty()) + m_bVisibleRegionChanged = true; + + m_visibleRegion.clear(); + return; + } + + m_bVisibleRegionChanged = true; + m_visibleRegion = CWLRegionResource::fromResource(region)->region; + }); + listeners.surfaceCommitted = m_pSurface->events.commit.registerListener([this](std::any data) { auto surface = CWLSurface::fromResource(m_pSurface.lock()); - if (surface && surface->m_fOverallOpacity != m_fOpacity) { + if (surface && (surface->m_fOverallOpacity != m_fOpacity || m_bVisibleRegionChanged)) { surface->m_fOverallOpacity = m_fOpacity; + surface->m_visibleRegion = m_visibleRegion; auto box = surface->getSurfaceBoxGlobal(); if (box.has_value()) @@ -61,6 +77,11 @@ void CHyprlandSurface::destroy() { m_pResource.reset(); m_fOpacity = 1.F; + if (!m_visibleRegion.empty()) + m_bVisibleRegionChanged = true; + + m_visibleRegion.clear(); + if (!m_pSurface) PROTO::hyprlandSurface->destroySurface(this); } |
