From c061719d2e63c45dc2e126c8e36e9fe906a0bdfe Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 3 Sep 2019 15:20:25 +0200 Subject: fix for out-of-screen preview windows The problem was that the screen position was changed by the user and it did not check this before it set it to that saved position. Also added a warning if it is still happening - which is not expected anymore. Fixes: QTBUG-79323 Change-Id: Id3d945626461016d51fcad9f8882c3d39544a985 Reviewed-by: Ulf Hermann --- .../qmltooling/qmldbg_preview/qqmlpreviewposition.cpp | 17 +++++++++++------ .../qmltooling/qmldbg_preview/qqmlpreviewposition.h | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp index d4acd24da5..52e197b1ed 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp @@ -51,7 +51,7 @@ static QVector initScreensData() QVector screensData; for (QScreen *screen : QGuiApplication::screens()) { - QQmlPreviewPosition::ScreenData sd{screen->name(), screen->size()}; + QQmlPreviewPosition::ScreenData sd{screen->name(), screen->geometry()}; screensData.append(sd); } return screensData; @@ -69,20 +69,20 @@ static QScreen *findScreen(const QString &nameOfScreen) static QDataStream &operator<<(QDataStream &out, const QQmlPreviewPosition::ScreenData &screenData) { out << screenData.name; - out << screenData.size; + out << screenData.rect; return out; } static QDataStream &operator>>(QDataStream &in, QQmlPreviewPosition::ScreenData &screenData) { in >> screenData.name; - in >> screenData.size; + in >> screenData.rect; return in; } bool QQmlPreviewPosition::ScreenData::operator==(const QQmlPreviewPosition::ScreenData &other) const { - return other.size == size && other.name == name; + return other.rect == rect && other.name == name; } QQmlPreviewPosition::QQmlPreviewPosition() @@ -211,8 +211,13 @@ void QQmlPreviewPosition::setPosition(const QQmlPreviewPosition::Position &posit return; if (QScreen *screen = findScreen(position.screenName)) { window->setScreen(screen); - window->setFramePosition(QHighDpiScaling::mapPositionFromNative(position.nativePosition, - screen->handle())); + const auto point = QHighDpiScaling::mapPositionFromNative(position.nativePosition, + screen->handle()); + const QRect geometry(point, window->size()); + if (screen->virtualGeometry().contains(geometry)) + window->setFramePosition(point); + else + qWarning("preview position is out of screen"); } } diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.h b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.h index f403917f8c..9d84170948 100644 --- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.h +++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.h @@ -56,7 +56,7 @@ #include #include #include -#include +#include #include QT_BEGIN_NAMESPACE @@ -70,7 +70,7 @@ public: public: bool operator==(const QQmlPreviewPosition::ScreenData &other) const; QString name; - QSize size; + QRect rect; }; class Position { public: -- cgit v1.2.3