diff options
-rw-r--r-- | src/gui/kwindowconfig.cpp | 86 |
1 files changed, 59 insertions, 27 deletions
diff --git a/src/gui/kwindowconfig.cpp b/src/gui/kwindowconfig.cpp index 98fb5165..7a47b17a 100644 --- a/src/gui/kwindowconfig.cpp +++ b/src/gui/kwindowconfig.cpp @@ -32,6 +32,42 @@ static QString allConnectedScreens() return names.join(QLatin1Char(' ')); } +// Convenience function to get an appropriate config file key under which to +// save window size, position, or maximization information. +static QString configFileString(const QRect &desk, const QString &key) +{ + // We include resolution data to also save data on a per-resolution basis + const QString returnString = QStringLiteral("%1 %2 %3x%4").arg(allConnectedScreens()).arg(key).arg(desk.width()).arg(desk.height()); + return returnString; +} + +// Convenience function for "window is maximized" string +static QString screenMaximizedString(const QRect &desk) +{ + return configFileString(desk, QStringLiteral("Window-Maximized")); +} +// Convenience function for window width string +static QString windowWidthString(const QRect &desk) +{ + return configFileString(desk, QStringLiteral("Width")); +} +// Convenience function for window height string +static QString windowHeightString(const QRect &desk) +{ + return configFileString(desk, QStringLiteral("Height")); +} +// Convenience function for window X position string +static QString windowXPositionString(const QRect &desk) +{ + return configFileString(desk, QStringLiteral("XPosition")); +} +// Convenience function for window Y position string +static QString windowYPositionString(const QRect &desk) +{ + return configFileString(desk, QStringLiteral("YPosition")); +} + + void KWindowConfig::saveWindowSize(const QWindow *window, KConfigGroup &config, KConfigGroup::WriteConfigFlags options) { // QWindow::screen() shouldn't return null, but it sometimes does due to bugs. @@ -43,30 +79,23 @@ void KWindowConfig::saveWindowSize(const QWindow *window, KConfigGroup &config, const QSize sizeToSave = window->size(); const bool isMaximized = window->windowState() & Qt::WindowMaximized; - // Prepend the names of all connected screens so that we save the size - // on a per-screen-arrangement basis, since people often like to have - // windows laid out differently depending on their screen arrangements - const QString allScreens = allConnectedScreens(); - const QString screenMaximizedString(allScreens + QStringLiteral(" Window-Maximized %1x%2").arg(desk.width()).arg(desk.height())); // Save size only if window is not maximized if (!isMaximized) { const QSize defaultSize(window->property(s_initialSizePropertyName).toSize()); const QSize defaultScreenSize(window->property(s_initialScreenSizePropertyName).toSize()); const bool sizeValid = defaultSize.isValid() && defaultScreenSize.isValid(); if (!sizeValid || (sizeValid && (defaultSize != sizeToSave || defaultScreenSize != desk.size()))) { - const QString wString(allScreens + QStringLiteral(" Width %1").arg(desk.width())); - const QString hString(allScreens + QStringLiteral(" Height %1").arg(desk.height())); - config.writeEntry(wString, sizeToSave.width(), options); - config.writeEntry(hString, sizeToSave.height(), options); + config.writeEntry(windowWidthString(desk), sizeToSave.width(), options); + config.writeEntry(windowHeightString(desk), sizeToSave.height(), options); // Don't keep the maximized string in the file since the window is // no longer maximized at this point - config.deleteEntry(screenMaximizedString); + config.deleteEntry(screenMaximizedString(desk)); } } - if ((isMaximized == false) && !config.hasDefault(screenMaximizedString)) { - config.revertToDefault(screenMaximizedString); + if ((isMaximized == false) && !config.hasDefault(screenMaximizedString(desk))) { + config.revertToDefault(screenMaximizedString(desk)); } else { - config.writeEntry(screenMaximizedString, isMaximized, options); + config.writeEntry(screenMaximizedString(desk), isMaximized, options); } } @@ -81,13 +110,14 @@ void KWindowConfig::restoreWindowSize(QWindow *window, const KConfigGroup &confi // Fall back to non-per-screen-arrangement info if it's available but // per-screen-arrangement information is not + // TODO: Remove in KF6 or maybe even KF5.80 or something. It really only needs + // to be here to transition existing users once they upgrade from 5.73 -> 5.74 const int fallbackWidth = config.readEntry(QStringLiteral("Width %1").arg(desk.width()), window->size().width()); const int fallbackHeight = config.readEntry(QStringLiteral("Height %1").arg(desk.height()), window->size().height()); - const QString allScreens = allConnectedScreens(); - const int width = config.readEntry(allScreens + QStringLiteral(" Width %1").arg(desk.width()), fallbackWidth); - const int height = config.readEntry(allScreens + QStringLiteral(" Height %1").arg(desk.height()), fallbackHeight); - const bool isMaximized = config.readEntry(allScreens + QStringLiteral(" Window-Maximized %1x%2").arg(desk.width()).arg(desk.height()), false); + const int width = config.readEntry(windowWidthString(desk), fallbackWidth); + const int height = config.readEntry(windowHeightString(desk), fallbackHeight); + const bool isMaximized = config.readEntry(configFileString(desk, QStringLiteral("Window-Maximized")), false); // Check default size const QSize defaultSize(window->property(s_initialSizePropertyName).toSize()); @@ -112,12 +142,9 @@ void KWindowConfig::saveWindowPosition(const QWindow *window, KConfigGroup &conf 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 - const QString allScreens = allConnectedScreens(); - config.writeEntry(allScreens + QStringLiteral(" XPosition"), window->x(), options); - config.writeEntry(allScreens + QStringLiteral(" YPosition"), window->y(), options); + const QRect desk = window->screen()->geometry(); + config.writeEntry(windowXPositionString(desk), window->x(), options); + config.writeEntry(windowYPositionString(desk), window->y(), options); } void KWindowConfig::restoreWindowPosition(QWindow *window, const KConfigGroup &config) @@ -129,8 +156,7 @@ void KWindowConfig::restoreWindowPosition(QWindow *window, const KConfigGroup &c } const QRect desk = window->screen()->geometry(); - const QString allScreens = allConnectedScreens(); - const bool isMaximized = config.readEntry(allScreens + QStringLiteral(" Window-Maximized %1x%2").arg(desk.width()).arg(desk.height()), false); + const bool isMaximized = config.readEntry(configFileString(desk, QStringLiteral("Window-Maximized")), false); // Don't need to restore position if the window was maximized if (isMaximized) { @@ -138,8 +164,14 @@ void KWindowConfig::restoreWindowPosition(QWindow *window, const KConfigGroup &c return; } - const int xPos = config.readEntry(allScreens + QStringLiteral(" XPosition"), -1); - const int yPos = config.readEntry(allScreens + QStringLiteral(" YPosition"), -1); + // Fall back to non-per-resolution info if it's available but + // per-resolution information is not + // TODO: Remove in KF6 or maybe even KF5.85 or something. It really only needs + // to be here to transition existing users once they upgrade from 5.78 -> 5.79 + const int fallbackXPosition = config.readEntry(QStringLiteral("%1 XPosition %2").arg(allConnectedScreens()).arg(desk.width()), window->size().width()); + const int fallbackYPosition = config.readEntry(QStringLiteral("%1 YPosition %2").arg(allConnectedScreens()).arg(desk.height()), window->size().height()); + const int xPos = config.readEntry(windowXPositionString(desk), fallbackXPosition); + const int yPos = config.readEntry(windowYPositionString(desk), fallbackYPosition); if (xPos == -1 || yPos == -1) { return; |