diff --git a/source/backend/CarlaHost.h b/source/backend/CarlaHost.h index a78547281..0e632f60e 100644 --- a/source/backend/CarlaHost.h +++ b/source/backend/CarlaHost.h @@ -1109,10 +1109,9 @@ CARLA_EXPORT void carla_send_midi_note(CarlaHostHandle handle, #endif /*! - * Set a custom prefix for plugin UI windows created by Carla. - * Carla will then add "%s (GUI)" after the prefix. + * Set a custom title for the plugin UI window created by Carla. */ -CARLA_EXPORT void carla_set_custom_ui_prefix(CarlaHostHandle handle, uint pluginId, const char* prefix); +CARLA_EXPORT void carla_set_custom_ui_title(CarlaHostHandle handle, uint pluginId, const char* title); /*! * Tell a plugin to show its own custom UI. diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 77d49a522..6fd8d2d6b 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -790,10 +790,9 @@ public: // UI Stuff /*! - * Set a custom prefix for plugin UI windows created by Carla. - * Carla will then add "%s (GUI)" after the prefix. + * Set a custom title for the plugin UI window created by Carla. */ - void setCustomUIPrefix(const char* format); + void setCustomUITitle(const char* title) noexcept; /*! * Show (or hide) the plugin's custom UI according to @a yesNo. diff --git a/source/backend/CarlaStandalone.cpp b/source/backend/CarlaStandalone.cpp index dd976e616..d0388b7f1 100644 --- a/source/backend/CarlaStandalone.cpp +++ b/source/backend/CarlaStandalone.cpp @@ -2150,13 +2150,13 @@ void carla_send_midi_note(CarlaHostHandle handle, uint pluginId, uint8_t channel } #endif -void carla_set_custom_ui_prefix(CarlaHostHandle handle, uint pluginId, const char* prefix) +void carla_set_custom_ui_title(CarlaHostHandle handle, uint pluginId, const char* title) { CARLA_SAFE_ASSERT_RETURN(handle->engine != nullptr,); - CARLA_SAFE_ASSERT_RETURN(prefix != nullptr,); + CARLA_SAFE_ASSERT_RETURN(title != nullptr,); if (const CarlaPluginPtr plugin = handle->engine->getPlugin(pluginId)) - plugin->setCustomUIPrefix(prefix); + plugin->setCustomUITitle(title); } void carla_show_custom_ui(CarlaHostHandle handle, uint pluginId, bool yesNo) diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 36b6506b0..214b2c1b3 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -2355,9 +2355,9 @@ void CarlaPlugin::postponeRtAllNotesOff() // ------------------------------------------------------------------- // UI Stuff -void CarlaPlugin::setCustomUIPrefix(const char* format) +void CarlaPlugin::setCustomUITitle(const char* const title) noexcept { - pData->uiPrefix = format; + pData->uiTitle = title; } void CarlaPlugin::showCustomUI(const bool yesNo) @@ -2429,8 +2429,17 @@ void CarlaPlugin::uiIdle() carla_stdout("Trying to get window..."); - CarlaString uiTitle(pData->name); - uiTitle += " (GUI)"; + CarlaString uiTitle; + + if (pData->uiTitle.isNotEmpty()) + { + uiTitle = pData->uiTitle; + } + else + { + uiTitle = pData->name; + uiTitle += " (GUI)"; + } if (CarlaPluginUI::tryTransientWinIdMatch(getUiBridgeProcessId(), uiTitle, pData->engine->getOptions().frontendWinId, pData->transientFirstTry)) diff --git a/source/backend/plugin/CarlaPluginInternal.cpp b/source/backend/plugin/CarlaPluginInternal.cpp index 806989ab8..880b15800 100644 --- a/source/backend/plugin/CarlaPluginInternal.cpp +++ b/source/backend/plugin/CarlaPluginInternal.cpp @@ -691,7 +691,7 @@ CarlaPlugin::ProtectedData::ProtectedData(CarlaEngine* const eng, const uint idx masterMutex(), singleMutex(), stateSave(), - uiPrefix(), + uiTitle(), extNotes(), latency(), postRtEvents(), diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index c4ce54575..a319c40a8 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -269,7 +269,7 @@ struct CarlaPlugin::ProtectedData { CarlaStateSave stateSave; - CarlaString uiPrefix; + CarlaString uiTitle; struct ExternalNotes { CarlaMutex mutex; diff --git a/source/backend/plugin/CarlaPluginJuce.cpp b/source/backend/plugin/CarlaPluginJuce.cpp index 608b65ffc..1258f1918 100644 --- a/source/backend/plugin/CarlaPluginJuce.cpp +++ b/source/backend/plugin/CarlaPluginJuce.cpp @@ -260,12 +260,12 @@ public: { CarlaPlugin::setName(newName); - if (fWindow != nullptr) - { - juce::String uiName(pData->name); - uiName += " (GUI)"; - fWindow->setName(uiName); - } + if (fWindow == nullptr || pData->uiTitle.isNotEmpty()) + return; + + juce::String uiName(pData->name); + uiName += " (GUI)"; + fWindow->setName(uiName); } // ------------------------------------------------------------------- @@ -384,8 +384,17 @@ public: if (fWindow == nullptr) { - juce::String uiName(pData->name); - uiName += " (GUI)"; + juce::String uiName; + + if (pData->uiTitle.isNotEmpty()) + { + uiName = pData->uiTitle.buffer(); + } + else + { + uiName = pData->name; + uiName += " (GUI)"; + } fWindow = new JucePluginWindow(opts.frontendWinId); fWindow->setName(uiName); diff --git a/source/backend/plugin/CarlaPluginLADSPADSSI.cpp b/source/backend/plugin/CarlaPluginLADSPADSSI.cpp index 9ba9479cd..ba305a572 100644 --- a/source/backend/plugin/CarlaPluginLADSPADSSI.cpp +++ b/source/backend/plugin/CarlaPluginLADSPADSSI.cpp @@ -79,17 +79,20 @@ public: kPlugin(plugin), fBinary(), fLabel(), + fUiTitle(), fOscData(oscData), fProcess() {} - void setData(const char* const binary, const char* const label) noexcept + void setData(const char* const binary, const char* const label, const char* const uiTitle) noexcept { CARLA_SAFE_ASSERT_RETURN(binary != nullptr && binary[0] != '\0',); - CARLA_SAFE_ASSERT_RETURN(label != nullptr /*&& label[0] != '\0'*/,); + CARLA_SAFE_ASSERT_RETURN(label != nullptr,); + CARLA_SAFE_ASSERT_RETURN(uiTitle != nullptr && uiTitle[0] != '\0',); CARLA_SAFE_ASSERT(! isThreadRunning()); - fBinary = binary; - fLabel = label; + fBinary = binary; + fLabel = label; + fUiTitle = uiTitle; if (fLabel.isEmpty()) fLabel = "\"\""; @@ -148,7 +151,7 @@ public: arguments.add(fLabel.buffer()); // ui-title - arguments.add(name + String(" (GUI)")); + arguments.add(fUiTitle.buffer()); bool started; @@ -242,6 +245,7 @@ private: CarlaString fBinary; CarlaString fLabel; + CarlaString fUiTitle; const CarlaOscData& fOscData; CarlaScopedPointer fProcess; @@ -2957,7 +2961,20 @@ public: if (const char* const guiFilename = find_dssi_ui(filename, fDescriptor->Label)) { fUiFilename = guiFilename; - fThreadUI.setData(guiFilename, fDescriptor->Label); + + CarlaString uiTitle; + + if (pData->uiTitle.isNotEmpty()) + { + uiTitle = pData->uiTitle; + } + else + { + uiTitle = pData->name; + uiTitle += " (GUI)"; + } + + fThreadUI.setData(guiFilename, fDescriptor->Label, uiTitle); } } #endif diff --git a/source/backend/plugin/CarlaPluginLV2.cpp b/source/backend/plugin/CarlaPluginLV2.cpp index d80ea93a6..dbd920882 100644 --- a/source/backend/plugin/CarlaPluginLV2.cpp +++ b/source/backend/plugin/CarlaPluginLV2.cpp @@ -452,7 +452,7 @@ struct CarlaPluginLV2Options { if (windowTitle != nullptr) { - delete[] windowTitle; + std::free(const_cast(windowTitle)); windowTitle = nullptr; } } @@ -1303,14 +1303,14 @@ public: { CarlaPlugin::setName(newName); - if (fLv2Options.windowTitle == nullptr) + if (fLv2Options.windowTitle == nullptr || pData->uiTitle.isNotEmpty()) return; - CarlaString guiTitle(pData->name); - guiTitle += " (GUI)"; + CarlaString uiTitle(pData->name); + uiTitle += " (GUI)"; - delete[] fLv2Options.windowTitle; - fLv2Options.windowTitle = guiTitle.dup(); + std::free(const_cast(fLv2Options.windowTitle)); + fLv2Options.windowTitle = uiTitle.releaseBufferPointer(); fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].value = fLv2Options.windowTitle; @@ -6271,9 +6271,19 @@ public: { carla_stdout("Will use UI-Bridge for '%s', binary: \"%s\"", pData->name, bridgeBinary); - CarlaString guiTitle(pData->name); - guiTitle += " (GUI)"; - fLv2Options.windowTitle = guiTitle.dup(); + CarlaString uiTitle; + + if (pData->uiTitle.isNotEmpty()) + { + uiTitle = pData->uiTitle; + } + else + { + uiTitle = pData->name; + uiTitle += " (GUI)"; + } + + fLv2Options.windowTitle = uiTitle.releaseBufferPointer(); fUI.type = UI::TYPE_BRIDGE; fPipeServer.setData(bridgeBinary, fRdfDescriptor->URI, fUI.rdfDescriptor->URI); @@ -6400,9 +6410,21 @@ public: // --------------------------------------------------------------- // initialize ui data - CarlaString guiTitle(pData->name); - guiTitle += " (GUI)"; - fLv2Options.windowTitle = guiTitle.dup(); + { + CarlaString uiTitle; + + if (pData->uiTitle.isNotEmpty()) + { + uiTitle = pData->uiTitle; + } + else + { + uiTitle = pData->name; + uiTitle += " (GUI)"; + } + + fLv2Options.windowTitle = uiTitle.releaseBufferPointer(); + } fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].value = fLv2Options.windowTitle; diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 2e0b1db0f..908ea1589 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -347,7 +347,7 @@ public: if (fHost.uiName != nullptr) { - delete[] fHost.uiName; + std::free(const_cast(fHost.uiName)); fHost.uiName = nullptr; } @@ -695,18 +695,24 @@ public: CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0',); - char uiName[std::strlen(newName)+6+1]; - std::strcpy(uiName, newName); - std::strcat(uiName, " (GUI)"); + CarlaPlugin::setName(newName); - if (fHost.uiName != nullptr) - delete[] fHost.uiName; - fHost.uiName = carla_strdup(uiName); + if (pData->uiTitle.isNotEmpty()) + return; + + CarlaString uiName(pData->name); + uiName += " (GUI)"; + + std::free(const_cast(fHost.uiName)); + fHost.uiName = uiName.releaseBufferPointer(); if (fDescriptor->dispatcher != nullptr && fIsUiVisible) - fDescriptor->dispatcher(fHandle, NATIVE_PLUGIN_OPCODE_UI_NAME_CHANGED, 0, 0, uiName, 0.0f); + fDescriptor->dispatcher(fHandle, + NATIVE_PLUGIN_OPCODE_UI_NAME_CHANGED, + 0, 0, + const_cast(fHost.uiName), + 0.0f); - CarlaPlugin::setName(newName); } void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override @@ -2889,11 +2895,19 @@ public: { CARLA_ASSERT(fHost.uiName == nullptr); - char uiName[std::strlen(pData->name)+6+1]; - std::strcpy(uiName, pData->name); - std::strcat(uiName, " (GUI)"); + CarlaString uiName; + + if (pData->uiTitle.isNotEmpty()) + { + uiName = pData->uiTitle; + } + else + { + uiName = pData->name; + uiName += " (GUI)"; + } - fHost.uiName = carla_strdup(uiName); + fHost.uiName = uiName.releaseBufferPointer(); } // --------------------------------------------------------------- diff --git a/source/backend/plugin/CarlaPluginVST2.cpp b/source/backend/plugin/CarlaPluginVST2.cpp index fa59cfcd1..bb811cda5 100644 --- a/source/backend/plugin/CarlaPluginVST2.cpp +++ b/source/backend/plugin/CarlaPluginVST2.cpp @@ -367,12 +367,12 @@ public: { CarlaPlugin::setName(newName); - if (fUI.window != nullptr) - { - CarlaString guiTitle(pData->name); - guiTitle += " (GUI)"; - fUI.window->setTitle(guiTitle.buffer()); - } + if (fUI.window == nullptr || pData->uiTitle.isNotEmpty()) + return; + + CarlaString uiTitle(pData->name); + uiTitle += " (GUI)"; + fUI.window->setTitle(uiTitle.buffer()); } // ------------------------------------------------------------------- @@ -490,8 +490,17 @@ public: if (yesNo) { - CarlaString uiTitle(pData->name); - uiTitle += " (GUI)"; + CarlaString uiTitle; + + if (pData->uiTitle.isNotEmpty()) + { + uiTitle = pData->uiTitle; + } + else + { + uiTitle = pData->name; + uiTitle += " (GUI)"; + } intptr_t value = 0; diff --git a/source/bridges-plugin/CarlaBridgeSingleLV2.cpp b/source/bridges-plugin/CarlaBridgeSingleLV2.cpp index 33c731111..132208c93 100644 --- a/source/bridges-plugin/CarlaBridgeSingleLV2.cpp +++ b/source/bridges-plugin/CarlaBridgeSingleLV2.cpp @@ -66,8 +66,7 @@ public: const char* const bundlePath, const LV2_Feature* const* const features) : Lv2PluginBaseClass(sampleRate, features), - fPlugin(nullptr), - fUiName() + fPlugin(nullptr) #ifdef USING_JUCE , fJuceInitialiser() #endif @@ -311,8 +310,6 @@ public: fUI.controller = controller; fUI.host = nullptr; - fUiName.clear(); - const LV2_URID_Map* uridMap = nullptr; // ------------------------------------------------------------------------------------------------------------ @@ -333,7 +330,7 @@ public: if (fUI.host != nullptr) { - fUiName = fUI.host->plugin_human_id; + fPlugin->setCustomUITitle(fUI.host->plugin_human_id); *widget = (LV2_External_UI_Widget_Compat*)this; return true; } @@ -341,6 +338,8 @@ public: // ------------------------------------------------------------------------------------------------------------ // no external-ui support, use showInterface + const char* uiTitle = nullptr; + for (int i=0; features[i] != nullptr; ++i) { if (std::strcmp(features[i]->URI, LV2_OPTIONS__options) == 0) @@ -351,7 +350,7 @@ public: { if (options[j].key == uridMap->map(uridMap->handle, LV2_UI__windowTitle)) { - fUiName = (const char*)options[j].value; + uiTitle = (const char*)options[j].value; break; } } @@ -359,9 +358,10 @@ public: } } - if (fUiName.isEmpty()) - fUiName = fPlugin->getName(); + if (uiTitle == nullptr) + uiTitle = fPlugin->getName(); + fPlugin->setCustomUITitle(uiTitle); *widget = nullptr; return true; } @@ -498,7 +498,6 @@ protected: private: CarlaPluginPtr fPlugin; - CarlaString fUiName; #ifdef USING_JUCE juce::SharedResourcePointer fJuceInitialiser;