diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 73c2079161f..1b5bad97b5b 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -14,6 +14,7 @@ #include "modemanager.h" #include "session.h" #include "settingsdatabase.h" +#include "systemsettings.h" #include "themechooser.h" #include "vcsmanager.h" @@ -31,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -67,11 +69,13 @@ using namespace Utils; static CorePlugin *m_instance = nullptr; const char kWarnCrashReportingSetting[] = "WarnCrashReporting"; -const char kEnvironmentChanges[] = "Core/EnvironmentChanges"; CorePlugin::CorePlugin() - : m_startupSystemEnvironment(Environment::systemEnvironment()) { + // Trigger creation as early as possible before anyone else could + // mess with the systemEnvironment before it is "backed up". + (void) systemSettings(); + qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); @@ -82,10 +86,6 @@ CorePlugin::CorePlugin() qRegisterMetaType(); qRegisterMetaType(); m_instance = this; - - const EnvironmentItems changes = EnvironmentItem::fromStringList( - ICore::settings()->value(kEnvironmentChanges).toStringList()); - setEnvironmentChanges(changes); } CorePlugin::~CorePlugin() @@ -455,25 +455,6 @@ QObject *CorePlugin::remoteCommand(const QStringList & /* options */, return res; } -EnvironmentItems CorePlugin::environmentChanges() -{ - return m_instance->m_environmentChanges; -} - -void CorePlugin::setEnvironmentChanges(const EnvironmentItems &changes) -{ - if (m_instance->m_environmentChanges == changes) - return; - m_instance->m_environmentChanges = changes; - Environment systemEnv = m_instance->m_startupSystemEnvironment; - systemEnv.modify(changes); - Environment::setSystemEnvironment(systemEnv); - ICore::settings()->setValueWithDefault(kEnvironmentChanges, - EnvironmentItem::toStringList(changes)); - if (ICore::instance()) - emit ICore::instance()->systemEnvironmentChanged(); -} - void CorePlugin::fileOpenRequest(const QString &f) { remoteCommand(QStringList(), QString(), QStringList(f)); diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index 45cc8195025..73cf441df1d 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -8,7 +8,6 @@ #include #include -#include namespace Core { @@ -39,8 +38,6 @@ public: const QString &workingDirectory, const QStringList &args) override; - static Utils::EnvironmentItems environmentChanges(); - static void setEnvironmentChanges(const Utils::EnvironmentItems &changes); static QString msgCrashpadInformation(); static void loadMimeFromPlugin(const ExtensionSystem::PluginSpec *plugin); @@ -65,8 +62,6 @@ private: EditMode *m_editMode = nullptr; Locator *m_locator = nullptr; FolderNavigationWidgetFactory *m_folderNavigationWidgetFactory = nullptr; - const Utils::Environment m_startupSystemEnvironment; - Utils::EnvironmentItems m_environmentChanges; }; } // namespace Internal diff --git a/src/plugins/coreplugin/systemsettings.cpp b/src/plugins/coreplugin/systemsettings.cpp index ed3cb5cd45e..1f43e1b4bfb 100644 --- a/src/plugins/coreplugin/systemsettings.cpp +++ b/src/plugins/coreplugin/systemsettings.cpp @@ -4,13 +4,11 @@ #include "systemsettings.h" #include "coreconstants.h" -#include "coreplugin.h" #include "coreplugintr.h" #include "editormanager/editormanager_p.h" #include "dialogs/ioptionspage.h" #include "fileutils.h" #include "icore.h" -#include "iversioncontrol.h" #include "vcsmanager.h" #include @@ -61,7 +59,12 @@ SystemSettings &systemSettings() } SystemSettings::SystemSettings() + : m_startupSystemEnvironment(Environment::systemEnvironment()) { + const EnvironmentItems changes = EnvironmentItem::fromStringList( + ICore::settings()->value(kEnvironmentChanges).toStringList()); + setEnvironmentChanges(changes); + setAutoApply(false); patchCommand.setSettingsKey("General/PatchCommand"); @@ -348,7 +351,7 @@ public: updatePath(); m_environmentChangesLabel->setElideMode(Qt::ElideRight); - m_environmentChanges = CorePlugin::environmentChanges(); + m_environmentChanges = systemSettings().environmentChanges(); updateEnvironmentChangesLabel(); connect(environmentButton, &QPushButton::clicked, this, [this, environmentButton] { std::optional changes @@ -418,7 +421,7 @@ void SystemSettingsWidget::apply() } } - CorePlugin::setEnvironmentChanges(m_environmentChanges); + systemSettings().setEnvironmentChanges(m_environmentChanges); } void SystemSettingsWidget::resetTerminal() @@ -480,6 +483,25 @@ void SystemSettingsWidget::showHelpForFileBrowser() showHelpDialog(Tr::tr("Variables"), UnixUtils::fileBrowserHelpText()); } +EnvironmentItems SystemSettings::environmentChanges() const +{ + return m_environmentChanges; +} + +void SystemSettings::setEnvironmentChanges(const EnvironmentItems &changes) +{ + if (m_environmentChanges == changes) + return; + m_environmentChanges = changes; + Environment systemEnv = m_startupSystemEnvironment; + systemEnv.modify(changes); + Environment::setSystemEnvironment(systemEnv); + ICore::settings()->setValueWithDefault(kEnvironmentChanges, + EnvironmentItem::toStringList(changes)); + if (ICore::instance()) + emit ICore::instance()->systemEnvironmentChanged(); +} + // SystemSettingsPage class SystemSettingsPage final : public IOptionsPage diff --git a/src/plugins/coreplugin/systemsettings.h b/src/plugins/coreplugin/systemsettings.h index 05c4d152a4f..36bc76129d9 100644 --- a/src/plugins/coreplugin/systemsettings.h +++ b/src/plugins/coreplugin/systemsettings.h @@ -6,9 +6,12 @@ #include "core_global.h" #include +#include namespace Core::Internal { +const char kEnvironmentChanges[] = "Core/EnvironmentChanges"; + class CORE_TEST_EXPORT SystemSettings final : public Utils::AspectContainer { public: @@ -36,6 +39,13 @@ public: #endif Utils::BoolAspect askBeforeExit{this}; + + Utils::EnvironmentItems environmentChanges() const; + void setEnvironmentChanges(const Utils::EnvironmentItems &changes); + +private: + Utils::EnvironmentItems m_environmentChanges; + const Utils::Environment m_startupSystemEnvironment; }; CORE_TEST_EXPORT SystemSettings &systemSettings();