From c35517d44e983524760109ea7864c2ace91e5f9e Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 24 Apr 2022 17:53:50 +0200 Subject: [PATCH] fixes for xwayland popups, autofloat pop-up and task_dialog --- src/Compositor.cpp | 9 +++++++++ src/Compositor.hpp | 1 + src/layout/DwindleLayout.cpp | 4 ++-- src/managers/XWaylandManager.cpp | 11 +++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 43263dd4b..8cdd98895 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -761,3 +761,12 @@ CWorkspace* CCompositor::getWorkspaceByString(const std::string& str) { return nullptr; } + +bool CCompositor::isPointOnAnyMonitor(const Vector2D& point) { + for (auto& m : m_lMonitors) { + if (VECINRECT(point, m.vecPosition.x, m.vecPosition.y, m.vecSize.x + m.vecPosition.x, m.vecSize.y + m.vecPosition.y)) + return true; + } + + return false; +} \ No newline at end of file diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 2fff50782..71e0f310f 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -111,6 +111,7 @@ public: void deactivateAllWLRWorkspaces(); CWindow* getNextWindowOnWorkspace(CWindow*); int getNextAvailableNamedWorkspace(); + bool isPointOnAnyMonitor(const Vector2D&); private: void initAllSignals(); diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 8a6bd6d90..15fa1c44d 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -551,8 +551,8 @@ void CHyprDwindleLayout::onWindowCreatedFloating(CWindow* pWindow) { // check if it's on the correct monitor! Vector2D middlePoint = Vector2D(desiredGeometry.x, desiredGeometry.y) + Vector2D(desiredGeometry.width, desiredGeometry.height) / 2.f; - // TODO: detect a popup in a more consistent way. - if ((g_pCompositor->getMonitorFromVector(middlePoint) && g_pCompositor->getMonitorFromVector(middlePoint)->ID != pWindow->m_iMonitorID) || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) { + // TODO: detect a popup in a more consistent way. + if (!g_pCompositor->isPointOnAnyMonitor(middlePoint) || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) { // if it's not, fall back to the center placement pWindow->m_vRealPosition = PMONITOR->vecPosition + Vector2D((PMONITOR->vecSize.x - desiredGeometry.width) / 2.f, (PMONITOR->vecSize.y - desiredGeometry.height) / 2.f); } else { diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp index 9efefc758..5e8e9680e 100644 --- a/src/managers/XWaylandManager.cpp +++ b/src/managers/XWaylandManager.cpp @@ -145,6 +145,17 @@ bool CHyprXWaylandManager::shouldBeFloated(CWindow* pWindow) { return true; } + if (pWindow->m_uSurface.xwayland->role) { + try { + std::string winrole = std::string(pWindow->m_uSurface.xwayland->role); + if (winrole.find("pop-up") != std::string::npos || winrole.find("task_dialog") != std::string::npos) { + return true; + } + } catch (std::exception& e) { + Debug::log(ERR, "Error in shouldBeFloated, winrole threw %s", e.what()); + } + } + if (pWindow->m_uSurface.xwayland->modal) { pWindow->m_bIsModal = true; return true;