From 4986d74ef201171a930c312a8e3b72a22d9b84ee Mon Sep 17 00:00:00 2001 From: vaxerski Date: Tue, 15 Aug 2023 20:09:32 +0200 Subject: [PATCH] xwayland: fix use of xwayland coords in native spaces --- src/events/Windows.cpp | 8 +++++--- src/layout/IHyprLayout.cpp | 17 +++++++++++------ src/managers/XWaylandManager.cpp | 29 ++++++++++++++++++++++++++++- src/managers/XWaylandManager.hpp | 1 + 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index a45aa91e6..211f6ed33 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -413,8 +413,8 @@ void Events::listener_mapWindow(void* owner, void* data) { PWINDOW->setHidden(false); } catch (...) { Debug::log(LOG, "Rule move failed, rule: %s -> %s", r.szRule.c_str(), r.szValue.c_str()); } } else if (r.szRule.find("center") == 0) { - auto RESERVEDOFFSET = Vector2D(); - const auto ARGS = CVarList(r.szRule, 2, ' '); + auto RESERVEDOFFSET = Vector2D(); + const auto ARGS = CVarList(r.szRule, 2, ' '); if (ARGS[1] == "1") RESERVEDOFFSET = (PMONITOR->vecReservedTopLeft - PMONITOR->vecReservedBottomRight) / 2.f; @@ -994,7 +994,9 @@ void Events::listener_configureX11(void* owner, void* data) { else PWINDOW->setHidden(true); - PWINDOW->m_vRealPosition.setValueAndWarp(Vector2D(E->x, E->y)); + const auto LOGICALPOS = g_pXWaylandManager->xwaylandToWaylandCoords({E->x, E->y}); + + PWINDOW->m_vRealPosition.setValueAndWarp(LOGICALPOS); PWINDOW->m_vRealSize.setValueAndWarp(Vector2D(E->width, E->height)); static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue; diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp index f39b190a0..2e3f690fd 100644 --- a/src/layout/IHyprLayout.cpp +++ b/src/layout/IHyprLayout.cpp @@ -77,7 +77,14 @@ void IHyprLayout::onWindowRemovedFloating(CWindow* pWindow) { void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) { wlr_box desiredGeometry = {0}; g_pXWaylandManager->getGeometryForWindow(pWindow, &desiredGeometry); - const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID); + const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID); + + if (pWindow->m_bIsX11) { + Vector2D xy = {desiredGeometry.x, desiredGeometry.y}; + xy = g_pXWaylandManager->xwaylandToWaylandCoords(xy); + desiredGeometry.x = xy.x; + desiredGeometry.y = xy.y; + } static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue; @@ -103,7 +110,7 @@ void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) { if (pWindow->m_bIsX11 && pWindow->m_uSurface.xwayland->override_redirect) { if (pWindow->m_uSurface.xwayland->x != 0 && pWindow->m_uSurface.xwayland->y != 0) - pWindow->m_vRealPosition = Vector2D{pWindow->m_uSurface.xwayland->x, pWindow->m_uSurface.xwayland->y}; + pWindow->m_vRealPosition = g_pXWaylandManager->xwaylandToWaylandCoords({pWindow->m_uSurface.xwayland->x, pWindow->m_uSurface.xwayland->y}); else pWindow->m_vRealPosition = Vector2D(PMONITOR->vecPosition.x + (PMONITOR->vecSize.x - pWindow->m_vRealSize.goalv().x) / 2.f, PMONITOR->vecPosition.y + (PMONITOR->vecSize.y - pWindow->m_vRealSize.goalv().y) / 2.f); @@ -153,10 +160,8 @@ void IHyprLayout::onWindowCreatedFloating(CWindow* pWindow) { } } - if (*PXWLFORCESCALEZERO && pWindow->m_bIsX11) { - pWindow->m_vRealSize = pWindow->m_vRealSize.goalv() / PMONITOR->scale; - pWindow->m_vRealPosition = pWindow->m_vRealPosition.goalv() / PMONITOR->scale; - } + if (*PXWLFORCESCALEZERO && pWindow->m_bIsX11) + pWindow->m_vRealSize = pWindow->m_vRealSize.goalv() / PMONITOR->scale; if (pWindow->m_bX11DoesntWantBorders || (pWindow->m_bIsX11 && pWindow->m_uSurface.xwayland->override_redirect)) { pWindow->m_vRealPosition.warp(); diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp index fcd642804..5820f9a3c 100644 --- a/src/managers/XWaylandManager.cpp +++ b/src/managers/XWaylandManager.cpp @@ -308,4 +308,31 @@ Vector2D CHyprXWaylandManager::getMaxSizeForWindow(CWindow* pWindow) { MAXSIZE.y = 99999; return MAXSIZE; -} \ No newline at end of file +} + +Vector2D CHyprXWaylandManager::xwaylandToWaylandCoords(const Vector2D& coord) { + + static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue; + + CMonitor* pMonitor = nullptr; + for (auto& m : g_pCompositor->m_vMonitors) { + const auto SIZ = *PXWLFORCESCALEZERO ? m->vecTransformedSize : m->vecSize; + if (VECINRECT(coord, m->vecXWaylandPosition.x, m->vecXWaylandPosition.y, SIZ.x, SIZ.y)) { + pMonitor = m.get(); + break; + } + } + + if (!pMonitor) + return Vector2D{}; + + // get local coords + Vector2D result = coord - pMonitor->vecXWaylandPosition; + // if scaled, unscale + if (*PXWLFORCESCALEZERO) + result = result / pMonitor->scale; + // add pos + result = result + pMonitor->vecPosition; + + return result; +} diff --git a/src/managers/XWaylandManager.hpp b/src/managers/XWaylandManager.hpp index 27bce17d4..28ae67cc5 100644 --- a/src/managers/XWaylandManager.hpp +++ b/src/managers/XWaylandManager.hpp @@ -26,6 +26,7 @@ class CHyprXWaylandManager { void moveXWaylandWindow(CWindow*, const Vector2D&); void checkBorders(CWindow*); Vector2D getMaxSizeForWindow(CWindow*); + Vector2D xwaylandToWaylandCoords(const Vector2D&); }; inline std::unique_ptr g_pXWaylandManager; \ No newline at end of file