From d71e4ec9f0813b7087af10126468e58f95c123a2 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 18 Feb 2025 13:14:20 +0300 Subject: [PATCH 1/2] Editor: Fall back to the closest screen when necessary (#8354) --- apps/opencs/view/doc/view.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 7ee8092df6..67297b3433 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -1164,23 +1164,31 @@ void CSVDoc::View::onRequestFocus(const std::string& id) QScreen* CSVDoc::View::getWidgetScreen(const QPoint& position) { QScreen* screen = QApplication::screenAt(position); - if (screen == nullptr) + if (screen) + return screen; + + const QList screens = QApplication::screens(); + if (screens.isEmpty()) + throw std::runtime_error("No screens available"); + + int closestDistance = std::numeric_limits::max(); + for (QScreen* candidate : screens) { - QPoint clampedPosition = position; + const QRect geometry = candidate->geometry(); + const int dx = position.x() - std::clamp(position.x(), geometry.left(), geometry.right()); + const int dy = position.y() - std::clamp(position.y(), geometry.top(), geometry.bottom()); + const int distance = dx * dx + dy * dy; - // If we failed to find the screen, - // clamp negative positions and try again - if (clampedPosition.x() <= 0) - clampedPosition.setX(0); - if (clampedPosition.y() <= 0) - clampedPosition.setY(0); - - screen = QApplication::screenAt(clampedPosition); + if (distance < closestDistance) + { + closestDistance = distance; + screen = candidate; + } } if (screen == nullptr) throw std::runtime_error( - Misc::StringUtils::format("Can not detect the screen for position [%d, %d]", position.x(), position.y())); + Misc::StringUtils::format("Cannot detect the screen for position [%d, %d]", position.x(), position.y())); return screen; } From 04689334c599a5459688721efb38b4ddb0185035 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 18 Feb 2025 22:28:54 +0300 Subject: [PATCH 2/2] Editor: Use the first/primary screen as last resort --- apps/opencs/view/doc/view.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/opencs/view/doc/view.cpp b/apps/opencs/view/doc/view.cpp index 67297b3433..afcab50ead 100644 --- a/apps/opencs/view/doc/view.cpp +++ b/apps/opencs/view/doc/view.cpp @@ -1187,8 +1187,7 @@ QScreen* CSVDoc::View::getWidgetScreen(const QPoint& position) } if (screen == nullptr) - throw std::runtime_error( - Misc::StringUtils::format("Cannot detect the screen for position [%d, %d]", position.x(), position.y())); + screen = screens.first(); return screen; }