summaryrefslogtreecommitdiff
path: root/src/protocols
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
parent1a0a22ad038bbd51c4e1514868d6dcd505af0242 (diff)
protocols: add hyprland_surface_v1.set_visible_region implementation (#9120)
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/HyprlandSurface.cpp23
-rw-r--r--src/protocols/HyprlandSurface.hpp5
2 files changed, 26 insertions, 2 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);
}
diff --git a/src/protocols/HyprlandSurface.hpp b/src/protocols/HyprlandSurface.hpp
index a5812b89..5c1181c4 100644
--- a/src/protocols/HyprlandSurface.hpp
+++ b/src/protocols/HyprlandSurface.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <hyprutils/math/Region.hpp>
#include <vector>
#include <unordered_map>
#include "WaylandProtocol.hpp"
@@ -19,7 +20,9 @@ class CHyprlandSurface {
private:
SP<CHyprlandSurfaceV1> m_pResource;
WP<CWLSurfaceResource> m_pSurface;
- float m_fOpacity = 1.0;
+ float m_fOpacity = 1.0;
+ bool m_bVisibleRegionChanged = false;
+ CRegion m_visibleRegion;
void destroy();