From 17ad77f07a70072dd227956f30b285aafcc90f88 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Thu, 16 May 2024 21:38:01 -0500 Subject: [PATCH] Don't unload/remove plugins immediately, instead require a restart to prevent unclean unload/crash --- PluginManager.cpp | 37 +++++++++++++++++--- qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp | 9 +++-- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/PluginManager.cpp b/PluginManager.cpp index b394fc62..c3353012 100644 --- a/PluginManager.cpp +++ b/PluginManager.cpp @@ -127,6 +127,38 @@ void PluginManager::AddPlugin(const filesystem::path& path, bool is_system) unsigned int plugin_idx; + /*---------------------------------------------------------------------*\ + | Open plugin settings | + \*---------------------------------------------------------------------*/ + json plugin_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Plugins"); + + /*---------------------------------------------------------------------*\ + | Check if this plugin is on the remove list | + \*---------------------------------------------------------------------*/ + if(plugin_settings.contains("plugins_remove")) + { + for(unsigned int plugin_remove_idx = 0; plugin_remove_idx < plugin_settings["plugins_remove"].size(); plugin_remove_idx++) + { + LOG_WARNING("[PluginManager] Checking remove %d, %s", plugin_remove_idx, to_string(plugin_settings["plugins_remove"][plugin_remove_idx]).c_str()); + + if(plugin_settings["plugins_remove"][plugin_remove_idx] == path.generic_u8string()) + { + /*---------------------------------------------------------*\ + | Delete the plugin file | + \*---------------------------------------------------------*/ + filesystem::remove(path); + } + + /*-----------------------------------------------------------------*\ + | Erase the plugin from the remove list | + \*-----------------------------------------------------------------*/ + plugin_settings["plugins_remove"].erase(plugin_remove_idx); + + ResourceManager::get()->GetSettingsManager()->SetSettings("Plugins", plugin_settings); + ResourceManager::get()->GetSettingsManager()->SaveSettings(); + } + } + /*---------------------------------------------------------------------*\ | Search active plugins to see if this path already exists | \*---------------------------------------------------------------------*/ @@ -182,11 +214,6 @@ void PluginManager::AddPlugin(const filesystem::path& path, bool is_system) bool found = false; unsigned int plugin_ct = 0; - /*-----------------------------------------------------*\ - | Open plugin list and check if plugin is in the list | - \*-----------------------------------------------------*/ - json plugin_settings = ResourceManager::get()->GetSettingsManager()->GetSettings("Plugins"); - if(plugin_settings.contains("plugins")) { plugin_ct = (unsigned int)plugin_settings["plugins"].size(); diff --git a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp index baff6cf8..4ab3f0d3 100644 --- a/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp +++ b/qt/OpenRGBPluginsPage/OpenRGBPluginsPage.cpp @@ -235,12 +235,17 @@ void Ui::OpenRGBPluginsPage::on_RemovePluginButton_clicked() if((plugin_settings["plugins"][plugin_idx]["name"] == entries[cur_row]->ui->NameValue->text().toStdString()) &&(plugin_settings["plugins"][plugin_idx]["description"] == entries[cur_row]->ui->DescriptionValue->text().toStdString())) { - plugin_settings["plugins"].erase(plugin_idx); + /*-----------------------------------------------------*\ + | Mark plugin to be removed on next restart | + \*-----------------------------------------------------*/ + plugin_settings["plugins_remove"][plugin_settings["plugins_remove"].size()] = entries[cur_row]->ui->PathValue->text().toStdString(); ResourceManager::get()->GetSettingsManager()->SetSettings("Plugins", plugin_settings); ResourceManager::get()->GetSettingsManager()->SaveSettings(); - break; + QMessageBox::information(this, tr("Restart Needed"), tr("The plugin will be fully removed after restarting OpenRGB."), QMessageBox::Ok); + + return; } } }