From db249648776875ce3142141d0d3055e43ce606aa Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 15 Dec 2024 00:37:17 +0100 Subject: xwayland: Support cross DnD from Wayland (#8708) Adds support for drag-and-drop from Wayland clients to XWayland ones --- src/managers/XWaylandManager.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/managers/XWaylandManager.cpp') diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp index 832173eb..5e5c6262 100644 --- a/src/managers/XWaylandManager.cpp +++ b/src/managers/XWaylandManager.cpp @@ -213,6 +213,36 @@ void CHyprXWaylandManager::setWindowFullscreen(PHLWINDOW pWindow, bool fullscree pWindow->m_pXDGSurface->toplevel->setFullscreen(fullscreen); } +Vector2D CHyprXWaylandManager::waylandToXWaylandCoords(const Vector2D& coord) { + static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); + + PHLMONITOR pMonitor = nullptr; + double bestDistance = __FLT_MAX__; + for (const auto& m : g_pCompositor->m_vMonitors) { + const auto SIZ = *PXWLFORCESCALEZERO ? m->vecTransformedSize : m->vecSize; + + double distance = vecToRectDistanceSquared(coord, {m->vecPosition.x, m->vecPosition.y}, {m->vecPosition.x + SIZ.x - 1, m->vecPosition.y + SIZ.y - 1}); + + if (distance < bestDistance) { + bestDistance = distance; + pMonitor = m; + } + } + + if (!pMonitor) + return Vector2D{}; + + // get local coords + Vector2D result = coord - pMonitor->vecPosition; + // if scaled, scale + if (*PXWLFORCESCALEZERO) + result *= pMonitor->scale; + // add pos + result += pMonitor->vecXWaylandPosition; + + return result; +} + Vector2D CHyprXWaylandManager::xwaylandToWaylandCoords(const Vector2D& coord) { static auto PXWLFORCESCALEZERO = CConfigValue("xwayland:force_zero_scaling"); -- cgit v1.2.3