diff options
Diffstat (limited to 'src')
| -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 | 
