From 0cfdde3d1acbfbf698af17f6986fbc4d644214da Mon Sep 17 00:00:00 2001 From: Vaxry Date: Fri, 10 May 2024 23:28:33 +0100 Subject: xdg-shell: move to new impl --- src/desktop/Popup.cpp | 116 +++++++++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 68 deletions(-) (limited to 'src/desktop/Popup.cpp') diff --git a/src/desktop/Popup.cpp b/src/desktop/Popup.cpp index e172744d..605dfdfd 100644 --- a/src/desktop/Popup.cpp +++ b/src/desktop/Popup.cpp @@ -2,6 +2,7 @@ #include "../config/ConfigValue.hpp" #include "../Compositor.hpp" #include "../protocols/LayerShell.hpp" +#include "../protocols/XDGShell.hpp" #include CPopup::CPopup(PHLWINDOW pOwner) : m_pWindowOwner(pOwner) { @@ -12,14 +13,13 @@ CPopup::CPopup(PHLLS pOwner) : m_pLayerOwner(pOwner) { initAllSignals(); } -CPopup::CPopup(wlr_xdg_popup* popup, CPopup* pOwner) : m_pParent(pOwner), m_pWLR(popup) { - m_pWLR->base->data = this; - m_sWLSurface.assign(popup->base->surface, this); +CPopup::CPopup(SP popup, CPopup* pOwner) : m_pParent(pOwner), m_pResource(popup) { + m_sWLSurface.assign(popup->surface->surface, this); m_pLayerOwner = pOwner->m_pLayerOwner; m_pWindowOwner = pOwner->m_pWindowOwner; - m_vLastSize = {m_pWLR->current.geometry.width, m_pWLR->current.geometry.height}; + m_vLastSize = popup->surface->current.geometry.size(); unconstrain(); initAllSignals(); @@ -27,71 +27,32 @@ CPopup::CPopup(wlr_xdg_popup* popup, CPopup* pOwner) : m_pParent(pOwner), m_pWLR CPopup::~CPopup() { m_sWLSurface.unassign(); - if (m_pWLR) - m_pWLR->base->data = nullptr; - - hyprListener_commitPopup.removeCallback(); - hyprListener_repositionPopup.removeCallback(); - hyprListener_mapPopup.removeCallback(); - hyprListener_unmapPopup.removeCallback(); - hyprListener_newPopup.removeCallback(); - hyprListener_destroyPopup.removeCallback(); -} - -static void onNewPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onNewPopup((wlr_xdg_popup*)data); -} - -static void onMapPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onMap(); -} - -static void onDestroyPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onDestroy(); -} - -static void onUnmapPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onUnmap(); -} - -static void onCommitPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onCommit(); -} - -static void onRepositionPopup(void* owner, void* data) { - const auto POPUP = (CPopup*)owner; - POPUP->onReposition(); } void CPopup::initAllSignals() { - if (!m_pWLR) { + if (!m_pResource) { if (!m_pWindowOwner.expired()) - hyprListener_newPopup.initCallback(&m_pWindowOwner->m_uSurface.xdg->events.new_popup, ::onNewPopup, this, "CPopup Head"); + listeners.newPopup = m_pWindowOwner->m_pXDGSurface->events.newPopup.registerListener([this](std::any d) { this->onNewPopup(std::any_cast>(d)); }); else if (!m_pLayerOwner.expired()) - listeners.newPopup = m_pLayerOwner->layerSurface->events.newPopup.registerListener([this](std::any d) { this->onNewPopup(std::any_cast(d)); }); + listeners.newPopup = m_pLayerOwner->layerSurface->events.newPopup.registerListener([this](std::any d) { this->onNewPopup(std::any_cast>(d)); }); else ASSERT(false); return; } - hyprListener_repositionPopup.initCallback(&m_pWLR->events.reposition, ::onRepositionPopup, this, "CPopup"); - hyprListener_destroyPopup.initCallback(&m_pWLR->events.destroy, ::onDestroyPopup, this, "CPopup"); - hyprListener_mapPopup.initCallback(&m_sWLSurface.wlr()->events.map, ::onMapPopup, this, "CPopup"); - hyprListener_unmapPopup.initCallback(&m_sWLSurface.wlr()->events.unmap, ::onUnmapPopup, this, "CPopup"); - hyprListener_commitPopup.initCallback(&m_sWLSurface.wlr()->events.commit, ::onCommitPopup, this, "CPopup"); - hyprListener_newPopup.initCallback(&m_pWLR->base->events.new_popup, ::onNewPopup, this, "CPopup"); + listeners.reposition = m_pResource->events.reposition.registerListener([this](std::any d) { this->onReposition(); }); + listeners.map = m_pResource->surface->events.map.registerListener([this](std::any d) { this->onMap(); }); + listeners.unmap = m_pResource->surface->events.unmap.registerListener([this](std::any d) { this->onUnmap(); }); + listeners.destroy = m_pResource->surface->events.destroy.registerListener([this](std::any d) { this->onDestroy(); }); + listeners.commit = m_pResource->surface->events.commit.registerListener([this](std::any d) { this->onCommit(); }); + listeners.newPopup = m_pResource->surface->events.newPopup.registerListener([this](std::any d) { this->onNewPopup(std::any_cast>(d)); }); } -void CPopup::onNewPopup(wlr_xdg_popup* popup) { +void CPopup::onNewPopup(SP popup) { const auto POPUP = m_vChildren.emplace_back(std::make_unique(popup, this)).get(); - Debug::log(LOG, "New popup at wlr {:x} and hl {:x}", (uintptr_t)popup, (uintptr_t)POPUP); + Debug::log(LOG, "New popup at {:x}", (uintptr_t)POPUP); } void CPopup::onDestroy() { @@ -104,7 +65,7 @@ void CPopup::onDestroy() { } void CPopup::onMap() { - m_vLastSize = {m_pWLR->base->current.geometry.width, m_pWLR->base->current.geometry.height}; + m_vLastSize = {m_pResource->surface->surface->current.width, m_pResource->surface->surface->current.height}; const auto COORDS = coordsGlobal(); CBox box; @@ -126,7 +87,9 @@ void CPopup::onMap() { } void CPopup::onUnmap() { - m_vLastSize = {m_pWLR->base->current.geometry.width, m_pWLR->base->current.geometry.height}; + if (!m_pResource || !m_pResource->surface) + return; + m_vLastSize = {m_pResource->surface->surface->current.width, m_pResource->surface->surface->current.height}; const auto COORDS = coordsGlobal(); CBox box; @@ -140,16 +103,27 @@ void CPopup::onUnmap() { if (!m_pLayerOwner.expired() && m_pLayerOwner->layer < ZWLR_LAYER_SHELL_V1_LAYER_TOP) g_pHyprOpenGL->markBlurDirtyForMonitor(g_pCompositor->getMonitorFromID(m_pLayerOwner->layer)); + + // damage all children + breadthfirst( + [this](CPopup* p, void* data) { + if (!p->m_pResource) + return; + + auto box = CBox{p->coordsGlobal(), p->size()}; + g_pHyprRenderer->damageBox(&box); + }, + nullptr); } void CPopup::onCommit(bool ignoreSiblings) { - if (m_pWLR->base->initial_commit) { - wlr_xdg_surface_schedule_configure(m_pWLR->base); + if (m_pResource->surface->initialCommit) { + m_pResource->surface->scheduleConfigure(); return; } if (!m_pWindowOwner.expired() && (!m_pWindowOwner->m_bIsMapped || !m_pWindowOwner->m_pWorkspace->m_bVisible)) { - m_vLastSize = {m_pWLR->base->current.geometry.width, m_pWLR->base->current.geometry.height}; + m_vLastSize = {m_pResource->surface->surface->current.width, m_pResource->surface->surface->current.height}; static auto PLOGDAMAGE = CConfigValue("debug:log_damage"); if (*PLOGDAMAGE) @@ -157,16 +131,17 @@ void CPopup::onCommit(bool ignoreSiblings) { return; } - if (!m_pWLR->base->surface->mapped) + if (!m_pResource->surface->mapped) return; const auto COORDS = coordsGlobal(); const auto COORDSLOCAL = coordsRelativeToParent(); - if (m_vLastSize != Vector2D{m_pWLR->base->current.geometry.width, m_pWLR->base->current.geometry.height} || m_bRequestedReposition || m_vLastPos != COORDSLOCAL) { + if (m_vLastSize != Vector2D{m_pResource->surface->surface->current.width, m_pResource->surface->surface->current.height} || m_bRequestedReposition || + m_vLastPos != COORDSLOCAL) { CBox box = {localToGlobal(m_vLastPos), m_vLastSize}; g_pHyprRenderer->damageBox(&box); - m_vLastSize = {m_pWLR->base->current.geometry.width, m_pWLR->base->current.geometry.height}; + m_vLastSize = {m_pResource->surface->surface->current.width, m_pResource->surface->surface->current.height}; box = {COORDS, m_vLastSize}; g_pHyprRenderer->damageBox(&box); @@ -202,20 +177,25 @@ void CPopup::unconstrain() { return; CBox box = {PMONITOR->vecPosition.x - COORDS.x, PMONITOR->vecPosition.y - COORDS.y, PMONITOR->vecSize.x, PMONITOR->vecSize.y}; - wlr_xdg_popup_unconstrain_from_box(m_pWLR, box.pWlr()); + m_pResource->applyPositioning(box, COORDS - PMONITOR->vecPosition); + wlr_surface_send_enter(m_pResource->surface->surface, PMONITOR->output); } Vector2D CPopup::coordsRelativeToParent() { Vector2D offset; - CPopup* current = this; + if (!m_pResource) + return {}; + + CPopup* current = this; + offset -= current->m_pResource->surface->current.geometry.pos(); - offset -= {m_pWLR->base->current.geometry.x, m_pWLR->base->current.geometry.y}; + offset -= m_pResource->surface->current.geometry.pos(); - while (current->m_pParent) { + while (current->m_pParent && current->m_pResource) { offset += {current->m_sWLSurface.wlr()->current.dx, current->m_sWLSurface.wlr()->current.dy}; - offset += {current->m_pWLR->current.geometry.x, current->m_pWLR->current.geometry.y}; + offset += current->m_pResource->geometry.pos(); current = current->m_pParent; } @@ -309,7 +289,7 @@ CPopup* CPopup::at(const Vector2D& globalCoords, bool allowsInput) { breadthfirst([](CPopup* popup, void* data) { ((std::vector*)data)->push_back(popup); }, &popups); for (auto& p : popups | std::views::reverse) { - if (!p->m_pWLR) + if (!p->m_pResource) continue; if (!allowsInput) { -- cgit v1.2.3