Browse Source

Send ui options to bridges

tags/1.9.6
falkTX 11 years ago
parent
commit
ebc8d83bee
9 changed files with 154 additions and 104 deletions
  1. +46
    -9
      source/backend/plugin/CarlaPluginLV2.cpp
  2. +7
    -10
      source/bridges-ui/CarlaBridgeToolkitGtk.cpp
  3. +3
    -1
      source/bridges-ui/CarlaBridgeToolkitPlugin.cpp
  4. +8
    -0
      source/bridges-ui/CarlaBridgeUI-LV2.cpp
  5. +33
    -36
      source/bridges-ui/CarlaBridgeUI.cpp
  6. +3
    -3
      source/bridges-ui/CarlaBridgeUI.hpp
  7. +8
    -4
      source/utils/CarlaExternalUI.hpp
  8. +27
    -25
      source/utils/CarlaPipeUtils.cpp
  9. +19
    -16
      source/utils/CarlaPipeUtils.hpp

+ 46
- 9
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -420,9 +420,45 @@ public:
fUiURI = uiURI; fUiURI = uiURI;
} }


void startPipeServer() noexcept
bool startPipeServer() noexcept
{ {
CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI);
return CarlaPipeServer::startPipeServer(fFilename, fPluginURI, fUiURI);
}

void writeUiOptionsMessage(const bool useTheme, const bool useThemeColors, const char* const windowTitle, uintptr_t transientWindowId) const noexcept
{
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';

const CarlaMutexLocker cml(getPipeLock());

_writeMsgBuffer("uiOptions\n", 10);

{
std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(useTheme));
_writeMsgBuffer(tmpBuf, std::strlen(tmpBuf));

std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(useThemeColors));
_writeMsgBuffer(tmpBuf, std::strlen(tmpBuf));

writeAndFixMessage(windowTitle != nullptr ? windowTitle : "");

std::snprintf(tmpBuf, 0xff, P_INTPTR "\n", transientWindowId);
_writeMsgBuffer(tmpBuf, std::strlen(tmpBuf));
}

flushMessages();
}

void writeUiTitleMessage(const char* const title) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(title != nullptr && title[0] != '\0',);

const CarlaMutexLocker cml(getPipeLock());

_writeMsgBuffer("uiTitle\n", 8);
writeAndFixMessage(title);
flushMessages();
} }


protected: protected:
@@ -1190,6 +1226,8 @@ public:
{ {
CARLA_SAFE_ASSERT_RETURN(fUI.type != UI::TYPE_NULL,); CARLA_SAFE_ASSERT_RETURN(fUI.type != UI::TYPE_NULL,);


const uintptr_t frontendWinId(pData->engine->getOptions().frontendWinId);

if (! yesNo) if (! yesNo)
pData->transientTryCounter = 0; pData->transientTryCounter = 0;


@@ -1203,12 +1241,16 @@ public:
return; return;
} }


fPipeServer.startPipeServer();
if (! fPipeServer.startPipeServer())
{
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr);
return;
}


for (std::size_t i=CARLA_URI_MAP_ID_COUNT, count=fCustomURIDs.count(); i < count; ++i) for (std::size_t i=CARLA_URI_MAP_ID_COUNT, count=fCustomURIDs.count(); i < count; ++i)
fPipeServer.writeLv2UridMessage(static_cast<uint32_t>(i), fCustomURIDs.getAt(i, nullptr)); fPipeServer.writeLv2UridMessage(static_cast<uint32_t>(i), fCustomURIDs.getAt(i, nullptr));


fPipeServer.writeLv2UridMessage(CARLA_URI_MAP_ID_NULL, "Complete");
fPipeServer.writeUiOptionsMessage(true, true, fLv2Options.windowTitle, frontendWinId);


fPipeServer.writeShowMessage(); fPipeServer.writeShowMessage();
} }
@@ -1242,7 +1284,6 @@ public:
if (fUI.type == UI::TYPE_EMBED) if (fUI.type == UI::TYPE_EMBED)
{ {
const char* msg = nullptr; const char* msg = nullptr;
const uintptr_t frontendWinId(pData->engine->getOptions().frontendWinId);


switch (fUI.rdfDescriptor->Type) switch (fUI.rdfDescriptor->Type)
{ {
@@ -1285,11 +1326,7 @@ public:
} }


if (fUI.window == nullptr && fExt.uishow == nullptr) if (fUI.window == nullptr && fExt.uishow == nullptr)
{
return pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, -1, 0, 0.0f, msg); return pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, -1, 0, 0.0f, msg);
// unused
(void)frontendWinId;
}


