diff --git a/plugin/src/Caelestia/Config/config.cpp b/plugin/src/Caelestia/Config/config.cpp index f78884f2..da9fdcbe 100644 --- a/plugin/src/Caelestia/Config/config.cpp +++ b/plugin/src/Caelestia/Config/config.cpp @@ -140,7 +140,8 @@ void Config::connectScope() { const Type* Config::name() const { \ if (m_scope && m_scope->config()) \ return m_scope->config()->name(); \ - return GlobalConfig::instance()->name(); \ + auto* global = GlobalConfig::instance(); \ + return global ? global->name() : nullptr; \ } CONFIG_ATTACHED_GETTER(AppearanceConfig, appearance) @@ -164,6 +165,11 @@ CONFIG_ATTACHED_GETTER(UserPaths, paths) #undef CONFIG_ATTACHED_GETTER Config* Config::qmlAttachedProperties(QObject* object) { + // Ensure GlobalConfig singleton is created before any attached property access + if (!GlobalConfig::instance()) { + if (auto* engine = qmlEngine(object)) + engine->singletonInstance("Caelestia.Config", "GlobalConfig"); + } return new Config(ConfigScope::find(object), object); } diff --git a/plugin/src/Caelestia/Config/tokens.cpp b/plugin/src/Caelestia/Config/tokens.cpp index ac383ba5..2b0559fa 100644 --- a/plugin/src/Caelestia/Config/tokens.cpp +++ b/plugin/src/Caelestia/Config/tokens.cpp @@ -99,7 +99,8 @@ void Tokens::connectScope() { const Type* Tokens::name() const { \ if (m_scope && m_scope->tokens()) \ return m_scope->tokens()->name(); \ - return TokenConfig::instance()->name(); \ + auto* global = TokenConfig::instance(); \ + return global ? global->name() : nullptr; \ } TOKENS_ATTACHED_GETTER(AppearanceTokens, appearance) @@ -118,6 +119,11 @@ TOKENS_ATTACHED_GETTER(ControlCenterTokens, controlCenter) #undef TOKENS_ATTACHED_GETTER Tokens* Tokens::qmlAttachedProperties(QObject* object) { + // Ensure TokenConfig singleton is created before any attached property access + if (!TokenConfig::instance()) { + if (auto* engine = qmlEngine(object)) + engine->singletonInstance("Caelestia.Config", "TokenConfig"); + } return new Tokens(ConfigScope::find(object), object); }