From 08d4d987cf9e25332a358667332507fb3491ce9b Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 25 May 2022 18:40:03 +0200 Subject: return nearest mon if point out of range --- src/Compositor.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) (limited to 'src/Compositor.cpp') diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 76b0460e..82e2986e 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -246,29 +246,32 @@ SMonitor* CCompositor::getMonitorFromID(const int& id) { SMonitor* CCompositor::getMonitorFromCursor() { const auto COORDS = Vector2D(m_sWLRCursor->x, m_sWLRCursor->y); - const auto OUTPUT = wlr_output_layout_output_at(m_sWLROutputLayout, COORDS.x, COORDS.y); - if (!OUTPUT) { - Debug::log(WARN, "getMonitorFromCursor: cursor outside monitors??"); - return &m_lMonitors.front(); - } - - for (auto& m : m_lMonitors) { - if (m.output == OUTPUT) - return &m; - } - - Debug::log(LOG, "Monitor not in list??"); - - return &m_lMonitors.front(); + return getMonitorFromVector(COORDS); } SMonitor* CCompositor::getMonitorFromVector(const Vector2D& point) { const auto OUTPUT = wlr_output_layout_output_at(m_sWLROutputLayout, point.x, point.y); if (!OUTPUT) { - Debug::log(WARN, "getMonitorFromVector: vector outside monitors? Returning front"); - return &m_lMonitors.front(); + float bestDistance = 0.f; + SMonitor* pBestMon = nullptr; + + for (auto& m : m_lMonitors) { + float dist = vecToRectDistanceSquared(point, m.vecPosition, m.vecPosition + m.vecSize); + + if (dist < bestDistance || !pBestMon) { + bestDistance = dist; + pBestMon = &m; + } + } + + if (!pBestMon) { // ????? + Debug::log(WARN, "getMonitorFromVector no close mon???"); + return &m_lMonitors.front(); + } + + return pBestMon; } return getMonitorFromOutput(OUTPUT); -- cgit v1.2.3