if (fUI.window != nullptr) if (fUI.window != nullptr)
{ {


+ 7
- 10
source/bridges-ui/CarlaBridgeToolkitGtk.cpp View File

@@ -180,11 +180,10 @@ protected:
{ {
carla_debug("CarlaBridgeToolkitGtk::handleRealize()"); carla_debug("CarlaBridgeToolkitGtk::handleRealize()");


#ifdef CARLA_OS_LINUX
if (const char* const winIdStr = std::getenv("ENGINE_OPTION_FRONTEND_WIN_ID"))
if (const long long winId = std::strtoll(winIdStr, nullptr, 16))
setTransient(static_cast<uintptr_t>(winId));
#endif
const CarlaBridgeUI::Options& options(ui->getOptions());

if (options.transientWindowId != 0)
setTransient(options.transientWindowId);
} }


gboolean handleTimeout() gboolean handleTimeout()
@@ -203,7 +202,6 @@ protected:
return true; return true;
} }


#ifdef CARLA_OS_LINUX
void setTransient(const uintptr_t winId) void setTransient(const uintptr_t winId)
{ {
CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,); CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,);
@@ -212,7 +210,7 @@ protected:
GdkWindow* const gdkWindow(gtk_widget_get_window(fWindow)); GdkWindow* const gdkWindow(gtk_widget_get_window(fWindow));
CARLA_SAFE_ASSERT_RETURN(gdkWindow != nullptr,); CARLA_SAFE_ASSERT_RETURN(gdkWindow != nullptr,);


# ifdef BRIDGE_GTK3
#ifdef BRIDGE_GTK3
GdkDisplay* const gdkDisplay(gdk_window_get_display(gdkWindow)); GdkDisplay* const gdkDisplay(gdk_window_get_display(gdkWindow));
CARLA_SAFE_ASSERT_RETURN(gdkDisplay != nullptr,); CARLA_SAFE_ASSERT_RETURN(gdkDisplay != nullptr,);


@@ -221,17 +219,16 @@ protected:


const ::XID xid(gdk_x11_window_get_xid(gdkWindow)); const ::XID xid(gdk_x11_window_get_xid(gdkWindow));
CARLA_SAFE_ASSERT_RETURN(xid != 0,); CARLA_SAFE_ASSERT_RETURN(xid != 0,);
# else
#else
::Display* const display(gdk_x11_drawable_get_xdisplay(gdkWindow)); ::Display* const display(gdk_x11_drawable_get_xdisplay(gdkWindow));
CARLA_SAFE_ASSERT_RETURN(display != nullptr,); CARLA_SAFE_ASSERT_RETURN(display != nullptr,);


const ::XID xid(gdk_x11_drawable_get_xid(gdkWindow)); const ::XID xid(gdk_x11_drawable_get_xid(gdkWindow));
CARLA_SAFE_ASSERT_RETURN(xid != 0,); CARLA_SAFE_ASSERT_RETURN(xid != 0,);
# endif
#endif


XSetTransientForHint(display, xid, static_cast< ::Window>(winId)); XSetTransientForHint(display, xid, static_cast< ::Window>(winId));
} }
#endif


// --------------------------------------------------------------------- // ---------------------------------------------------------------------




+ 3
- 1
source/bridges-ui/CarlaBridgeToolkitPlugin.cpp View File

@@ -66,7 +66,9 @@ public:
CARLA_SAFE_ASSERT_RETURN(fUI != nullptr, false); CARLA_SAFE_ASSERT_RETURN(fUI != nullptr, false);


fUI->setTitle(options.windowTitle.buffer()); fUI->setTitle(options.windowTitle.buffer());
fUI->setTransientWinId(options.transientWindowId);

if (options.transientWindowId != 0)
fUI->setTransientWinId(options.transientWindowId);


return true; return true;
} }


+ 8
- 0
source/bridges-ui/CarlaBridgeUI-LV2.cpp View File

@@ -606,6 +606,14 @@ public:
fCustomURIDs.append(carla_strdup(uri)); fCustomURIDs.append(carla_strdup(uri));
} }


void uiOptionsChanged(const bool useTheme, const bool useThemeColors, const char* const windowTitle, uintptr_t transientWindowId) override
{
fUiOptions.useTheme = useTheme;
fUiOptions.useThemeColors = useThemeColors;
fUiOptions.windowTitle = windowTitle;
fUiOptions.transientWindowId = transientWindowId;
}

// --------------------------------------------------------------------- // ---------------------------------------------------------------------


LV2_URID getCustomURID(const char* const uri) LV2_URID getCustomURID(const char* const uri)


+ 33
- 36
source/bridges-ui/CarlaBridgeUI.cpp View File

