@@ -120,13 +120,13 @@ using namespace JUCE_NAMESPACE; | |||
#define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) | |||
static int numPendingMessages = 0; | |||
static bool flushingMessages = false; | |||
@interface JuceAppDelegate : NSObject | |||
{ | |||
@private | |||
id oldDelegate; | |||
AppDelegateRedirector* redirector; | |||
bool flushingMessages; | |||
} | |||
- (JuceAppDelegate*) init; | |||
@@ -218,6 +218,7 @@ static bool flushingMessages = false; | |||
- (void) customEvent: (id) n | |||
{ | |||
atomicDecrement (numPendingMessages); | |||
[self release]; | |||
NSData* data = (NSData*) n; | |||
void* message = 0; | |||
@@ -398,23 +399,27 @@ void MessageManager::doPlatformSpecificInitialisation() | |||
void MessageManager::doPlatformSpecificShutdown() | |||
{ | |||
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: juceAppDelegate]; | |||
[[NSNotificationCenter defaultCenter] removeObserver: juceAppDelegate]; | |||
// Annoyingly, cancelPerformSelectorsWithTarget can't actually cancel the messages | |||
// sent by performSelectorOnMainThread, so need to manually flush these before quitting.. | |||
flushingMessages = true; | |||
if (JUCEApplication::getInstance() != 0) // (must avoid blocking here when running as a plugin) | |||
for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||
getInstance()->runDispatchLoopUntil (10); | |||
[juceAppDelegate release]; | |||
juceAppDelegate = 0; | |||
if (juceAppDelegate != 0) | |||
{ | |||
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: juceAppDelegate]; | |||
[[NSNotificationCenter defaultCenter] removeObserver: juceAppDelegate]; | |||
// Annoyingly, cancelPerformSelectorsWithTarget can't actually cancel the messages | |||
// sent by performSelectorOnMainThread, so need to manually flush these before quitting.. | |||
juceAppDelegate->flushingMessages = true; | |||
if (JUCEApplication::getInstance() != 0) // (must avoid blocking here when running as a plugin) | |||
for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||
getInstance()->runDispatchLoopUntil (10); | |||
[juceAppDelegate release]; | |||
juceAppDelegate = 0; | |||
} | |||
} | |||
bool juce_postMessageToSystemQueue (void* message) | |||
{ | |||
atomicIncrement (numPendingMessages); | |||
[juceAppDelegate retain]; | |||
[juceAppDelegate performSelectorOnMainThread: @selector (customEvent:) | |||
withObject: (id) [[NSData alloc] initWithBytes: &message | |||
@@ -1193,6 +1193,7 @@ private: | |||
#if ! JucePlugin_EditorRequiresKeyboardFocus | |||
addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); | |||
setWantsKeyboardFocus (false); | |||
setComponentProperty ("juce_disallowFocus", true); | |||
#else | |||
addToDesktop (ComponentPeer::windowIsTemporary); | |||
setWantsKeyboardFocus (true); | |||
@@ -118,7 +118,7 @@ NPError NP_GetValue (void* future, NPPVariable variable, void* value) | |||
NPError OSCALL NP_GetEntryPoints (NPPluginFuncs* funcs) | |||
{ | |||
#if JUCE_WIN32 | |||
#pragma EXPORTED_FUNCTION | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
log ("NP_GetEntryPoints"); | |||
@@ -157,7 +157,7 @@ NPError OSCALL NP_Initialize (NPNetscapeFuncs* funcs | |||
) | |||
{ | |||
#if JUCE_WIN32 | |||
#pragma EXPORTED_FUNCTION | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
log ("NP_Initialize"); | |||
@@ -167,51 +167,8 @@ NPError OSCALL NP_Initialize (NPNetscapeFuncs* funcs | |||
if (((funcs->version >> 8) & 0xff) > NP_VERSION_MAJOR) | |||
return NPERR_INCOMPATIBLE_VERSION_ERROR; | |||
if (funcs->size < sizeof (NPNetscapeFuncs)) | |||
return NPERR_INVALID_FUNCTABLE_ERROR; | |||
browser.size = funcs->size; | |||
browser.version = funcs->version; | |||
browser.geturlnotify = funcs->geturlnotify; | |||
browser.geturl = funcs->geturl; | |||
browser.posturlnotify = funcs->posturlnotify; | |||
browser.posturl = funcs->posturl; | |||
browser.requestread = funcs->requestread; | |||
browser.newstream = funcs->newstream; | |||
browser.write = funcs->write; | |||
browser.destroystream = funcs->destroystream; | |||
browser.status = funcs->status; | |||
browser.uagent = funcs->uagent; | |||
browser.memalloc = funcs->memalloc; | |||
browser.memfree = funcs->memfree; | |||
browser.memflush = funcs->memflush; | |||
browser.reloadplugins = funcs->reloadplugins; | |||
browser.getJavaEnv = funcs->getJavaEnv; | |||
browser.getJavaPeer = funcs->getJavaPeer; | |||
browser.getvalue = funcs->getvalue; | |||
browser.setvalue = funcs->setvalue; | |||
browser.invalidaterect = funcs->invalidaterect; | |||
browser.invalidateregion = funcs->invalidateregion; | |||
browser.forceredraw = funcs->forceredraw; | |||
browser.getstringidentifier = funcs->getstringidentifier; | |||
browser.getstringidentifiers = funcs->getstringidentifiers; | |||
browser.getintidentifier = funcs->getintidentifier; | |||
browser.identifierisstring = funcs->identifierisstring; | |||
browser.utf8fromidentifier = funcs->utf8fromidentifier; | |||
browser.intfromidentifier = funcs->intfromidentifier; | |||
browser.createobject = funcs->createobject; | |||
browser.retainobject = funcs->retainobject; | |||
browser.releaseobject = funcs->releaseobject; | |||
browser.invoke = funcs->invoke; | |||
browser.invokeDefault = funcs->invokeDefault; | |||
browser.evaluate = funcs->evaluate; | |||
browser.getproperty = funcs->getproperty; | |||
browser.setproperty = funcs->setproperty; | |||
browser.removeproperty = funcs->removeproperty; | |||
browser.hasproperty = funcs->hasproperty; | |||
browser.hasmethod = funcs->hasmethod; | |||
browser.releasevariantvalue = funcs->releasevariantvalue; | |||
browser.setexception = funcs->setexception; | |||
zerostruct (browser); | |||
memcpy (&browser, funcs, jmin (funcs->size, sizeof (browser))); | |||
#ifdef XP_UNIX | |||
pluginFuncs->version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR; | |||
@@ -239,7 +196,7 @@ NPError OSCALL NP_Initialize (NPNetscapeFuncs* funcs | |||
NPError OSCALL NP_Shutdown() | |||
{ | |||
#if JUCE_WIN32 | |||
#pragma EXPORTED_FUNCTION | |||
#pragma EXPORTED_FUNCTION | |||
#endif | |||
log ("NP_Shutdown"); | |||
@@ -866,11 +823,14 @@ static void createNPVariantFromValue (NPP npp, NPVariant& out, const var& v) | |||
else if (v.isDouble()) | |||
DOUBLE_TO_NPVARIANT ((double) v, out); | |||
else if (v.isString()) | |||
#if JUCE_MAC | |||
STRINGZ_TO_NPVARIANT (strdup (v.toString().toUTF8()), out); | |||
#else | |||
STRINGZ_TO_NPVARIANT (_strdup (v.toString().toUTF8()), out); | |||
#endif | |||
{ | |||
const String s (v.toString()); | |||
const char* const utf8 = s.toUTF8(); | |||
const int utf8Len = strlen (utf8) + 1; | |||
char* const stringCopy = (char*) browser.memalloc (utf8Len); | |||
memcpy (stringCopy, utf8, utf8Len); | |||
STRINGZ_TO_NPVARIANT (stringCopy, out); | |||
} | |||
else if (v.isObject()) | |||
OBJECT_TO_NPVARIANT (NPObjectWrappingDynamicObject::create (npp, v), out); | |||
else | |||
@@ -272262,13 +272262,13 @@ using namespace JUCE_NAMESPACE; | |||
#define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) | |||
static int numPendingMessages = 0; | |||
static bool flushingMessages = false; | |||
@interface JuceAppDelegate : NSObject | |||
{ | |||
@private | |||
id oldDelegate; | |||
AppDelegateRedirector* redirector; | |||
bool flushingMessages; | |||
} | |||
- (JuceAppDelegate*) init; | |||
@@ -272360,6 +272360,7 @@ static bool flushingMessages = false; | |||
- (void) customEvent: (id) n | |||
{ | |||
atomicDecrement (numPendingMessages); | |||
[self release]; | |||
NSData* data = (NSData*) n; | |||
void* message = 0; | |||
@@ -272539,23 +272540,27 @@ void MessageManager::doPlatformSpecificInitialisation() | |||
void MessageManager::doPlatformSpecificShutdown() | |||
{ | |||
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: juceAppDelegate]; | |||
[[NSNotificationCenter defaultCenter] removeObserver: juceAppDelegate]; | |||
if (juceAppDelegate != 0) | |||
{ | |||
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: juceAppDelegate]; | |||
[[NSNotificationCenter defaultCenter] removeObserver: juceAppDelegate]; | |||
// Annoyingly, cancelPerformSelectorsWithTarget can't actually cancel the messages | |||
// sent by performSelectorOnMainThread, so need to manually flush these before quitting.. | |||
flushingMessages = true; | |||
if (JUCEApplication::getInstance() != 0) // (must avoid blocking here when running as a plugin) | |||
for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||
getInstance()->runDispatchLoopUntil (10); | |||
// Annoyingly, cancelPerformSelectorsWithTarget can't actually cancel the messages | |||
// sent by performSelectorOnMainThread, so need to manually flush these before quitting.. | |||
juceAppDelegate->flushingMessages = true; | |||
if (JUCEApplication::getInstance() != 0) // (must avoid blocking here when running as a plugin) | |||
for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||
getInstance()->runDispatchLoopUntil (10); | |||
[juceAppDelegate release]; | |||
juceAppDelegate = 0; | |||
[juceAppDelegate release]; | |||
juceAppDelegate = 0; | |||
} | |||
} | |||
bool juce_postMessageToSystemQueue (void* message) | |||
{ | |||
atomicIncrement (numPendingMessages); | |||
[juceAppDelegate retain]; | |||
[juceAppDelegate performSelectorOnMainThread: @selector (customEvent:) | |||
withObject: (id) [[NSData alloc] initWithBytes: &message | |||
@@ -34533,7 +34533,18 @@ public: | |||
/** Returns the currently-active audio device. */ | |||
AudioIODevice* getCurrentAudioDevice() const throw() { return currentAudioDevice; } | |||
/** Returns the type of audio device currently in use. | |||
@see setCurrentAudioDeviceType | |||
*/ | |||
const String getCurrentAudioDeviceType() const throw() { return currentDeviceType; } | |||
/** Changes the class of audio device being used. | |||
This switches between, e.g. ASIO and DirectSound. On the Mac you probably won't ever call | |||
this because there's only one type: CoreAudio. | |||
For a list of types, see getAvailableDeviceTypes(). | |||
*/ | |||
void setCurrentAudioDeviceType (const String& type, | |||
const bool treatAsChosenDevice); | |||
@@ -34657,7 +34668,7 @@ public: | |||
*/ | |||
MidiOutput* getDefaultMidiOutput() const throw() { return defaultMidiOutput; } | |||
/** | |||
/** Returns a list of the types of device supported. | |||
*/ | |||
const OwnedArray <AudioIODeviceType>& getAvailableDeviceTypes(); | |||
@@ -225,7 +225,18 @@ public: | |||
/** Returns the currently-active audio device. */ | |||
AudioIODevice* getCurrentAudioDevice() const throw() { return currentAudioDevice; } | |||
/** Returns the type of audio device currently in use. | |||
@see setCurrentAudioDeviceType | |||
*/ | |||
const String getCurrentAudioDeviceType() const throw() { return currentDeviceType; } | |||
/** Changes the class of audio device being used. | |||
This switches between, e.g. ASIO and DirectSound. On the Mac you probably won't ever call | |||
this because there's only one type: CoreAudio. | |||
For a list of types, see getAvailableDeviceTypes(). | |||
*/ | |||
void setCurrentAudioDeviceType (const String& type, | |||
const bool treatAsChosenDevice); | |||
@@ -353,7 +364,7 @@ public: | |||
*/ | |||
MidiOutput* getDefaultMidiOutput() const throw() { return defaultMidiOutput; } | |||
/** | |||
/** Returns a list of the types of device supported. | |||
*/ | |||
const OwnedArray <AudioIODeviceType>& getAvailableDeviceTypes(); | |||