fix: per monitor configs

Use c++ singleton pattern for monitor manager and bind appearance tokens
properly
Also use scoped properties on ContentWindow
This commit is contained in:
2 * r + 2 * t 2026-04-11 23:37:42 +10:00
parent 37b61fedc9
commit 9be9ec10a6
5 changed files with 27 additions and 46 deletions

View file

@ -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}`

View file

@ -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);
}

View file

@ -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() {

View file

@ -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& overlay = m_overlays[screen];
if (!overlay.config) {
auto dir = monitorConfigDir(screen);
auto* overlay = new GlobalConfig(global, dir + QStringLiteral("shell.json"), this);
m_overlays[screen].config = overlay;
return overlay;
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& overlay = m_overlays[screen];
if (!overlay.tokens) {
auto dir = monitorConfigDir(screen);
auto* overlay = new TokenConfig(global, dir + QStringLiteral("shell-tokens.json"), this);
m_overlays[screen].tokens = overlay;
return overlay;
overlay.tokens = new TokenConfig(TokenConfig::instance(), dir + QStringLiteral("shell-tokens.json"), this);
}
return overlay.tokens;
}
} // namespace caelestia::config

View file

@ -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<QString, ScreenOverlay> m_overlays;
static MonitorConfigManager* s_instance;
};
} // namespace caelestia::config