@@ -33,9 +33,7 @@ CARLA_BRIDGE_START_NAMESPACE
CarlaBridgeUI::CarlaBridgeUI() noexcept CarlaBridgeUI::CarlaBridgeUI() noexcept
: CarlaPipeClient(), : CarlaPipeClient(),
fQuitReceived(false), fQuitReceived(false),
#ifdef BRIDGE_LV2
fUridMapComplete(false),
#endif
fGotOptions(false),
fToolkit(nullptr), fToolkit(nullptr),
fLib(nullptr), fLib(nullptr),
fLibFilename(), fLibFilename(),
@@ -110,11 +108,9 @@ const char* CarlaBridgeUI::libError() const noexcept


bool CarlaBridgeUI::msgReceived(const char* const msg) noexcept bool CarlaBridgeUI::msgReceived(const char* const msg) noexcept
{ {
#ifdef BRIDGE_LV2
if (! fUridMapComplete) {
CARLA_SAFE_ASSERT_RETURN(std::strcmp(msg, "urid") == 0, true);
}
#endif
if (! fGotOptions) {
CARLA_SAFE_ASSERT_RETURN(std::strcmp(msg, "urid") == 0 || std::strcmp(msg, "uiOptions") == 0, true);
}


if (std::strcmp(msg, "control") == 0) if (std::strcmp(msg, "control") == 0)
{ {
@@ -206,21 +202,32 @@ bool CarlaBridgeUI::msgReceived(const char* const msg) noexcept
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri), true);


if (urid == 0)
{
CARLA_SAFE_ASSERT_RETURN(std::strcmp(uri, "Complete") == 0, true);
fUridMapComplete = true;
}
else
{
if (urid != 0)
dspURIDReceived(urid, uri); dspURIDReceived(urid, uri);
}


delete[] uri; delete[] uri;
return true; return true;
} }
#endif #endif


if (std::strcmp(msg, "uiOptions") == 0)
{
bool useTheme, useThemeColors;
const char* windowTitle;
uint64_t transientWindowId;

CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(useTheme), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(useThemeColors), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(windowTitle), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsULong(transientWindowId), true);

fGotOptions = true;
uiOptionsChanged(useTheme, useThemeColors, windowTitle, transientWindowId);

delete[] windowTitle;
return true;
}

CARLA_SAFE_ASSERT_RETURN(fToolkit != nullptr, true); CARLA_SAFE_ASSERT_RETURN(fToolkit != nullptr, true);


if (std::strcmp(msg, "show") == 0) if (std::strcmp(msg, "show") == 0)
@@ -272,40 +279,30 @@ bool CarlaBridgeUI::init(const int argc, const char* argv[])
{ {
CARLA_SAFE_ASSERT_RETURN(fToolkit != nullptr, false); CARLA_SAFE_ASSERT_RETURN(fToolkit != nullptr, false);


if (! fToolkit->init(argc, argv))
return false;

if (argc == 7) if (argc == 7)
{ {
if (! initPipeClient(argv)) if (! initPipeClient(argv))
{
fToolkit->quit();
delete fToolkit;
fToolkit = nullptr;
return false; return false;
}


#ifdef BRIDGE_LV2
// wait for URID map to complete
for (int i=0; i<20 && ! fUridMapComplete; ++i)
// wait for ui options, FIXME
for (int i=0; i<20 && ! fGotOptions; ++i)
{ {
idlePipe();
idlePipe(true);
carla_msleep(100); carla_msleep(100);
} }


if (! fUridMapComplete)
if (! fGotOptions)
{ {
fToolkit->quit();
delete fToolkit;
fToolkit = nullptr;
closePipeClient(); closePipeClient();
return false;
} }
#endif
} }
else

if (! fToolkit->init(argc, argv))
{ {
// no mapping needed
fUridMapComplete = true;
if (argc == 7)
closePipeClient();
return false;
} }


return true; return true;


+ 3
- 3
source/bridges-ui/CarlaBridgeUI.hpp View File

@@ -75,6 +75,8 @@ protected:
virtual void dspURIDReceived(const LV2_URID urid, const char* const uri) = 0; virtual void dspURIDReceived(const LV2_URID urid, const char* const uri) = 0;
#endif #endif


virtual void uiOptionsChanged(const bool useTheme, const bool useThemeColors, const char* const windowTitle, uintptr_t transientWindowId) = 0;

public: public:
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// UI initialization // UI initialization
@@ -143,9 +145,7 @@ public:


protected: protected:
bool fQuitReceived; bool fQuitReceived;
#ifdef BRIDGE_LV2
bool fUridMapComplete;
#endif
bool fGotOptions;
CarlaBridgeToolkit* fToolkit; CarlaBridgeToolkit* fToolkit;


lib_t fLib; lib_t fLib;


+ 8
- 4
source/utils/CarlaExternalUI.hpp View File

@@ -59,12 +59,16 @@ public:
fUiTitle = uiTitle; fUiTitle = uiTitle;
} }


