diff options
-rw-r--r-- | src/gui/kwindowconfig.cpp | 58 | ||||
-rw-r--r-- | src/gui/kwindowconfig.h | 27 |
2 files changed, 85 insertions, 0 deletions
diff --git a/src/gui/kwindowconfig.cpp b/src/gui/kwindowconfig.cpp index 2f787a2f..07f1a307 100644 --- a/src/gui/kwindowconfig.cpp +++ b/src/gui/kwindowconfig.cpp @@ -7,6 +7,7 @@ #include "kwindowconfig.h" +#include <QGuiApplication> #include <QScreen> #include <QWindow> @@ -71,3 +72,60 @@ void KWindowConfig::restoreWindowSize(QWindow *window, const KConfigGroup &confi window->setWindowState(Qt::WindowMaximized); } } + +void KWindowConfig::saveWindowPosition(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options) +{ + // On Wayland, the compositor is solely responsible for window positioning, + // So this needs to be a no-op + if (!window || QGuiApplication::platformName() == QStringLiteral("wayland")) { + return; + } + + // Prepend the names of all connected screens so that we save the position + // on a per-screen-arrangement basis, since people often like to have + // windows positioned differently depending on their screen arrangements + QStringList names; + const auto screens = QGuiApplication::screens(); + names.reserve(screens.length()); + for (auto screen : screens) { + names << screen->name(); + } + const QString allScreens = names.join(QStringLiteral(" ")); + config.writeEntry(allScreens + QStringLiteral(" XPosition"), window->x(), options); + config.writeEntry(allScreens + QStringLiteral(" YPosition"), window->y(), options); +} + +void KWindowConfig::restoreWindowPosition(QWindow *window, const KConfigGroup &config) +{ + // On Wayland, the compositor is solely responsible for window positioning, + // So this needs to be a no-op + if (!window || QGuiApplication::platformName() == QStringLiteral("wayland")) { + return; + } + + const QRect desk = window->screen()->geometry(); + const bool isMaximized = config.readEntry(QStringLiteral("Window-Maximized %1x%2").arg(desk.height()).arg(desk.width()), false); + + // Don't need to restore position if the window was maximized + if (isMaximized) { + window->setWindowState(Qt::WindowMaximized); + return; + } + + QStringList names; + const auto screens = QGuiApplication::screens(); + names.reserve(screens.length()); + for (auto screen : screens) { + names << screen->name(); + } + const QString allScreens = names.join(QStringLiteral(" ")); + const int xPos = config.readEntry(allScreens + QStringLiteral(" XPosition"), -1); + const int yPos = config.readEntry(allScreens + QStringLiteral(" YPosition"), -1); + + if (xPos == -1 || yPos == -1) { + return; + } + + window->setX(xPos); + window->setY(yPos); +} diff --git a/src/gui/kwindowconfig.h b/src/gui/kwindowconfig.h index ad03f3ef..04af27d1 100644 --- a/src/gui/kwindowconfig.h +++ b/src/gui/kwindowconfig.h @@ -55,6 +55,33 @@ KCONFIGGUI_EXPORT void saveWindowSize(const QWindow *window, KConfigGroup &confi * @since 5.0. */ KCONFIGGUI_EXPORT void restoreWindowSize(QWindow *window, const KConfigGroup &config); + +/** + * Saves the window's position either to the global or application config file. + * This function has no effect on Wayland, where the compositor is responsible + * for window positioning. + * + * @note the group must be set before calling + * + * @param window The window whose position to save. + * @param config The config group to read from. + * @param options passed to KConfigGroup::writeEntry() + * @since 5.74 + */ +KCONFIGGUI_EXPORT void saveWindowPosition(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options = KConfigGroup::Normal); + +/** + * Restores the window's position from the configuration. + * This function has no effect on Wayland, where the compositor is responsible + * for window positioning. + * + * @note the group must be set before calling + * + * @param window The window whose position to restore. + * @param config The config group to read from. + * @since 5.74 + */ +KCONFIGGUI_EXPORT void restoreWindowPosition(QWindow *window, const KConfigGroup &config); } #endif // KWINDOWCONFIG_H |