diff --git a/src/common/config.cpp b/src/common/config.cpp index 249a05871482693ca840319676344b7cdcb0fcac..4b15d42c19469244f86b1801f24b12d2008be8db 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -45,6 +45,16 @@ enum class GeometryAction { Restore }; +QPoint mousePos() +{ + // On Wayland, getting mouse position can return + // the last known mouse position in an own Qt application window. + static const bool supported = !QCursor::pos().isNull(); + if (supported) + return QCursor::pos(); + return QPoint(); +} + QString toString(const QRect &geometry) { return QString::fromLatin1("%1x%2,%3,%4") @@ -56,9 +66,28 @@ QString toString(const QRect &geometry) int screenNumber(const QWidget &widget, GeometryAction geometryAction) { - return geometryAction == GeometryAction::Save - ? QApplication::desktop()->screenNumber(&widget) - : screenNumberAt(QCursor::pos()); + if (geometryAction == GeometryAction::Restore) { + const QPoint pos = mousePos(); + if ( !pos.isNull() ) { + const int n = screenNumberAt(pos); + if (n != -1) + return n; + } + } + + QWindow *windowHandle = widget.windowHandle(); + if (windowHandle) { + QScreen *screen = windowHandle->screen(); + if (screen) + return QGuiApplication::screens().indexOf(screen); + } + + const int n = QApplication::desktop()->screenNumber(&widget); + if (n != -1) + return n; + + QScreen *screen = QGuiApplication::primaryScreen(); + return QGuiApplication::screens().indexOf(screen); } QString geometryOptionName(const QWidget &widget, GeometryAction geometryAction, bool openOnCurrentScreen) @@ -192,7 +221,7 @@ void restoreWindowGeometry(QWidget *w, bool openOnCurrentScreen) // If geometry for the screen doesn't exist, move window to the middle of the screen. if (geometry.isEmpty()) { - const QRect availableGeometry = screenAvailableGeometry(QCursor::pos()); + const QRect availableGeometry = screenAvailableGeometry(w->pos()); const QPoint position = availableGeometry.center() - w->rect().center(); w->move(position); } diff --git a/src/gui/windowgeometryguard.cpp b/src/gui/windowgeometryguard.cpp index 3abd5503c3691649510ccc8a6219bed0c971c60a..eb4f8261af80ee7e62a52e34e238aaa0ab705dbc 100644 --- a/src/gui/windowgeometryguard.cpp +++ b/src/gui/windowgeometryguard.cpp @@ -27,7 +27,9 @@ #include <QApplication> #include <QEvent> #include <QMoveEvent> +#include <QScreen> #include <QVariant> +#include <QWindow> namespace { @@ -53,6 +55,11 @@ bool WindowGeometryGuard::eventFilter(QObject *, QEvent *event) m_timerSaveGeometry.stop(); m_timerRestoreGeometry.start(); } + if (!m_screenChangeConnected && m_window->windowHandle()) { + m_screenChangeConnected = true; + connect(m_window->windowHandle(), &QWindow::screenChanged, + this, &WindowGeometryGuard::onScreenChanged); + } break; case QEvent::Move: @@ -121,3 +128,9 @@ void WindowGeometryGuard::unlockWindowGeometry() { m_timerUnlockGeometry.stop(); } + +void WindowGeometryGuard::onScreenChanged() +{ + m_timerUnlockGeometry.stop(); + restoreWindowGeometry(); +} diff --git a/src/gui/windowgeometryguard.h b/src/gui/windowgeometryguard.h index 8720529e596e535db26ad528125d233488942c74..bd51371073ca64b82cbb0bf39856c816c7f0a675 100644 --- a/src/gui/windowgeometryguard.h +++ b/src/gui/windowgeometryguard.h @@ -41,11 +41,15 @@ private: void restoreWindowGeometry(); void unlockWindowGeometry(); + void onScreenChanged(); + QWidget *m_window; QTimer m_timerSaveGeometry; QTimer m_timerRestoreGeometry; QTimer m_timerUnlockGeometry; + + bool m_screenChangeConnected = false; }; #endif // WINDOWGEOMETRYGUARD_H