diff --git a/components/shellsettingsplugin/mobileshellsettings.cpp b/components/shellsettingsplugin/mobileshellsettings.cpp index 29ff0077..d1ed6e45 100644 --- a/components/shellsettingsplugin/mobileshellsettings.cpp +++ b/components/shellsettingsplugin/mobileshellsettings.cpp @@ -46,6 +46,7 @@ MobileShellSettings::MobileShellSettings(QObject *parent) Q_EMIT autoHidePanelsEnabledChanged(); Q_EMIT gamingModeEnabledChanged(); Q_EMIT gamingDismissHintEnabledChanged(); + Q_EMIT dynamicTilingEnabledChanged(); Q_EMIT allowLogoutChanged(); } if (group.name() == LOCKSCREEN_CONFIG_GROUP) { @@ -276,6 +277,19 @@ void MobileShellSettings::setGamingDismissHintEnabled(bool enabled) m_config->sync(); } +bool MobileShellSettings::dynamicTilingEnabled() const +{ + auto group = KConfigGroup{m_config, GENERAL_CONFIG_GROUP}; + return group.readEntry("dynamicTilingEnabled", true); +} + +void MobileShellSettings::setDynamicTilingEnabled(bool enabled) +{ + auto group = KConfigGroup{m_config, GENERAL_CONFIG_GROUP}; + group.writeEntry("dynamicTilingEnabled", enabled, KConfigGroup::Notify); + m_config->sync(); +} + void MobileShellSettings::updateNavigationBarsInPlasma() { // Do not update panels when not in Plasma Mobile diff --git a/components/shellsettingsplugin/mobileshellsettings.h b/components/shellsettingsplugin/mobileshellsettings.h index a88d96d3..0e5d68a2 100644 --- a/components/shellsettingsplugin/mobileshellsettings.h +++ b/components/shellsettingsplugin/mobileshellsettings.h @@ -56,6 +56,10 @@ class MobileShellSettings : public QObject Q_PROPERTY(bool gamingModeEnabled READ gamingModeEnabled WRITE setGamingModeEnabled NOTIFY gamingModeEnabledChanged) Q_PROPERTY(bool gamingDismissHintEnabled READ gamingDismissHintEnabled WRITE setGamingDismissHintEnabled NOTIFY gamingDismissHintEnabledChanged) + // Dynamic (BSP) window tiling — only meaningful in convergence mode. + // When false, KWin's native quick-tile behaviour is used unmodified. + Q_PROPERTY(bool dynamicTilingEnabled READ dynamicTilingEnabled WRITE setDynamicTilingEnabled NOTIFY dynamicTilingEnabledChanged) + // logout dialog Q_PROPERTY(bool allowLogout READ allowLogout READ allowLogout NOTIFY allowLogoutChanged) @@ -274,6 +278,14 @@ public: bool gamingDismissHintEnabled() const; void setGamingDismissHintEnabled(bool enabled); + /** + * Whether the SHIFT BSP dynamic tiling script is active. + * Defaults to true; only takes effect in convergence mode (and when + * gaming mode is off). + */ + bool dynamicTilingEnabled() const; + void setDynamicTilingEnabled(bool enabled); + /** * Whether logout button is shown in the logout/shutdown dialog. */ @@ -322,6 +334,7 @@ Q_SIGNALS: void autoHidePanelsEnabledChanged(); void gamingModeEnabledChanged(); void gamingDismissHintEnabledChanged(); + void dynamicTilingEnabledChanged(); void allowLogoutChanged(); void lockscreenLeftButtonActionChanged(); void lockscreenRightButtonActionChanged(); diff --git a/quicksettings/CMakeLists.txt b/quicksettings/CMakeLists.txt index 0869f509..72e61dc1 100644 --- a/quicksettings/CMakeLists.txt +++ b/quicksettings/CMakeLists.txt @@ -8,6 +8,7 @@ plasma_install_package(bluetooth org.kde.plasma.quicksetting.bluetooth quicksett plasma_install_package(caffeine org.kde.plasma.quicksetting.caffeine quicksettings) plasma_install_package(docked org.kde.plasma.quicksetting.docked quicksettings) plasma_install_package(donotdisturb org.kde.plasma.quicksetting.donotdisturb quicksettings) +plasma_install_package(dynamictiling org.kde.plasma.quicksetting.dynamictiling quicksettings) plasma_install_package(gaming org.kde.plasma.quicksetting.gaming quicksettings) plasma_install_package(gaminghint org.kde.plasma.quicksetting.gaminghint quicksettings) plasma_install_package(autohidepanels org.kde.plasma.quicksetting.autohidepanels quicksettings) diff --git a/quicksettings/dynamictiling/contents/ui/main.qml b/quicksettings/dynamictiling/contents/ui/main.qml new file mode 100644 index 00000000..1ee9008c --- /dev/null +++ b/quicksettings/dynamictiling/contents/ui/main.qml @@ -0,0 +1,23 @@ +// SPDX-FileCopyrightText: 2026 Marco Allegretti +// SPDX-License-Identifier: LGPL-2.0-or-later + +import QtQuick + +import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings +import org.kde.plasma.private.mobileshell.quicksettingsplugin as QS + +QS.QuickSetting { + text: i18n("Dynamic Tiling") + icon: "view-grid-symbolic" + + // Only meaningful in convergence (desktop) mode. Hidden everywhere else. + available: ShellSettings.Settings.convergenceModeEnabled + && !ShellSettings.Settings.gamingModeEnabled + + enabled: ShellSettings.Settings.dynamicTilingEnabled + status: enabled ? i18n("On") : i18n("Off") + + function toggle() { + ShellSettings.Settings.dynamicTilingEnabled = !ShellSettings.Settings.dynamicTilingEnabled; + } +} diff --git a/quicksettings/dynamictiling/metadata.json b/quicksettings/dynamictiling/metadata.json new file mode 100644 index 00000000..af683e3e --- /dev/null +++ b/quicksettings/dynamictiling/metadata.json @@ -0,0 +1,17 @@ +{ + "KPackageStructure": "KPackage/GenericQML", + "KPlugin": { + "Authors": [ + { + "Email": "marco@lateuf.it", + "Name": "Marco Allegretti" + } + ], + "Description": "Quick setting to toggle SHIFT dynamic (BSP) window tiling in convergence mode", + "Icon": "view-grid-symbolic", + "Id": "org.kde.plasma.quicksetting.dynamictiling", + "License": "LGPL", + "Name": "Dynamic Tiling", + "Website": "https://kde.org" + } +}