void startPipeServer(const bool show = true) noexcept
bool startPipeServer(const bool show = true) noexcept
{ {
CarlaPipeServer::startPipeServer(fFilename, fSampleRate, fUiTitle);
if (CarlaPipeServer::startPipeServer(fFilename, fSampleRate, fUiTitle))
{
if (show)
writeShowMessage();
return true;
}


if (show)
writeShowMessage();
return false;
} }


protected: protected:


+ 27
- 25
source/utils/CarlaPipeUtils.cpp View File

@@ -481,7 +481,7 @@ bool CarlaPipeCommon::isPipeRunning() const noexcept
return (pData->pipeRecv != INVALID_PIPE_VALUE && pData->pipeSend != INVALID_PIPE_VALUE); return (pData->pipeRecv != INVALID_PIPE_VALUE && pData->pipeSend != INVALID_PIPE_VALUE);
} }


void CarlaPipeCommon::idlePipe() noexcept
void CarlaPipeCommon::idlePipe(const bool onlyOnce) noexcept
{ {
const char* locale = nullptr; const char* locale = nullptr;


@@ -492,7 +492,7 @@ void CarlaPipeCommon::idlePipe() noexcept
if (msg == nullptr) if (msg == nullptr)
break; break;


if (locale == nullptr)
if (locale == nullptr && ! onlyOnce)
{ {
locale = carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr)); locale = carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr));
::setlocale(LC_NUMERIC, "C"); ::setlocale(LC_NUMERIC, "C");
@@ -507,6 +507,9 @@ void CarlaPipeCommon::idlePipe() noexcept
pData->isReading = false; pData->isReading = false;


delete[] msg; delete[] msg;

if (onlyOnce)
break;
} }


if (locale != nullptr) if (locale != nullptr)
@@ -765,27 +768,6 @@ bool CarlaPipeCommon::flushMessages() const noexcept


// ------------------------------------------------------------------- // -------------------------------------------------------------------


void CarlaPipeCommon::writeShowMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);
flushMessages();
}

void CarlaPipeCommon::writeFocusMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("focus\n", 6);
flushMessages();
}

void CarlaPipeCommon::writeHideMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);
flushMessages();
}

void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(error != nullptr && error[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(error != nullptr && error[0] != '\0',);
@@ -796,8 +778,6 @@ void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept
flushMessages(); flushMessages();
} }


// -------------------------------------------------------------------

void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float value) const noexcept void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float value) const noexcept
{ {
char tmpBuf[0xff+1]; char tmpBuf[0xff+1];
@@ -931,6 +911,7 @@ void CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom*


void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const uri) const noexcept void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const uri) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(urid != 0,);
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',);


char tmpBuf[0xff+1]; char tmpBuf[0xff+1];
@@ -1380,6 +1361,27 @@ void CarlaPipeServer::closePipeServer() noexcept
} }
} }


void CarlaPipeServer::writeShowMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);
flushMessages();
}

void CarlaPipeServer::writeFocusMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("focus\n", 6);
flushMessages();
}

void CarlaPipeServer::writeHideMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);
flushMessages();
}

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


CarlaPipeClient::CarlaPipeClient() noexcept CarlaPipeClient::CarlaPipeClient() noexcept


+ 19
- 16
source/utils/CarlaPipeUtils.hpp View File

@@ -65,7 +65,7 @@ public:
/*! /*!
* Check the pipe for new messages and send them to msgReceived(). * Check the pipe for new messages and send them to msgReceived().
*/ */
void idlePipe() noexcept;
void idlePipe(const bool onlyOnce = false) noexcept;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// write lock // write lock
@@ -168,21 +168,6 @@ public:
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// write prepared messages, no lock or flush needed (done internally) // write prepared messages, no lock or flush needed (done internally)


/*!
* Write a single "show" message.
*/
void writeShowMessage() const noexcept;

/*!
* Write a single "focus" message.
*/
void writeFocusMessage() const noexcept;

/*!
* Write a single "hide" message.
*/
void writeHideMessage() const noexcept;

/*! /*!
* Write an "error" message. * Write an "error" message.
*/ */
@@ -276,6 +261,24 @@ public:
*/ */
void closePipeServer() noexcept; void closePipeServer() noexcept;


// -------------------------------------------------------------------
// write prepared messages, no lock or flush needed (done internally)

/*!
* Write a single "show" message.
*/
void writeShowMessage() const noexcept;

/*!
* Write a single "focus" message.
*/
void writeFocusMessage() const noexcept;

/*!
* Write a single "hide" message.
*/
void writeHideMessage() const noexcept;

CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeServer) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeServer)
}; };




Loading…
Cancel
Save