| @@ -26,6 +26,7 @@ | |||||
| #ifdef HAVE_LIBLO | #ifdef HAVE_LIBLO | ||||
| # include "CarlaOscUtils.hpp" | # include "CarlaOscUtils.hpp" | ||||
| # include "CarlaPipeUtils.hpp" | |||||
| # include "CarlaThread.hpp" | # include "CarlaThread.hpp" | ||||
| #endif | #endif | ||||
| @@ -146,55 +147,33 @@ public: | |||||
| { | { | ||||
| #ifdef CARLA_OS_LINUX | #ifdef CARLA_OS_LINUX | ||||
| const ScopedEngineEnvironmentLocker _seel(kEngine); | |||||
| /* | |||||
| * If the frontend uses winId parent, set LD_PRELOAD to auto-map the DSSI UI. | |||||
| * If not, unset LD_PRELOAD. | |||||
| */ | |||||
| const uintptr_t winId(kEngine->getOptions().frontendWinId); | |||||
| // get current LD_PRELOAD, will restore it later | |||||
| const char* const oldPreload(std::getenv("LD_PRELOAD")); | |||||
| // for CARLA_ENGINE_OPTION_FRONTEND_WIN_ID | |||||
| char winIdStr[STR_MAX+1]; | |||||
| winIdStr[STR_MAX] = '\0'; | |||||
| # ifdef HAVE_X11 | |||||
| // if the frontend uses winId parent, set LD_PRELOAD to auto-map the DSSI UI | |||||
| const uintptr_t winId = kEngine->getOptions().frontendWinId; | |||||
| // for LD_PRELOAD | |||||
| CarlaString ldPreloadValue; | |||||
| if (winId != 0) | if (winId != 0) | ||||
| { | { | ||||
| char strBuf[STR_MAX+1]; | |||||
| strBuf[STR_MAX] = '\0'; | |||||
| std::snprintf(strBuf, STR_MAX, P_UINTPTR, kEngine->getOptions().frontendWinId); | |||||
| ::setenv("CARLA_ENGINE_OPTION_FRONTEND_WIN_ID", strBuf, 1); | |||||
| CarlaString interposerPath(CarlaString(kEngine->getOptions().binaryDir) + | |||||
| CARLA_OS_SEP_STR "libcarla_interposer-x11.so"); | |||||
| ::setenv("LD_PRELOAD", interposerPath.buffer(), 1); | |||||
| std::snprintf(winIdStr, STR_MAX, P_UINTPTR, kEngine->getOptions().frontendWinId); | |||||
| ldPreloadValue = (CarlaString(kEngine->getOptions().binaryDir) + CARLA_OS_SEP_STR "libcarla_interposer-x11.so"); | |||||
| } | } | ||||
| else | |||||
| # else | |||||
| // if no X11 or winId set, simply unset LD_PRELOAD | |||||
| // (it might be set to libcarla_interposer-safe) | |||||
| if (oldPreload != nullptr) | |||||
| ::unsetenv("LD_PRELOAD"); | |||||
| # endif | |||||
| const ScopedEngineEnvironmentLocker _seel(kEngine); | |||||
| const ScopedEnvVar _sev1("CARLA_ENGINE_OPTION_FRONTEND_WIN_ID", winIdStr[0] != '\0' ? winIdStr : nullptr); | |||||
| const ScopedEnvVar _sev2("LD_PRELOAD", ldPreloadValue.isNotEmpty() ? ldPreloadValue.buffer() : nullptr); | |||||
| #endif // CARLA_OS_LINUX | #endif // CARLA_OS_LINUX | ||||
| // start the DSSI UI application | // start the DSSI UI application | ||||
| carla_stdout("starting DSSI UI..."); | carla_stdout("starting DSSI UI..."); | ||||
| started = fProcess->start(arguments); | started = fProcess->start(arguments); | ||||
| #ifdef CARLA_OS_LINUX | |||||
| // restore initial state | |||||
| if (oldPreload != nullptr) | |||||
| { | |||||
| ::setenv("LD_PRELOAD", oldPreload, 1); | |||||
| } | |||||
| # ifdef HAVE_X11 | |||||
| if (winId != 0) | |||||
| { | |||||
| ::unsetenv("CARLA_ENGINE_OPTION_FRONTEND_WIN_ID"); | |||||
| if (oldPreload == nullptr) | |||||
| ::unsetenv("LD_PRELOAD"); | |||||
| } | |||||
| # endif | |||||
| #endif // CARLA_OS_LINUX | |||||
| } | } | ||||
| if (! started) | if (! started) | ||||