@@ -85,7 +85,7 @@ public: | |||
gtk_container_add(GTK_CONTAINER(fWindow), widget); | |||
gtk_window_set_resizable(gtkWindow, options.isResizable); | |||
gtk_window_set_title(gtkWindow, options.windowTitle); | |||
gtk_window_set_title(gtkWindow, options.windowTitle.buffer()); | |||
if (showUI || fNeedsShow) | |||
{ | |||
@@ -195,14 +195,10 @@ protected: | |||
gtk_window_get_size(GTK_WINDOW(fWindow), &fLastWidth, &fLastHeight); | |||
} | |||
ui->idlePipe(); | |||
ui->idleUI(); | |||
if (ui->isPipeRunning()) | |||
ui->idlePipe(); | |||
// if (! fUi) | |||
// { | |||
// gtk_main_quit_if_needed(); | |||
// return false; | |||
// } | |||
ui->idleUI(); | |||
return true; | |||
} | |||
@@ -65,7 +65,7 @@ public: | |||
#endif | |||
CARLA_SAFE_ASSERT_RETURN(fUI != nullptr, false); | |||
fUI->setTitle(options.windowTitle); | |||
fUI->setTitle(options.windowTitle.buffer()); | |||
fUI->setTransientWinId(options.transientWindowId); | |||
return true; | |||
@@ -90,12 +90,12 @@ public: | |||
for (; fIdling;) | |||
{ | |||
fUI->idle(); | |||
ui->idlePipe(); | |||
if (ui->isPipeRunning()) | |||
ui->idlePipe(); | |||
ui->idleUI(); | |||
//if (! kClient->oscIdle()) | |||
// break; | |||
fUI->idle(); | |||
#if defined(CARLA_OS_WIN) || defined(CARLA_OS_MAC) | |||
if (MessageManager* const msgMgr = MessageManager::getInstance()) | |||
@@ -108,13 +108,16 @@ public: | |||
void quit() override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fUI != nullptr,); | |||
carla_debug("CarlaBridgeToolkitPlugin::quit()"); | |||
fIdling = false; | |||
delete fUI; | |||
fUI = nullptr; | |||
if (fUI != nullptr) | |||
{ | |||
fUI->hide(); | |||
delete fUI; | |||
fUI = nullptr; | |||
} | |||
} | |||
void show() override | |||
@@ -112,7 +112,7 @@ public: | |||
} | |||
fWindow->setWindowIcon(QIcon::fromTheme("carla", QIcon(":/scalable/carla.svg"))); | |||
fWindow->setWindowTitle(options.windowTitle); | |||
fWindow->setWindowTitle(options.windowTitle.buffer()); | |||
if (options.transientWindowId != 0) | |||
{ | |||
@@ -226,15 +226,10 @@ protected: | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(ui != nullptr,); | |||
ui->idlePipe(); | |||
ui->idleUI(); | |||
if (ui->isPipeRunning()) | |||
ui->idlePipe(); | |||
// if (! kClient->oscIdle()) | |||
// { | |||
// killTimer(fMsgTimer); | |||
// fMsgTimer = 0; | |||
// fApp->quit(); | |||
// } | |||
ui->idleUI(); | |||
} | |||
private: | |||
@@ -377,12 +377,6 @@ public: | |||
bool init(const int argc, const char* argv[]) override | |||
{ | |||
// ----------------------------------------------------------------- | |||
// init UI | |||
if (! CarlaBridgeUI::init(argc, argv)) | |||
return false; | |||
const char* pluginURI = argv[1]; | |||
const char* uiURI = argv[2]; | |||
@@ -422,6 +416,45 @@ public: | |||
CARLA_SAFE_ASSERT_RETURN(fRdfUiDescriptor != nullptr, false); | |||
// ----------------------------------------------------------- | |||
// check if not resizable | |||
#if defined(BRIDGE_COCOA) || defined(BRIDGE_HWND) || defined(BRIDGE_X11) | |||
// embed UIs can only be resizable if they provide resize extension | |||
fUiOptions.isResizable = false; | |||
for (uint32_t i=0; i < fRdfUiDescriptor->ExtensionCount; ++i) | |||
{ | |||
carla_stdout("Test UI extension %s", fRdfUiDescriptor->Extensions[i]); | |||
if (std::strcmp(fRdfUiDescriptor->Extensions[i], LV2_UI__resize) == 0) | |||
{ | |||
fUiOptions.isResizable = true; | |||
break; | |||
} | |||
} | |||
#endif | |||
for (uint32_t i=0; i < fRdfUiDescriptor->FeatureCount; ++i) | |||
{ | |||
carla_stdout("Test UI feature %s", fRdfUiDescriptor->Features[i].URI); | |||
if (std::strcmp(fRdfUiDescriptor->Features[i].URI, LV2_UI__fixedSize ) == 0 || | |||
std::strcmp(fRdfUiDescriptor->Features[i].URI, LV2_UI__noUserResize) == 0) | |||
{ | |||
fUiOptions.isResizable = false; | |||
break; | |||
} | |||
} | |||
carla_stdout("Is resizable => %s", bool2str(fUiOptions.isResizable)); | |||
// ----------------------------------------------------------------- | |||
// init UI | |||
if (! CarlaBridgeUI::init(argc, argv)) | |||
return false; | |||
// ----------------------------------------------------------------- | |||
// open DLL | |||
@@ -465,19 +498,6 @@ public: | |||
fHandle = fDescriptor->instantiate(fDescriptor, fRdfDescriptor->URI, fRdfUiDescriptor->Bundle, carla_lv2_ui_write_function, this, &fWidget, fFeatures); | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, false); | |||
// ----------------------------------------------------------- | |||
// check if not resizable | |||
for (uint32_t j=0; j < fRdfUiDescriptor->FeatureCount; ++j) | |||
{ | |||
if (std::strcmp(fRdfUiDescriptor->Features[j].URI, LV2_UI__fixedSize ) == 0 || | |||
std::strcmp(fRdfUiDescriptor->Features[j].URI, LV2_UI__noUserResize) == 0) | |||
{ | |||
fUiOptions.isResizable = false; | |||
break; | |||
} | |||
} | |||
// ----------------------------------------------------------- | |||
// check for known extensions | |||
@@ -568,7 +588,7 @@ public: | |||
void dspAtomReceived(const uint32_t portIndex, const LV2_Atom* const atom) override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,) | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(atom != nullptr,); | |||
@@ -245,6 +245,8 @@ bool CarlaBridgeUI::msgReceived(const char* const msg) noexcept | |||
{ | |||
fQuitReceived = true; | |||
fToolkit->quit(); | |||
delete fToolkit; | |||
fToolkit = nullptr; | |||
return true; | |||
} | |||
@@ -300,6 +302,11 @@ bool CarlaBridgeUI::init(const int argc, const char* argv[]) | |||
} | |||
#endif | |||
} | |||
else | |||
{ | |||
// no mapping needed | |||
fUridMapComplete = true; | |||
} | |||
return true; | |||
} | |||
@@ -21,6 +21,7 @@ | |||
#include "CarlaBridgeToolkit.hpp" | |||
#include "CarlaLibUtils.hpp" | |||
#include "CarlaPipeUtils.hpp" | |||
#include "CarlaString.hpp" | |||
#ifdef BRIDGE_LV2 | |||
# include "lv2/atom.h" | |||
@@ -115,7 +116,7 @@ public: | |||
/*! | |||
* Window title. | |||
*/ | |||
const char* windowTitle; | |||
CarlaString windowTitle; | |||
/*! | |||
* Transient window id (parent), null if zero. | |||
@@ -129,7 +130,7 @@ public: | |||
: isResizable(true), | |||
useTheme(true), | |||
useThemeColors(true), | |||
windowTitle(nullptr), | |||
windowTitle("TestUI"), | |||
transientWindowId(0) {} | |||
}; | |||