117 auto isHeadless = commandLine.contains(
"--headless");
126 if (!AttachConsole(ATTACH_PARENT_PROCESS))
130 FILE* dummy =
nullptr;
131 freopen_s(&dummy,
"CON",
"r", stdin);
132 freopen_s(&dummy,
"CON",
"w", stdout);
133 freopen_s(&dummy,
"CON",
"w", stderr);
141 signal(SIGPIPE, SIG_IGN);
147 m_toolTipWindowInstance = std::make_unique<TooltipWindow>();
149 m_taskbarComponent = std::make_unique<MemaTaskbarComponent>([=](juce::Point<int> mousePosition) {
showUiAsCalloutBox(mousePosition); });
153 Mema::Mema::getInstance();
159 auto& proc = Mema::Mema::getInstance()->getMemaProcessor();
163 m_cliMenu = std::make_unique<Mema::HeadlessCLIMenu>(*proc);
164 m_cliMenu->startThread();
171 m_macMainMenu = std::make_unique<MemaMacMainMenuMenuBarModel>();
172 auto optionsPopupMenu = juce::PopupMenu();
173 optionsPopupMenu.addItem(
"Show as standalone window",
true,
false, [=]() {
174 if (
auto currentProcEditor = Mema::Mema::getInstance()->getMemaProcessorEditor())
175 if (
auto callout = currentProcEditor->findParentComponentOfClass<juce::CallOutBox>())
176 callout->exitModalState(0);
179 optionsPopupMenu.addSeparator();
180 optionsPopupMenu.addItem(
"Load config...",
true,
false, [=]() {
181 Mema::Mema::getInstance()->triggerPromptLoadConfig();
183 optionsPopupMenu.addItem(
"Save config...",
true,
false, [=]() {
184 Mema::Mema::getInstance()->triggerPromptSaveConfig();
186 m_macMainMenu->addMenu(0,
"Options", optionsPopupMenu);
188 juce::MenuBarModel::setMacMainMenu(m_macMainMenu.get());
212 if (!Mema::Mema::getInstanceWithoutCreating())
215 auto memaUIComponent = std::make_unique<Mema::MemaUIComponent>().release();
216 Mema::Mema::getInstance()->onEditorSizeChangeRequested = [memaUIComponent,
this](juce::Rectangle<int> requestedSize) {
217 m_lastRequestedEditorSize = requestedSize;
218 jassert(memaUIComponent);
219 if (memaUIComponent) memaUIComponent->handleEditorSizeChangeRequest(requestedSize);
221 Mema::Mema::getInstance()->onCpuUsageUpdate = [=](
int loadPercent) {
222 jassert(memaUIComponent);
223 if (memaUIComponent) memaUIComponent->updateCpuUsageBar(loadPercent);
225 Mema::Mema::getInstance()->onNetworkUsageUpdate = [=](std::map<int, std::pair<double, bool>> netLoads) {
226 jassert(memaUIComponent);
227 if (memaUIComponent) memaUIComponent->updateNetworkUsage(netLoads);
229 Mema::Mema::getInstance()->onServiceDiscoveryTopologyUpdate = [=](
const JUCEAppBasics::SessionServiceTopology& sessionServiceTopology) {
230 jassert(memaUIComponent);
231 if (memaUIComponent) memaUIComponent->updateSessionServiceTopology(sessionServiceTopology);
233 memaUIComponent->setEditorComponent(Mema::Mema::getInstance()->getMemaProcessorEditor());
234 memaUIComponent->setVisible(m_isMainComponentVisible);
235 memaUIComponent->addToDesktop(juce::ComponentPeer::windowHasDropShadow);
236 memaUIComponent->setTopLeftPosition(m_taskbarComponent->getX(), 50);
237 memaUIComponent->setName(ProjectInfo::projectName);
238 memaUIComponent->onToggleStandaloneWindow = [=](
bool standalone) {
241 if (
auto callout = memaUIComponent->findParentComponentOfClass<juce::CallOutBox>())
242 callout->exitModalState(0);
247 if (m_memaUIComponent)
248 m_memaUIComponent->setStandaloneWindow(
false);
252 memaUIComponent->onLookAndFeelChanged = [=]() {
253 if (Mema::Mema::getInstanceWithoutCreating()) Mema::Mema::getInstance()->propagateLookAndFeelChanged();
255 memaUIComponent->onAudioSetupMenuClicked = [=]() {
256 if (Mema::Mema::getInstanceWithoutCreating())
258 juce::PopupMenu setupMenu;
259 setupMenu.addCustomItem(1, std::make_unique<CustomAboutItem>(Mema::Mema::getInstance()->getDeviceSetupComponent(), juce::Rectangle<int>(300, 350)),
nullptr,
"Audio Device Setup");
260 setupMenu.showMenuAsync(juce::PopupMenu::Options());
263 memaUIComponent->onDeleted = [
this]() {
264 if (Mema::Mema::getInstanceWithoutCreating())
266 Mema::Mema::getInstance()->clearUICallbacks();
269 m_memaUIComponent.release();
270 m_memaUIComponent =
nullptr;
272 memaUIComponent->onSettingsChanged = [=]() {
273 jassert(memaUIComponent);
274 if (memaUIComponent && Mema::Mema::getInstanceWithoutCreating())
276 Mema::Mema::getInstance()->setUIConfigState(memaUIComponent->createStateXml());
277 JUCEAppBasics::AppConfigurationBase::getInstance()->triggerConfigurationDump();
280 memaUIComponent->onPaletteStyleChange = [=](
const JUCEAppBasics::CustomLookAndFeel::PaletteStyle& paletteStyle) {
281 m_lookAndFeel = std::make_unique<JUCEAppBasics::CustomLookAndFeel>(paletteStyle);
282 juce::Desktop::getInstance().setDefaultLookAndFeel(m_lookAndFeel.get());
284 memaUIComponent->onLoadConfig = [=]() {
285 Mema::Mema::getInstance()->triggerPromptLoadConfig();
287 memaUIComponent->onSaveConfig = [=]() {
288 Mema::Mema::getInstance()->triggerPromptSaveConfig();
291 memaUIComponent->handleEditorSizeChangeRequest(m_lastRequestedEditorSize);
292 memaUIComponent->lookAndFeelChanged();
293 memaUIComponent->setStateXml(Mema::Mema::getInstance()->getUIConfigState().get());
294 memaUIComponent->resized();
295 memaUIComponent->grabKeyboardFocus();
297 return std::unique_ptr<Mema::MemaUIComponent>(memaUIComponent);
332 m_memaUIComponent.reset();
334 jassert(m_memaUIComponent);
335 m_memaUIComponent->setStandaloneWindow(
true);
337 auto showPosition = juce::Desktop::getInstance().getMousePosition();
338 auto const display = juce::Desktop::getInstance().getDisplays().getPrimaryDisplay();
339 if (
nullptr != display &&
nullptr != m_memaUIComponent)
341 if (display->userArea.getHeight() < showPosition.getY() + m_memaUIComponent->getHeight())
342 showPosition.setY(showPosition.getY() - m_memaUIComponent->getHeight() - 30);
343 if (display->userArea.getWidth() < showPosition.getX() + m_memaUIComponent->getWidth())
344 showPosition.setX(showPosition.getX() - m_memaUIComponent->getWidth() - 30);
346 m_memaUIComponent->setTopLeftPosition(showPosition);