From 635a02d83fe9d598cf5f6aba47e672647608fb76 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Thu, 9 May 2024 21:47:21 +0100 Subject: layer-shell: move to new impl Also bumps the hw-s dep --- src/desktop/Popup.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'src/desktop/Popup.cpp') diff --git a/src/desktop/Popup.cpp b/src/desktop/Popup.cpp index 73a29560..f1517083 100644 --- a/src/desktop/Popup.cpp +++ b/src/desktop/Popup.cpp @@ -1,6 +1,8 @@ #include "Popup.hpp" #include "../config/ConfigValue.hpp" #include "../Compositor.hpp" +#include "../protocols/LayerShell.hpp" +#include CPopup::CPopup(PHLWINDOW pOwner) : m_pWindowOwner(pOwner) { initAllSignals(); @@ -72,7 +74,7 @@ void CPopup::initAllSignals() { if (!m_pWindowOwner.expired()) hyprListener_newPopup.initCallback(&m_pWindowOwner->m_uSurface.xdg->events.new_popup, ::onNewPopup, this, "CPopup Head"); else if (!m_pLayerOwner.expired()) - hyprListener_newPopup.initCallback(&m_pLayerOwner->layerSurface->events.new_popup, ::onNewPopup, this, "CPopup Head"); + listeners.newPopup = m_pLayerOwner->layerSurface->events.newPopup.registerListener([this](std::any d) { this->onNewPopup(std::any_cast(d)); }); else ASSERT(false); @@ -278,3 +280,46 @@ bool CPopup::visible() { return false; } + +void CPopup::bfHelper(std::vector nodes, std::function fn, void* data) { + for (auto& n : nodes) { + fn(n, data); + } + + std::vector nodes2; + + for (auto& n : nodes) { + for (auto& c : n->m_vChildren) { + nodes2.push_back(c.get()); + } + } + + bfHelper(nodes2, fn, data); +} + +void CPopup::breadthfirst(std::function fn, void* data) { + std::vector popups; + popups.push_back(this); +} + +CPopup* CPopup::at(const Vector2D& globalCoords, bool allowsInput) { + std::vector popups; + breadthfirst([](CPopup* popup, void* data) { ((std::vector*)data)->push_back(popup); }, &popups); + + for (auto& p : popups | std::views::reverse) { + if (!p->m_pWLR) + continue; + + if (!allowsInput) { + const auto BOX = CBox{p->coordsGlobal(), p->size()}; + if (BOX.containsPoint(globalCoords)) + return p; + } else { + const auto REGION = CRegion{&m_sWLSurface.wlr()->current.input}.translate(p->coordsGlobal()); + if (REGION.containsPoint(globalCoords)) + return p; + } + } + + return nullptr; +} -- cgit v1.2.3