26JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance =
nullptr;
27JUCEApplicationBase* JUCEApplicationBase::appInstance =
nullptr;
30void* JUCEApplicationBase::iOSCustomDelegate =
nullptr;
33JUCEApplicationBase::JUCEApplicationBase()
41 jassert (appInstance ==
this);
42 appInstance =
nullptr;
51void JUCEApplicationBase::appWillTerminateByForce()
56 const std::unique_ptr<JUCEApplicationBase>
app (appInstance);
72void JUCEApplicationBase::sendUnhandledException (
const std::exception*
const e,
89#if ! (JUCE_IOS || JUCE_ANDROID)
90 #define JUCE_HANDLE_MULTIPLE_INSTANCES 1
93#if JUCE_HANDLE_MULTIPLE_INSTANCES
94struct JUCEApplicationBase::MultipleInstanceHandler :
public ActionListener
96 MultipleInstanceHandler (
const String& appName)
97 : appLock (
"juceAppLock_" + appName)
101 bool sendCommandLineToPreexistingInstance()
103 if (appLock.enter (0))
116 void actionListenerCallback (
const String& message)
override
120 auto appName = app->getApplicationName();
122 if (message.startsWith (appName +
"/"))
123 app->anotherInstanceStarted (message.substring (appName.length() + 1));
128 InterProcessLock appLock;
130 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultipleInstanceHandler)
133bool JUCEApplicationBase::sendCommandLineToPreexistingInstance()
135 jassert (multipleInstanceHandler ==
nullptr);
138 return multipleInstanceHandler->sendCommandLineToPreexistingInstance();
142struct JUCEApplicationBase::MultipleInstanceHandler {};
153#if JUCE_WINDOWS && ! defined (_CONSOLE)
158 CharPointer_UTF16 (L
" "),
159 CharPointer_UTF16 (L
"\"")).findEndOfWhitespace();
167 if (
auto argv = CommandLineToArgvW (GetCommandLineW(), &argc))
169 s = StringArray (argv + 1, argc - 1);
179 extern int juce_iOSMain (
int argc,
const char* argv[],
void* classPtr);
183 extern void initialiseNSApplication();
186#if JUCE_LINUX && JUCE_MODULE_AVAILABLE_juce_gui_extra && (! defined(JUCE_WEB_BROWSER) || JUCE_WEB_BROWSER)
187 extern int juce_gtkWebkitMain (
int argc,
const char* argv[]);
191 const char*
const* juce_argv =
nullptr;
194 extern const char*
const* juce_argv;
195 extern int juce_argc;
202 for (
int i = 1; i < juce_argc; ++i)
206 if (
arg.containsChar (
' ') && !
arg.isQuotedString())
220int JUCEApplicationBase::main (
int argc,
const char*
argv[])
231 #if JUCE_LINUX && JUCE_MODULE_AVAILABLE_juce_gui_extra && (! defined(JUCE_WEB_BROWSER) || JUCE_WEB_BROWSER)
232 if (
argc >= 2 &&
String (
argv[1]) ==
"--juce-gtkwebkitfork-child")
240 return JUCEApplicationBase::main();
248int JUCEApplicationBase::main()
250 ScopedJuceInitialiser_GUI libraryInitialiser;
251 jassert (createInstance !=
nullptr);
253 const std::unique_ptr<JUCEApplicationBase> app (createInstance());
254 jassert (app !=
nullptr);
256 if (! app->initialiseApp())
257 return app->shutdownApp();
266 return app->shutdownApp();
272bool JUCEApplicationBase::initialiseApp()
274 #if JUCE_HANDLE_MULTIPLE_INSTANCES
277 DBG (
"Another instance is running - quitting...");
282 #if JUCE_WINDOWS && JUCE_STANDALONE_APPLICATION && (! defined (_CONSOLE)) && (! JUCE_MINGW)
283 if (AttachConsole (ATTACH_PARENT_PROCESS) != 0)
290 if (_fileno(stdout) < 0) freopen_s (&ignore,
"CONOUT$",
"w", stdout);
291 if (_fileno(stderr) < 0) freopen_s (&ignore,
"CONOUT$",
"w", stderr);
292 if (_fileno(stdin) < 0) freopen_s (&ignore,
"CONIN$",
"r", stdin);
299 stillInitialising =
false;
304 #if JUCE_HANDLE_MULTIPLE_INSTANCES
305 if (
auto* mih = multipleInstanceHandler.get())
312int JUCEApplicationBase::shutdownApp()
316 #if JUCE_HANDLE_MULTIPLE_INSTANCES
317 if (
auto* mih = multipleInstanceHandler.get())
328 multipleInstanceHandler.reset();
static Type findEndOfToken(Type text, BreakType breakCharacters, Type quoteCharacters)
static bool isAbsolutePath(StringRef path)
virtual ~JUCEApplicationBase()
virtual void initialise(const String &commandLineParameters)=0
virtual const String getApplicationName()=0
static String JUCE_CALLTYPE getCommandLineParameters()
static StringArray JUCE_CALLTYPE getCommandLineParameterArray()
void setApplicationReturnValue(int newReturnValue) noexcept
static JUCEApplicationBase * getInstance() noexcept
static bool isStandaloneApp() noexcept
virtual bool moreThanOneInstanceAllowed()=0
int getApplicationReturnValue() const noexcept
static void broadcastMessage(const String &messageText)
static void deleteInstance()
static MessageManager * getInstance()