diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 16 | ||||
| -rw-r--r-- | src/plugincontainer.cpp | 8 | ||||
| -rw-r--r-- | src/plugincontainer.h | 1 |
3 files changed, 16 insertions, 9 deletions
diff --git a/src/main.cpp b/src/main.cpp index c7a2834c..46f2f0aa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -560,6 +560,7 @@ int runApplication(MOApplication &application, SingleInstance &instance, }); log::debug("initializing core"); + std::unique_ptr<PluginContainer> pluginContainer; OrganizerCore organizer(settings); if (!organizer.bootstrap()) { reportError("failed to set up data paths"); @@ -582,11 +583,11 @@ int runApplication(MOApplication &application, SingleInstance &instance, } log::debug("initializing plugins"); - PluginContainer pluginContainer(&organizer); - pluginContainer.loadPlugins(); + pluginContainer = std::make_unique<PluginContainer>(&organizer); + pluginContainer->loadPlugins(); MOBase::IPluginGame *game = determineCurrentGame( - application.applicationDirPath(), settings, pluginContainer); + application.applicationDirPath(), settings, *pluginContainer); if (game == nullptr) { InstanceManager &instance = InstanceManager::instance(); @@ -723,7 +724,7 @@ int runApplication(MOApplication &application, SingleInstance &instance, QString apiKey; if (settings.nexus().apiKey(apiKey)) { - NexusInterface::instance(&pluginContainer)->getAccessManager()->apiCheck(apiKey); + NexusInterface::instance(pluginContainer.get())->getAccessManager()->apiCheck(apiKey); } log::debug("initializing tutorials"); @@ -741,9 +742,9 @@ int runApplication(MOApplication &application, SingleInstance &instance, { // scope to control lifetime of mainwindow // set up main window and its data structures - MainWindow mainWindow(settings, organizer, pluginContainer); + MainWindow mainWindow(settings, organizer, *pluginContainer); - NexusInterface::instance(&pluginContainer) + NexusInterface::instance(pluginContainer.get()) ->getAccessManager()->setTopLevelWidget(&mainWindow); QObject::connect(&mainWindow, SIGNAL(styleChanged(QString)), &application, @@ -766,13 +767,12 @@ int runApplication(MOApplication &application, SingleInstance &instance, res = application.exec(); mainWindow.close(); - NexusInterface::instance(&pluginContainer) + NexusInterface::instance(pluginContainer.get()) ->getAccessManager()->setTopLevelWidget(nullptr); } settings.geometry().resetIfNeeded(); return res; - } catch (const std::exception &e) { reportError(e.what()); } diff --git a/src/plugincontainer.cpp b/src/plugincontainer.cpp index caab2115..d989fac9 100644 --- a/src/plugincontainer.cpp +++ b/src/plugincontainer.cpp @@ -28,6 +28,10 @@ PluginContainer::PluginContainer(OrganizerCore *organizer) {
}
+PluginContainer::~PluginContainer() {
+ m_Organizer = nullptr;
+ unloadPlugins();
+}
void PluginContainer::setUserInterface(IUserInterface *userInterface, QWidget *widget)
{
@@ -213,7 +217,9 @@ void PluginContainer::unloadPlugins() }
// disconnect all slots before unloading plugins so plugins don't have to take care of that
- m_Organizer->disconnectPlugins();
+ if (m_Organizer != nullptr) {
+ m_Organizer->disconnectPlugins();
+ }
bf::for_each(m_Plugins, clearPlugins());
diff --git a/src/plugincontainer.h b/src/plugincontainer.h index 21ad4241..d405198a 100644 --- a/src/plugincontainer.h +++ b/src/plugincontainer.h @@ -49,6 +49,7 @@ private: public:
PluginContainer(OrganizerCore *organizer);
+ virtual ~PluginContainer();
void setUserInterface(IUserInterface *userInterface, QWidget *widget);
|
