aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/protocols/core/Compositor.cpp6
-rw-r--r--src/protocols/core/Compositor.hpp2
-rw-r--r--src/protocols/core/Output.cpp21
3 files changed, 29 insertions, 0 deletions
diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp
index 37a4bdf1..3d4b63c1 100644
--- a/src/protocols/core/Compositor.cpp
+++ b/src/protocols/core/Compositor.cpp
@@ -589,3 +589,9 @@ void CWLCompositorProtocol::destroyResource(CWLSurfaceResource* resource) {
void CWLCompositorProtocol::destroyResource(CWLRegionResource* resource) {
std::erase_if(m_vRegions, [&](const auto& other) { return other.get() == resource; });
}
+
+void CWLCompositorProtocol::forEachSurface(std::function<void(SP<CWLSurfaceResource>)> fn) {
+ for (auto& surf : m_vSurfaces) {
+ fn(surf);
+ }
+}
diff --git a/src/protocols/core/Compositor.hpp b/src/protocols/core/Compositor.hpp
index dc1c851f..b3c067c9 100644
--- a/src/protocols/core/Compositor.hpp
+++ b/src/protocols/core/Compositor.hpp
@@ -169,6 +169,8 @@ class CWLCompositorProtocol : public IWaylandProtocol {
virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id);
+ void forEachSurface(std::function<void(SP<CWLSurfaceResource>)> fn);
+
struct {
CSignal newSurface; // SP<CWLSurfaceResource>
} events;
diff --git a/src/protocols/core/Output.cpp b/src/protocols/core/Output.cpp
index 3e68937f..e9f35abc 100644
--- a/src/protocols/core/Output.cpp
+++ b/src/protocols/core/Output.cpp
@@ -1,4 +1,6 @@
#include "Output.hpp"
+#include "Compositor.hpp"
+#include "../../Compositor.hpp"
#include "../../helpers/Monitor.hpp"
CWLOutputResource::CWLOutputResource(SP<CWlOutput> resource_, SP<CMonitor> pMonitor) : monitor(pMonitor), resource(resource_) {
@@ -27,6 +29,25 @@ CWLOutputResource::CWLOutputResource(SP<CWlOutput> resource_, SP<CMonitor> pMoni
}
updateState();
+
+ PROTO::compositor->forEachSurface([](SP<CWLSurfaceResource> surf) {
+ auto HLSurf = CWLSurface::fromResource(surf);
+
+ if (!HLSurf)
+ return;
+
+ const auto GEOMETRY = HLSurf->getSurfaceBoxGlobal();
+
+ if (!GEOMETRY.has_value())
+ return;
+
+ for (auto& m : g_pCompositor->m_vMonitors) {
+ if (!m->logicalBox().overlaps(*GEOMETRY))
+ continue;
+
+ surf->enter(m);
+ }
+ });
}
SP<CWLOutputResource> CWLOutputResource::fromResource(wl_resource* res) {