summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-25 18:40:03 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-25 18:40:03 +0200
commit08d4d987cf9e25332a358667332507fb3491ce9b (patch)
tree52dfe1c2fd9bf142b4247e0dfdb3e8ec1ae79ef2 /src/Compositor.cpp
parent5635c6385f7bc99c415ef76b3c1b83a210073224 (diff)
return nearest mon if point out of range
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp35
1 files changed, 19 insertions, 16 deletions
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);