From 9be9ec10a61984dfbc48dca43b47c522a693104d Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 11 Apr 2026 23:37:42 +1000 Subject: [PATCH] fix: per monitor configs Use c++ singleton pattern for monitor manager and bind appearance tokens properly Also use scoped properties on ContentWindow --- components/containers/StyledWindow.qml | 1 + modules/drawers/ContentWindow.qml | 10 ++-- plugin/src/Caelestia/Config/config.cpp | 3 + .../Caelestia/Config/monitorconfigmanager.cpp | 56 ++++++------------- .../Caelestia/Config/monitorconfigmanager.hpp | 3 - 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/components/containers/StyledWindow.qml b/components/containers/StyledWindow.qml index 57f319c0..c93465c7 100644 --- a/components/containers/StyledWindow.qml +++ b/components/containers/StyledWindow.qml @@ -8,6 +8,7 @@ PanelWindow { id: root required property string name + readonly property alias configScope: scope default property alias contentData: scope.data WlrLayershell.namespace: `caelestia-${name}` diff --git a/modules/drawers/ContentWindow.qml b/modules/drawers/ContentWindow.qml index 2842a33f..4ff12c16 100644 --- a/modules/drawers/ContentWindow.qml +++ b/modules/drawers/ContentWindow.qml @@ -30,9 +30,9 @@ StyledWindow { } return monitor?.activeWorkspace?.toplevels.values.some(t => t.lastIpcObject.fullscreen > 1) ?? false; } - property real borderThickness: hasFullscreen ? 0 : Config.border.thickness - readonly property real borderLayoutThickness: hasFullscreen ? 0 : Config.border.thickness - property real borderRounding: hasFullscreen ? 0 : Config.border.rounding + property real borderThickness: hasFullscreen ? 0 : configScope.Config.border.thickness + readonly property real borderLayoutThickness: hasFullscreen ? 0 : configScope.Config.border.thickness + property real borderRounding: hasFullscreen ? 0 : configScope.Config.border.rounding property real shadowOpacity: hasFullscreen ? 0 : 0.7 readonly property int dragMaskPadding: { @@ -44,8 +44,8 @@ StyledWindow { const thresholds = []; for (const panel of ["dashboard", "launcher", "session", "sidebar"]) - if (Config[panel].enabled) - thresholds.push(Config[panel].dragThreshold); + if (configScope.Config[panel].enabled) + thresholds.push(configScope.Config[panel].dragThreshold); return Math.max(...thresholds); } diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index 41067735..9ed2b4af 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -61,6 +61,9 @@ GlobalConfig::GlobalConfig(GlobalConfig* fallback, const QString& filePath, QObj setupFileBackend(filePath); if (fallback) syncFromGlobal(fallback); + + // Bind appearance computed properties to token base values + bindAppearanceTokens(); } GlobalConfig* GlobalConfig::instance() { diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp index d8b0561c..473b6567 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.cpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.cpp @@ -6,8 +6,6 @@ namespace caelestia::config { -MonitorConfigManager* MonitorConfigManager::s_instance = nullptr; - namespace { QString monitorConfigDir(const QString& screen) { @@ -18,52 +16,34 @@ QString monitorConfigDir(const QString& screen) { } // namespace MonitorConfigManager::MonitorConfigManager(QObject* parent) - : QObject(parent) { - s_instance = this; -} - -MonitorConfigManager::~MonitorConfigManager() { - s_instance = nullptr; -} + : QObject(parent) {} MonitorConfigManager* MonitorConfigManager::instance() { - return s_instance; + static MonitorConfigManager instance; + return &instance; } -MonitorConfigManager* MonitorConfigManager::create(QQmlEngine* engine, QJSEngine*) { - return new MonitorConfigManager(engine); +MonitorConfigManager* MonitorConfigManager::create(QQmlEngine*, QJSEngine*) { + QQmlEngine::setObjectOwnership(instance(), QQmlEngine::CppOwnership); + return instance(); } GlobalConfig* MonitorConfigManager::configForScreen(const QString& screen) { - auto it = m_overlays.find(screen); - if (it != m_overlays.end() && it->config) - return it->config; - - auto* global = GlobalConfig::instance(); - if (!global) - return nullptr; - - auto dir = monitorConfigDir(screen); - auto* overlay = new GlobalConfig(global, dir + QStringLiteral("shell.json"), this); - - m_overlays[screen].config = overlay; - return overlay; + auto& overlay = m_overlays[screen]; + if (!overlay.config) { + auto dir = monitorConfigDir(screen); + overlay.config = new GlobalConfig(GlobalConfig::instance(), dir + QStringLiteral("shell.json"), this); + } + return overlay.config; } TokenConfig* MonitorConfigManager::tokensForScreen(const QString& screen) { - auto it = m_overlays.find(screen); - if (it != m_overlays.end() && it->tokens) - return it->tokens; - - auto* global = TokenConfig::instance(); - if (!global) - return nullptr; - - auto dir = monitorConfigDir(screen); - auto* overlay = new TokenConfig(global, dir + QStringLiteral("shell-tokens.json"), this); - - m_overlays[screen].tokens = overlay; - return overlay; + auto& overlay = m_overlays[screen]; + if (!overlay.tokens) { + auto dir = monitorConfigDir(screen); + overlay.tokens = new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), this); + } + return overlay.tokens; } } // namespace caelestia::config diff --git a/plugin/src/Caelestia/Config/monitorconfigmanager.hpp b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp index 2741b732..70bbdc0d 100644 --- a/plugin/src/Caelestia/Config/monitorconfigmanager.hpp +++ b/plugin/src/Caelestia/Config/monitorconfigmanager.hpp @@ -21,8 +21,6 @@ public: [[nodiscard]] Q_INVOKABLE GlobalConfig* configForScreen(const QString& screen); [[nodiscard]] Q_INVOKABLE TokenConfig* tokensForScreen(const QString& screen); - ~MonitorConfigManager() override; - private: explicit MonitorConfigManager(QObject* parent = nullptr); @@ -32,7 +30,6 @@ private: }; QHash m_overlays; - static MonitorConfigManager* s_instance; }; } // namespace caelestia::config