| @@ -32,6 +32,11 @@ | |||
| # include "../../dgl/src/pugl.hpp" | |||
| #endif | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| # include <map> | |||
| # include <string> | |||
| #endif | |||
| #if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI) | |||
| # define DISTRHO_UI_IS_STANDALONE 1 | |||
| #else | |||
| @@ -326,9 +331,10 @@ struct UI::PrivateData { | |||
| uint fgColor; | |||
| double scaleFactor; | |||
| uintptr_t winId; | |||
| #if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| char* uiStateFileKeyRequest; | |||
| #endif | |||
| std::map<std::string,std::string> lastUsedDirnames; | |||
| #endif | |||
| char* bundlePath; | |||
| // Ignore initial resize events while initializing | |||
| @@ -353,9 +359,9 @@ struct UI::PrivateData { | |||
| fgColor(0xffffffff), | |||
| scaleFactor(1.0), | |||
| winId(0), | |||
| #if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| uiStateFileKeyRequest(nullptr), | |||
| #endif | |||
| #endif | |||
| bundlePath(nullptr), | |||
| initializing(true), | |||
| callbacksPtr(nullptr), | |||
| @@ -366,32 +372,32 @@ struct UI::PrivateData { | |||
| setSizeCallbackFunc(nullptr), | |||
| fileRequestCallbackFunc(nullptr) | |||
| { | |||
| #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) | |||
| #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) | |||
| parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; | |||
| # if DISTRHO_PLUGIN_WANT_LATENCY | |||
| #if DISTRHO_PLUGIN_WANT_LATENCY | |||
| parameterOffset += 1; | |||
| # endif | |||
| #endif | |||
| #endif | |||
| #endif | |||
| #ifdef DISTRHO_PLUGIN_TARGET_LV2 | |||
| # if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) | |||
| #ifdef DISTRHO_PLUGIN_TARGET_LV2 | |||
| #if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) | |||
| parameterOffset += 1; | |||
| # endif | |||
| # if (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || DISTRHO_PLUGIN_WANT_STATE) | |||
| #endif | |||
| #if (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || DISTRHO_PLUGIN_WANT_STATE) | |||
| parameterOffset += 1; | |||
| # endif | |||
| #endif | |||
| #endif | |||
| #endif | |||
| #ifdef DISTRHO_PLUGIN_TARGET_VST3 | |||
| #ifdef DISTRHO_PLUGIN_TARGET_VST3 | |||
| parameterOffset += kVst3InternalParameterCount; | |||
| #endif | |||
| #endif | |||
| } | |||
| ~PrivateData() noexcept | |||
| { | |||
| #if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| std::free(uiStateFileKeyRequest); | |||
| #endif | |||
| #endif | |||
| std::free(bundlePath); | |||
| } | |||
| @@ -444,7 +450,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) | |||
| if (fileRequestCallbackFunc != nullptr) | |||
| return fileRequestCallbackFunc(callbacksPtr, key); | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| std::free(uiStateFileKeyRequest); | |||
| uiStateFileKeyRequest = strdup(key); | |||
| DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); | |||
| @@ -455,8 +461,10 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) | |||
| DGL_NAMESPACE::FileBrowserOptions opts; | |||
| opts.title = title; | |||
| if (lastUsedDirnames.count(key)) | |||
| opts.startDir = lastUsedDirnames[key].c_str(); | |||
| return window->openFileBrowser(opts); | |||
| #endif | |||
| #endif | |||
| return false; | |||
| } | |||
| @@ -472,7 +480,7 @@ inline void PluginWindow::onFileSelected(const char* const filename) | |||
| if (initializing) | |||
| return; | |||
| #if DISTRHO_PLUGIN_WANT_STATE | |||
| #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI | |||
| if (char* const key = ui->uiData->uiStateFileKeyRequest) | |||
| { | |||
| ui->uiData->uiStateFileKeyRequest = nullptr; | |||
| @@ -480,8 +488,13 @@ inline void PluginWindow::onFileSelected(const char* const filename) | |||
| { | |||
| // notify DSP | |||
| ui->setState(key, filename); | |||
| // notify UI | |||
| ui->stateChanged(key, filename); | |||
| // save dirname for next time | |||
| if (const char* const lastsep = std::strrchr(filename, DISTRHO_OS_SEP)) | |||
| ui->uiData->lastUsedDirnames[key] = std::string(filename, lastsep-filename); | |||
| } | |||
| std::free(key); | |||
| return; | |||