From 711c305b0eb4330c66a0012b6a4343f75b53519f Mon Sep 17 00:00:00 2001 From: Pierre Guillot Date: Fri, 18 Oct 2024 16:15:08 +0200 Subject: [PATCH] Add plugin blacklist system --- BinaryData/Resource/vamp-plugin-sdk-src.patch | 200 +++++++++++++----- .../Application/AnlApplicationProperties.cpp | 2 +- Source/Plugin/AnlPluginListModel.cpp | 21 +- Source/Plugin/AnlPluginListModel.h | 3 +- Source/Plugin/AnlPluginListSearchPath.cpp | 109 +++++----- Source/Plugin/AnlPluginListSearchPath.h | 6 +- 6 files changed, 220 insertions(+), 121 deletions(-) diff --git a/BinaryData/Resource/vamp-plugin-sdk-src.patch b/BinaryData/Resource/vamp-plugin-sdk-src.patch index 87e91434..90cb84d1 100644 --- a/BinaryData/Resource/vamp-plugin-sdk-src.patch +++ b/BinaryData/Resource/vamp-plugin-sdk-src.patch @@ -1,39 +1,104 @@ -diff --git forkSrcPrefix/vamp-hostsdk/PluginHostAdapter.h forkDstPrefix/vamp-hostsdk/PluginHostAdapter.h -index 2ca1d6994943e75febcbbce5cdc6fe22a3aa9342..ddadf94fad83e1cbf1151f65d0eaf30de959a9d7 100644 ---- forkSrcPrefix/vamp-hostsdk/PluginHostAdapter.h -+++ forkDstPrefix/vamp-hostsdk/PluginHostAdapter.h -@@ -107,6 +107,10 @@ public: - - FeatureSet getRemainingFeatures(); - -+ VampPluginHandle getPluginHandle() { -+ return m_handle; -+ } -+ - protected: - void convertFeatures(VampFeatureList *, FeatureSet &); - diff --git forkSrcPrefix/src/vamp-hostsdk/PluginLoader.cpp forkDstPrefix/src/vamp-hostsdk/PluginLoader.cpp -index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6dc954ee9f49885306f47afdbd23142eb44d9bc8 100644 +index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6d5a46a19052f7757eb05f7f83ae443a9bcf168a 100644 --- forkSrcPrefix/src/vamp-hostsdk/PluginLoader.cpp +++ forkDstPrefix/src/vamp-hostsdk/PluginLoader.cpp -@@ -45,6 +45,7 @@ +@@ -45,6 +45,8 @@ #include "Files.h" #include +#include ++#include using namespace std; -@@ -114,6 +115,7 @@ protected: +@@ -73,6 +75,8 @@ public: + PluginCategoryHierarchy getPluginCategory(PluginKey key); + + string getLibraryPathForPlugin(PluginKey key); ++ void setBlackListFile(std::string const& path); ++ std::string getBlackListFile() const; + + static void setInstanceToClean(PluginLoader *instance); + +@@ -114,8 +118,10 @@ protected: map m_taxonomy; void generateTaxonomy(); + std::mutex m_mutex; map m_pluginLibraryHandleMap; - +- ++ std::string m_blacklist; ++ bool decomposePluginKey(PluginKey key, -@@ -446,7 +448,9 @@ PluginLoader::Impl::loadPlugin(PluginKey key, + string &libraryName, string &identifier); + +@@ -299,9 +305,33 @@ PluginLoader::Impl::enumeratePlugins(Enumeration enumeration) + + vector added; + ++ ifstream pblf(m_blacklist); ++ string blacklist; ++ if(pblf.is_open()) ++ { ++ stringstream buffer; ++ buffer << pblf.rdbuf(); ++ blacklist = buffer.str(); ++ pblf.close(); ++ } ++ + for (size_t i = 0; i < fullPaths.size(); ++i) { + + string fullPath = fullPaths[i]; ++ if(blacklist.find(fullPath) != string::npos) ++ { ++ cerr << "Vamp::HostExt::PluginLoader: " ++ << "dynamic library ignored \"" ++ << fullPath << "\"" << endl; ++ continue; ++ } ++ std::ofstream oblf(m_blacklist, std::ofstream::out | std::ofstream::trunc); ++ if(oblf.is_open()) ++ { ++ oblf << blacklist << "\n" << fullPath << "\n"; ++ oblf.close(); ++ } ++ + void *handle = Files::loadLibrary(fullPath); + if (!handle) continue; + +@@ -352,6 +382,12 @@ PluginLoader::Impl::enumeratePlugins(Enumeration enumeration) + m_allPluginsEnumerated = true; + } + ++ std::ofstream oblf(m_blacklist, std::ofstream::out | std::ofstream::trunc); ++ if(oblf.is_open()) ++ { ++ oblf << blacklist; ++ oblf.close(); ++ } + return added; + } + +@@ -403,6 +439,18 @@ PluginLoader::Impl::getLibraryPathForPlugin(PluginKey plugin) + return m_pluginLibraryNameMap[plugin]; + } + ++void ++PluginLoader::Impl::setBlackListFile(std::string const& path) ++{ ++ m_blacklist = path; ++} ++ ++std::string ++PluginLoader::Impl::getBlackListFile() const ++{ ++ return m_blacklist; ++} ++ + Plugin * + PluginLoader::Impl::loadPlugin(PluginKey key, + float inputSampleRate, int adapterFlags) +@@ -446,7 +494,9 @@ PluginLoader::Impl::loadPlugin(PluginKey key, Plugin *adapter = new PluginDeletionNotifyAdapter(plugin, this); @@ -43,7 +108,7 @@ index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6dc954ee9f49885306f47afdbd23142e if (adapterFlags & ADAPT_INPUT_DOMAIN) { if (adapter->getInputDomain() == Plugin::FrequencyDomain) { -@@ -566,6 +570,7 @@ PluginLoader::Impl::generateTaxonomy() +@@ -566,6 +616,7 @@ PluginLoader::Impl::generateTaxonomy() void PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) { @@ -51,7 +116,7 @@ index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6dc954ee9f49885306f47afdbd23142e void *handle = m_pluginLibraryHandleMap[adapter]; if (!handle) return; -@@ -577,6 +582,7 @@ PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) +@@ -577,6 +628,7 @@ PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) return; } } @@ -59,7 +124,7 @@ index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6dc954ee9f49885306f47afdbd23142e Files::unloadLibrary(handle); } -@@ -602,6 +608,13 @@ PluginLoader::Impl::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() +@@ -602,6 +654,23 @@ PluginLoader::Impl::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() if (m_loader) m_loader->pluginDeleted(this); } @@ -69,10 +134,60 @@ index c0f1894969b315d19c43a0cbf31f85ef81c686fd..6dc954ee9f49885306f47afdbd23142e + Files::ignoreQuarantine = state; +} +#endif ++ ++void PluginLoader::setBlackListFile(std::string const& path) ++{ ++ m_impl->setBlackListFile(path); ++} ++ ++std::string PluginLoader::getBlackListFile() const ++{ ++ return m_impl->getBlackListFile(); ++} + } } +diff --git forkSrcPrefix/vamp-hostsdk/PluginWrapper.h forkDstPrefix/vamp-hostsdk/PluginWrapper.h +index 45e68803f30c3d8b2d845812a7023daa3c08a6b4..70b90ed28e049b1630263e94ae741f3224cfcaf5 100644 +--- forkSrcPrefix/vamp-hostsdk/PluginWrapper.h ++++ forkDstPrefix/vamp-hostsdk/PluginWrapper.h +@@ -124,6 +124,10 @@ public: + return nullptr; + } + ++ Plugin *getPlugin() { ++ return m_plugin; ++ } ++ + /** + * Disown the wrapped plugin, so that we no longer delete it on + * our own destruction. The identity of the wrapped plugin is +diff --git forkSrcPrefix/vamp-hostsdk/PluginLoader.h forkDstPrefix/vamp-hostsdk/PluginLoader.h +index 0735e0cc18be9328c47dad65ef6dafe0d6fc5a1a..7acf9c018d26fc52e4595b4765d6131e24cb170a 100644 +--- forkSrcPrefix/vamp-hostsdk/PluginLoader.h ++++ forkDstPrefix/vamp-hostsdk/PluginLoader.h +@@ -259,6 +259,20 @@ public: + * given plugin will be loaded (if available). + */ + std::string getLibraryPathForPlugin(PluginKey plugin); ++ ++ /** ++ * Set the file path for the blacklist file ++ */ ++ void setBlackListFile(std::string const& path); ++ ++ /** ++ * Return the file path to the blacklist file ++ */ ++ std::string getBlackListFile() const; ++ ++#ifdef __APPLE__ ++ static void setIgnoreQuanrantineLibs(bool state); ++#endif + + protected: + PluginLoader(); diff --git forkSrcPrefix/src/vamp-hostsdk/Files.cpp forkDstPrefix/src/vamp-hostsdk/Files.cpp index 8dda7ff8b2f8a18358db54e80f83c913f92b13e8..bc4d9d8691932e3a39c177a47bb51575c6ff8141 100644 --- forkSrcPrefix/src/vamp-hostsdk/Files.cpp @@ -113,21 +228,21 @@ index 8dda7ff8b2f8a18358db54e80f83c913f92b13e8..bc4d9d8691932e3a39c177a47bb51575 handle = dlopen(path.c_str(), RTLD_LAZY | RTLD_LOCAL); if (!handle) { cerr << "Vamp::HostExt: Unable to load library \"" -diff --git forkSrcPrefix/vamp-hostsdk/PluginLoader.h forkDstPrefix/vamp-hostsdk/PluginLoader.h -index 0735e0cc18be9328c47dad65ef6dafe0d6fc5a1a..4ffee1eb34efe0197db8d2b6f16a2eb37db45c28 100644 ---- forkSrcPrefix/vamp-hostsdk/PluginLoader.h -+++ forkDstPrefix/vamp-hostsdk/PluginLoader.h -@@ -260,6 +260,10 @@ public: - */ - std::string getLibraryPathForPlugin(PluginKey plugin); +diff --git forkSrcPrefix/vamp-hostsdk/PluginHostAdapter.h forkDstPrefix/vamp-hostsdk/PluginHostAdapter.h +index 2ca1d6994943e75febcbbce5cdc6fe22a3aa9342..ddadf94fad83e1cbf1151f65d0eaf30de959a9d7 100644 +--- forkSrcPrefix/vamp-hostsdk/PluginHostAdapter.h ++++ forkDstPrefix/vamp-hostsdk/PluginHostAdapter.h +@@ -107,6 +107,10 @@ public: -+#ifdef __APPLE__ -+ static void setIgnoreQuanrantineLibs(bool state); -+#endif + FeatureSet getRemainingFeatures(); + ++ VampPluginHandle getPluginHandle() { ++ return m_handle; ++ } + protected: - PluginLoader(); - virtual ~PluginLoader(); + void convertFeatures(VampFeatureList *, FeatureSet &); + diff --git forkSrcPrefix/src/vamp-hostsdk/Files.h forkDstPrefix/src/vamp-hostsdk/Files.h index 65992e3072fc9e021dcedf050b1e94416f8f4874..55f0d82293208098ac332e99f5ad8e08f1fbc9a5 100644 --- forkSrcPrefix/src/vamp-hostsdk/Files.h @@ -142,18 +257,3 @@ index 65992e3072fc9e021dcedf050b1e94416f8f4874..55f0d82293208098ac332e99f5ad8e08 static void *loadLibrary(std::string filename); static void unloadLibrary(void *); static void *lookupInLibrary(void *, const char *symbol); -diff --git forkSrcPrefix/vamp-hostsdk/PluginWrapper.h forkDstPrefix/vamp-hostsdk/PluginWrapper.h -index 45e68803f30c3d8b2d845812a7023daa3c08a6b4..70b90ed28e049b1630263e94ae741f3224cfcaf5 100644 ---- forkSrcPrefix/vamp-hostsdk/PluginWrapper.h -+++ forkDstPrefix/vamp-hostsdk/PluginWrapper.h -@@ -124,6 +124,10 @@ public: - return nullptr; - } - -+ Plugin *getPlugin() { -+ return m_plugin; -+ } -+ - /** - * Disown the wrapped plugin, so that we no longer delete it on - * our own destruction. The identity of the wrapped plugin is diff --git a/Source/Application/AnlApplicationProperties.cpp b/Source/Application/AnlApplicationProperties.cpp index cfb006b7..7bf5bee7 100644 --- a/Source/Application/AnlApplicationProperties.cpp +++ b/Source/Application/AnlApplicationProperties.cpp @@ -141,7 +141,7 @@ void Application::Properties::loadFromFile(PropertyType type) }; searchPath.insert(searchPath.begin(), getPluginPackageDirectory()); copy.setAttr(searchPath, NotificationType::synchronous); - PluginList::setEnvironment(copy); + PluginList::setEnvironment(copy, getFile("plugin.blacklist")); } break; case PropertyType::AudioSetup: diff --git a/Source/Plugin/AnlPluginListModel.cpp b/Source/Plugin/AnlPluginListModel.cpp index ae96bac6..1e264206 100644 --- a/Source/Plugin/AnlPluginListModel.cpp +++ b/Source/Plugin/AnlPluginListModel.cpp @@ -29,8 +29,12 @@ std::vector PluginList::getDefaultSearchPath() #endif } -void PluginList::setEnvironment(Accessor const& accessor) +void PluginList::setEnvironment(Accessor const& accessor, juce::File const& blacklistFile) { + if(auto* instance = Vamp::HostExt::PluginLoader::getInstance()) + { + instance->setBlackListFile(blacklistFile.getFullPathName().toStdString()); + } #if JUCE_MAC auto const quarantineMode = accessor.getAttr(); Vamp::HostExt::PluginLoader::setIgnoreQuanrantineLibs(quarantineMode == QuarantineMode::force || quarantineMode == QuarantineMode::ignore); @@ -82,6 +86,15 @@ void PluginList::setEnvironment(Accessor const& accessor) #endif } +juce::File PluginList::getBlackListFile() +{ + if(auto* instance = Vamp::HostExt::PluginLoader::getInstance()) + { + return {juce::String(instance->getBlackListFile())}; + } + return {}; +} + #if JUCE_MAC #include @@ -141,12 +154,6 @@ bool PluginList::removeLibrariesFromQuarantine(std::vector const& fi } } } - auto* pluginLoader = Vamp::HostExt::PluginLoader::getInstance(); - anlStrongAssert(pluginLoader != nullptr); - if(pluginLoader != nullptr) - { - pluginLoader->listPluginsIn(names); - } return !names.empty(); } diff --git a/Source/Plugin/AnlPluginListModel.h b/Source/Plugin/AnlPluginListModel.h index 55f2310d..cb5dd864 100644 --- a/Source/Plugin/AnlPluginListModel.h +++ b/Source/Plugin/AnlPluginListModel.h @@ -45,7 +45,8 @@ namespace PluginList }; std::vector getDefaultSearchPath(); - void setEnvironment(Accessor const& accessor); + void setEnvironment(Accessor const& accessor, juce::File const& blacklistFile); + juce::File getBlackListFile(); #if JUCE_MAC std::vector findLibrariesInQuarantine(Accessor const& accessor); diff --git a/Source/Plugin/AnlPluginListSearchPath.cpp b/Source/Plugin/AnlPluginListSearchPath.cpp index ebf3a815..c449a804 100644 --- a/Source/Plugin/AnlPluginListSearchPath.cpp +++ b/Source/Plugin/AnlPluginListSearchPath.cpp @@ -13,11 +13,10 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) mResetButton.setEnabled(mApplyButton.isEnabled()); mDefaultButton.setEnabled(mUseEnvVariable != true || mQuarantineMode != QuarantineMode::force || fileSearchPath != getDefaultSearchPath()); #else - auto const useEnvVariable = mEnvVariableButton.getToggleState(); auto const fileSearchPath = mFileSearchPathTable.getFileSearchPath(); - mApplyButton.setEnabled(useEnvVariable != mAccessor.getAttr() || fileSearchPath != mAccessor.getAttr()); + mApplyButton.setEnabled(mUseEnvVariable != mAccessor.getAttr() || fileSearchPath != mAccessor.getAttr()); mResetButton.setEnabled(mApplyButton.isEnabled()); - mDefaultButton.setEnabled(useEnvVariable != true || fileSearchPath != getDefaultSearchPath()); + mDefaultButton.setEnabled(mUseEnvVariable != true || fileSearchPath != getDefaultSearchPath()); #endif }; @@ -38,11 +37,9 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) mApplyButton.onClick = [=, this]() { -#if JUCE_MAC mAccessor.setAttr(mUseEnvVariable, NotificationType::synchronous); +#if JUCE_MAC mAccessor.setAttr(mQuarantineMode, NotificationType::synchronous); -#else - mAccessor.setAttr(mEnvVariableButton.getToggleState(), NotificationType::synchronous); #endif mAccessor.setAttr(mFileSearchPathTable.getFileSearchPath(), NotificationType::synchronous); updateButtonsStates(); @@ -51,11 +48,9 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) mResetButton.onClick = [=, this]() { -#if JUCE_MAC mUseEnvVariable = mAccessor.getAttr(); +#if JUCE_MAC mQuarantineMode = mAccessor.getAttr(); -#else - mEnvVariableButton.setToggleState(mAccessor.getAttr(), juce::NotificationType::dontSendNotification); #endif mFileSearchPathTable.setFileSearchPath(mAccessor.getAttr(), juce::NotificationType::sendNotificationSync); updateButtonsStates(); @@ -63,17 +58,14 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) mDefaultButton.onClick = [=, this]() { -#if JUCE_MAC mUseEnvVariable = true; +#if JUCE_MAC mQuarantineMode = QuarantineMode::force; -#else - mEnvVariableButton.setToggleState(true, juce::NotificationType::dontSendNotification); #endif mFileSearchPathTable.setFileSearchPath(getDefaultSearchPath(), juce::NotificationType::sendNotificationSync); updateButtonsStates(); }; -#if JUCE_MAC mOptionButton.onClick = [=, this]() { juce::PopupMenu menu; @@ -87,35 +79,57 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) mUseEnvVariable = !mUseEnvVariable; updateButtonsStates(); }); - juce::PopupMenu submenu; + juce::PopupMenu blacklistSubmenu; + auto const blackListFile = getBlackListFile(); + juce::StringArray blackListedPlugins; + blackListedPlugins.addTokens(blackListFile.loadFileAsString(), "\n", "\""); + blackListedPlugins.removeEmptyStrings(); + for(auto& blackListedPlugin : blackListedPlugins) + { + juce::File const pluginFile(blackListedPlugin); + blacklistSubmenu.addItem(juce::translate("Clear FLNAME").replace("FLNAME", pluginFile.getFileName()), true, false, [=] + { + juce::StringArray newList; + newList.addTokens(blackListFile.loadFileAsString(), "\n", "\""); + newList.removeEmptyStrings(); + newList.removeString(blackListedPlugin); + blackListFile.replaceWithText(newList.joinIntoString("\n")); + }); + } + if(!blackListedPlugins.isEmpty()) + { + blacklistSubmenu.addSeparator(); + } + blacklistSubmenu.addItem(juce::translate("Clear all"), !blackListedPlugins.isEmpty(), false, [=] + { + blackListFile.deleteFile(); + }); + blacklistSubmenu.addItem(juce::translate("Show file"), !blackListedPlugins.isEmpty(), false, [=] + { + blackListFile.revealToUser(); + }); + menu.addSubMenu(juce::translate("Blacklisted plugins"), blacklistSubmenu); +#if JUCE_MAC + juce::PopupMenu quarantineSubmenu; auto const addModeItem = [&](juce::String const& name, QuarantineMode mode) { - submenu.addItem(name, mQuarantineMode != mode, mQuarantineMode == mode, [=, this]() - { - if(safePointer.get() == nullptr) - { - return; - } - mQuarantineMode = mode; - updateButtonsStates(); - }); + quarantineSubmenu.addItem(name, mQuarantineMode != mode, mQuarantineMode == mode, [=, this]() + { + if(safePointer.get() == nullptr) + { + return; + } + mQuarantineMode = mode; + updateButtonsStates(); + }); }; addModeItem(juce::translate("Keep the default system mechanism"), QuarantineMode::system); addModeItem(juce::translate("Attemp to open quarantined libraries"), QuarantineMode::force); addModeItem(juce::translate("Ignore quarantined libraries"), QuarantineMode::ignore); - menu.addSubMenu(juce::translate("Quarantine management"), submenu); + menu.addSubMenu(juce::translate("Quarantine management"), quarantineSubmenu); +#endif menu.showMenuAsync(juce::PopupMenu::Options().withTargetComponent(mOptionButton)); }; -#else - mEnvVariableInfo.setText(juce::translate("Env. variable"), juce::NotificationType::dontSendNotification); - mEnvVariableInfo.setTooltip(juce::translate("Toggle the use of the VAMP_PATH environment variable")); - mEnvVariableInfo.setEditable(false); - mEnvVariableButton.setTooltip(juce::translate("Toggle the use of the VAMP_PATH environment variable")); - mEnvVariableButton.onClick = [=]() - { - updateButtonsStates(); - }; -#endif mListener.onAttrChanged = [=, this](Accessor const& acsr, AttrType attribute) { @@ -127,25 +141,16 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) updateButtonsStates(); } break; -#if JUCE_MAC - case AttrType::useEnvVariable: case AttrType::quarantineMode: + case AttrType::useEnvVariable: { mUseEnvVariable = acsr.getAttr(); +#if JUCE_MAC mQuarantineMode = acsr.getAttr(); +#endif updateButtonsStates(); } break; -#else - case AttrType::useEnvVariable: - { - mEnvVariableButton.setToggleState(acsr.getAttr(), juce::NotificationType::dontSendNotification); - updateButtonsStates(); - } - break; - case AttrType::quarantineMode: - break; -#endif } }; mAccessor.addListener(mListener, NotificationType::synchronous); @@ -157,12 +162,7 @@ PluginList::SearchPath::SearchPath(Accessor& accessor) addAndMakeVisible(mApplyButton); addAndMakeVisible(mResetButton); addAndMakeVisible(mDefaultButton); -#if JUCE_MAC addAndMakeVisible(mOptionButton); -#else - addAndMakeVisible(mEnvVariableInfo); - addAndMakeVisible(mEnvVariableButton); -#endif setSize(405, 200); } @@ -182,12 +182,7 @@ void PluginList::SearchPath::resized() bottomBounds.removeFromLeft(1); mDefaultButton.setBounds(bottomBounds.removeFromLeft(100)); bottomBounds.removeFromLeft(1); -#if JUCE_MAC mOptionButton.setBounds(bottomBounds); -#else - mEnvVariableButton.setBounds(bottomBounds.removeFromLeft(24).reduced(4)); - mEnvVariableInfo.setBounds(bottomBounds); -#endif } mSeparator.setBounds(bounds.removeFromBottom(1)); mFileSearchPathTable.setBounds(bounds); @@ -198,7 +193,7 @@ void PluginList::SearchPath::warnBeforeClosing() #if JUCE_MAC if(mFileSearchPathTable.getFileSearchPath() != mAccessor.getAttr() || mUseEnvVariable != mAccessor.getAttr() || mQuarantineMode != mAccessor.getAttr()) #else - if(mFileSearchPathTable.getFileSearchPath() != mAccessor.getAttr() || mEnvVariableButton.getToggleState() != mAccessor.getAttr()) + if(mFileSearchPathTable.getFileSearchPath() != mAccessor.getAttr() || mUseEnvVariable != mAccessor.getAttr()) #endif { auto const options = juce::MessageBoxOptions() diff --git a/Source/Plugin/AnlPluginListSearchPath.h b/Source/Plugin/AnlPluginListSearchPath.h index 2a80024f..48c9d59c 100644 --- a/Source/Plugin/AnlPluginListSearchPath.h +++ b/Source/Plugin/AnlPluginListSearchPath.h @@ -27,15 +27,11 @@ namespace PluginList juce::TextButton mApplyButton{juce::translate("Apply"), juce::translate("Apply the new plugin settings")}; juce::TextButton mResetButton{juce::translate("Reset"), juce::translate("Reset to the current plugin settings")}; juce::TextButton mDefaultButton{juce::translate("Default"), juce::translate("Reset to the default plugin settings")}; -#if JUCE_MAC juce::TextButton mOptionButton{juce::translate("Options"), juce::translate("Change the plugin options")}; bool mUseEnvVariable = true; +#if JUCE_MAC QuarantineMode mQuarantineMode = QuarantineMode::force; -#else - juce::Label mEnvVariableInfo; - juce::ToggleButton mEnvVariableButton; #endif - JUCE_LEAK_DETECTOR(SearchPath) }; } // namespace PluginList