summaryrefslogtreecommitdiff
path: root/src/protocols/HyprlandSurface.cpp
diff options
context:
space:
mode:
authoroutfoxxed <outfoxxed@outfoxxed.me>2025-01-23 13:57:33 -0800
committerGitHub <noreply@github.com>2025-01-23 22:57:33 +0100
commit465cf66df14c28427ba30580253be6e3908bd28c (patch)
tree93bc76546ffa329972863fd2716e8856debaeef8 /src/protocols/HyprlandSurface.cpp
parent1a0a22ad038bbd51c4e1514868d6dcd505af0242 (diff)
protocols: add hyprland_surface_v1.set_visible_region implementation (#9120)
Diffstat (limited to 'src/protocols/HyprlandSurface.cpp')
-rw-r--r--src/protocols/HyprlandSurface.cpp23
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);
}