| @@ -42,6 +42,7 @@ | |||||
| #include <utime.h> | #include <utime.h> | ||||
| #include <pwd.h> | #include <pwd.h> | ||||
| #include <fcntl.h> | #include <fcntl.h> | ||||
| #include <dlfcn.h> | |||||
| #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_fs.h | #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_fs.h | ||||
| #define U_MSDOS_SUPER_MAGIC (short) 0x4d44 // linux/msdos_fs.h | #define U_MSDOS_SUPER_MAGIC (short) 0x4d44 // linux/msdos_fs.h | ||||
| @@ -261,6 +262,15 @@ const File File::getSpecialLocation (const SpecialLocationType type) | |||||
| case currentExecutableFile: | case currentExecutableFile: | ||||
| case currentApplicationFile: | case currentApplicationFile: | ||||
| if (! executableFile.exists()) | |||||
| { | |||||
| Dl_info executableInfo; | |||||
| dladdr ((const void*) juce_getFileTimes, &executableInfo); | |||||
| if (executableInfo.dli_fname != 0) | |||||
| executableFile = File (String (executableInfo.dli_fname)); | |||||
| } | |||||
| // if this fails, it's probably because juce_setCurrentExecutableFileName() | // if this fails, it's probably because juce_setCurrentExecutableFileName() | ||||
| // was never called to set the filename - this should be done by the juce | // was never called to set the filename - this should be done by the juce | ||||
| // main() function, so maybe you've hacked it to use your own custom main()? | // main() function, so maybe you've hacked it to use your own custom main()? | ||||
| @@ -660,8 +660,6 @@ public: | |||||
| int ls, ps; | int ls, ps; | ||||
| const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | ||||
| jassert (! isARGB()) | |||||
| for (int y = sy; y < sy + dh; ++y) | for (int y = sy; y < sy + dh; ++y) | ||||
| { | { | ||||
| const uint8* p = pixels + y * ls + sx * ps; | const uint8* p = pixels + y * ls + sx * ps; | ||||
| @@ -1961,16 +1959,16 @@ private: | |||||
| { | { | ||||
| int netHints [2]; | int netHints [2]; | ||||
| int numHints = 0; | int numHints = 0; | ||||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||||
| if (netHints [numHints] != 0) | |||||
| ++numHints; | |||||
| if ((styleFlags & windowIsTemporary) != 0) | if ((styleFlags & windowIsTemporary) != 0) | ||||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | ||||
| else | else | ||||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_NORMAL", True); | netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_NORMAL", True); | ||||
| if (netHints [numHints] != 0) | |||||
| ++numHints; | |||||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||||
| if (netHints [numHints] != 0) | if (netHints [numHints] != 0) | ||||
| ++numHints; | ++numHints; | ||||
| @@ -1,462 +1,463 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-7 by Raw Material Software ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the | |||||
| GNU General Public License, as published by the Free Software Foundation; | |||||
| either version 2 of the License, or (at your option) any later version. | |||||
| JUCE is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| GNU General Public License for more details. | |||||
| You should have received a copy of the GNU General Public License | |||||
| along with JUCE; if not, visit www.gnu.org/licenses or write to the | |||||
| Free Software Foundation, Inc., 59 Temple Place, Suite 330, | |||||
| Boston, MA 02111-1307 USA | |||||
| ------------------------------------------------------------------------------ | |||||
| If you'd like to release a closed-source product which uses JUCE, commercial | |||||
| licenses are also available: visit www.rawmaterialsoftware.com/juce for | |||||
| more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| // (This file gets included by juce_mac_NativeCode.mm, rather than being | |||||
| // compiled on its own). | |||||
| #ifdef JUCE_INCLUDED_FILE | |||||
| struct CallbackMessagePayload | |||||
| { | |||||
| MessageCallbackFunction* function; | |||||
| void* parameter; | |||||
| void* volatile result; | |||||
| bool volatile hasBeenExecuted; | |||||
| }; | |||||
| /* When you use multiple DLLs which share similarly-named obj-c classes - like | |||||
| for example having more than one juce plugin loaded into a host, then when a | |||||
| method is called, the actual code that runs might actually be in a different module | |||||
| than the one you expect... So any calls to library functions or statics that are | |||||
| made inside obj-c methods will probably end up getting executed in a different DLL's | |||||
| memory space. Not a great thing to happen - this obviously leads to bizarre crashes. | |||||
| To work around this insanity, I'm only allowing obj-c methods to make calls to | |||||
| virtual methods of an object that's known to live inside the right module's space. | |||||
| */ | |||||
| class AppDelegateRedirector | |||||
| { | |||||
| public: | |||||
| AppDelegateRedirector() {} | |||||
| virtual ~AppDelegateRedirector() {} | |||||
| virtual NSApplicationTerminateReply shouldTerminate() | |||||
| { | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->systemRequestedQuit(); | |||||
| return NSTerminateCancel; | |||||
| } | |||||
| return NSTerminateNow; | |||||
| } | |||||
| virtual BOOL openFile (const NSString* filename) | |||||
| { | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->anotherInstanceStarted (nsStringToJuce (filename)); | |||||
| return YES; | |||||
| } | |||||
| return NO; | |||||
| } | |||||
| virtual void openFiles (NSArray* filenames) | |||||
| { | |||||
| StringArray files; | |||||
| for (unsigned int i = 0; i < [filenames count]; ++i) | |||||
| files.add (nsStringToJuce ((NSString*) [filenames objectAtIndex: i])); | |||||
| if (files.size() > 0 && JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->anotherInstanceStarted (files.joinIntoString (T(" "))); | |||||
| } | |||||
| } | |||||
| virtual void focusChanged() | |||||
| { | |||||
| juce_HandleProcessFocusChange(); | |||||
| } | |||||
| virtual void deliverMessage (void* message) | |||||
| { | |||||
| // no need for an mm lock here - deliverMessage locks it | |||||
| MessageManager::getInstance()->deliverMessage (message); | |||||
| } | |||||
| virtual void performCallback (CallbackMessagePayload* pl) | |||||
| { | |||||
| pl->result = (*pl->function) (pl->parameter); | |||||
| pl->hasBeenExecuted = true; | |||||
| } | |||||
| virtual void deleteSelf() | |||||
| { | |||||
| delete this; | |||||
| } | |||||
| }; | |||||
| END_JUCE_NAMESPACE | |||||
| using namespace JUCE_NAMESPACE; | |||||
| #define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) | |||||
| static int numPendingMessages = 0; | |||||
| static bool flushingMessages = false; | |||||
| @interface JuceAppDelegate : NSObject | |||||
| { | |||||
| @private | |||||
| id oldDelegate; | |||||
| AppDelegateRedirector* redirector; | |||||
| } | |||||
| - (JuceAppDelegate*) init; | |||||
| - (void) dealloc; | |||||
| - (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename; | |||||
| - (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames; | |||||
| - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app; | |||||
| - (void) applicationDidBecomeActive: (NSNotification*) aNotification; | |||||
| - (void) applicationDidResignActive: (NSNotification*) aNotification; | |||||
| - (void) applicationWillUnhide: (NSNotification*) aNotification; | |||||
| - (void) customEvent: (id) data; | |||||
| - (void) performCallback: (id) info; | |||||
| - (void) dummyMethod; | |||||
| @end | |||||
| @implementation JuceAppDelegate | |||||
| - (JuceAppDelegate*) init | |||||
| { | |||||
| [super init]; | |||||
| redirector = new AppDelegateRedirector(); | |||||
| numPendingMessages = 0; | |||||
| flushingMessages = false; | |||||
| NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| oldDelegate = [NSApp delegate]; | |||||
| [NSApp setDelegate: self]; | |||||
| } | |||||
| else | |||||
| { | |||||
| oldDelegate = 0; | |||||
| [center addObserver: self selector: @selector (applicationDidResignActive:) | |||||
| name: NSApplicationDidResignActiveNotification object: NSApp]; | |||||
| [center addObserver: self selector: @selector (applicationDidBecomeActive:) | |||||
| name: NSApplicationDidBecomeActiveNotification object: NSApp]; | |||||
| [center addObserver: self selector: @selector (applicationWillUnhide:) | |||||
| name: NSApplicationWillUnhideNotification object: NSApp]; | |||||
| } | |||||
| return self; | |||||
| } | |||||
| - (void) dealloc | |||||
| { | |||||
| if (oldDelegate != 0) | |||||
| [NSApp setDelegate: oldDelegate]; | |||||
| redirector->deleteSelf(); | |||||
| [super dealloc]; | |||||
| } | |||||
| - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app | |||||
| { | |||||
| return redirector->shouldTerminate(); | |||||
| } | |||||
| - (BOOL) application: (NSApplication*) app openFile: (NSString*) filename | |||||
| { | |||||
| return redirector->openFile (filename); | |||||
| } | |||||
| - (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames | |||||
| { | |||||
| return redirector->openFiles (filenames); | |||||
| } | |||||
| - (void) applicationDidBecomeActive: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) applicationDidResignActive: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) applicationWillUnhide: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) customEvent: (id) n | |||||
| { | |||||
| atomicDecrement (numPendingMessages); | |||||
| NSData* data = (NSData*) n; | |||||
| void* message = 0; | |||||
| [data getBytes: &message length: sizeof (message)]; | |||||
| if (message != 0 && ! flushingMessages) | |||||
| redirector->deliverMessage (message); | |||||
| [data release]; | |||||
| } | |||||
| - (void) performCallback: (id) info | |||||
| { | |||||
| if ([info isKindOfClass: [NSData class]]) | |||||
| { | |||||
| CallbackMessagePayload* pl = (CallbackMessagePayload*) [((NSData*) info) bytes]; | |||||
| if (pl != 0) | |||||
| redirector->performCallback (pl); | |||||
| } | |||||
| else | |||||
| { | |||||
| jassertfalse // should never get here! | |||||
| } | |||||
| } | |||||
| - (void) dummyMethod {} // (used as a way of running a dummy thread) | |||||
| @end | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| static JuceAppDelegate* juceAppDelegate = 0; | |||||
| void MessageManager::runDispatchLoop() | |||||
| { | |||||
| if (! quitMessagePosted) // check that the quit message wasn't already posted.. | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| // must only be called by the message thread! | |||||
| jassert (isThisTheMessageThread()); | |||||
| [NSApp run]; | |||||
| } | |||||
| } | |||||
| void MessageManager::stopDispatchLoop() | |||||
| { | |||||
| quitMessagePosted = true; | |||||
| [NSApp stop: nil]; | |||||
| } | |||||
| static bool isEventBlockedByModalComps (NSEvent* e) | |||||
| { | |||||
| if (Component::getNumCurrentlyModalComponents() == 0) | |||||
| return false; | |||||
| NSWindow* const w = [e window]; | |||||
| if (w == 0 || [w worksWhenModal]) | |||||
| return false; | |||||
| bool isKey = false, isInputAttempt = false; | |||||
| switch ([e type]) | |||||
| { | |||||
| case NSKeyDown: | |||||
| case NSKeyUp: | |||||
| isKey = isInputAttempt = true; | |||||
| break; | |||||
| case NSLeftMouseDown: | |||||
| case NSRightMouseDown: | |||||
| case NSOtherMouseDown: | |||||
| isInputAttempt = true; | |||||
| break; | |||||
| case NSLeftMouseDragged: | |||||
| case NSRightMouseDragged: | |||||
| case NSLeftMouseUp: | |||||
| case NSRightMouseUp: | |||||
| case NSOtherMouseUp: | |||||
| case NSOtherMouseDragged: | |||||
| if (Component::getComponentUnderMouse() != 0) | |||||
| return false; | |||||
| break; | |||||
| case NSMouseMoved: | |||||
| case NSMouseEntered: | |||||
| case NSMouseExited: | |||||
| case NSCursorUpdate: | |||||
| case NSScrollWheel: | |||||
| case NSTabletPoint: | |||||
| case NSTabletProximity: | |||||
| break; | |||||
| default: | |||||
| return false; | |||||
| } | |||||
| for (int i = ComponentPeer::getNumPeers(); --i >= 0;) | |||||
| { | |||||
| ComponentPeer* const peer = ComponentPeer::getPeer (i); | |||||
| NSView* const compView = (NSView*) peer->getNativeHandle(); | |||||
| if ([compView window] == w) | |||||
| { | |||||
| if (isKey) | |||||
| { | |||||
| if (compView == [w firstResponder]) | |||||
| return false; | |||||
| } | |||||
| else | |||||
| { | |||||
| if (NSPointInRect ([compView convertPoint: [e locationInWindow] fromView: nil], | |||||
| [compView bounds])) | |||||
| return false; | |||||
| } | |||||
| } | |||||
| } | |||||
| if (isInputAttempt) | |||||
| { | |||||
| if (! [NSApp isActive]) | |||||
| [NSApp activateIgnoringOtherApps: YES]; | |||||
| Component* const modal = Component::getCurrentlyModalComponent (0); | |||||
| if (modal != 0) | |||||
| modal->inputAttemptWhenModal(); | |||||
| } | |||||
| return true; | |||||
| } | |||||
| bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| jassert (isThisTheMessageThread()); // must only be called by the message thread | |||||
| uint32 endTime = Time::getMillisecondCounter() + millisecondsToRunFor; | |||||
| NSDate* endDate = [NSDate dateWithTimeIntervalSinceNow: millisecondsToRunFor * 0.001]; | |||||
| while (Time::getMillisecondCounter() < endTime && ! quitMessagePosted) | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode | |||||
| beforeDate: endDate]; | |||||
| NSEvent* e = [NSApp nextEventMatchingMask: NSAnyEventMask | |||||
| untilDate: endDate | |||||
| inMode: NSDefaultRunLoopMode | |||||
| dequeue: YES]; | |||||
| if (e != 0 && ! isEventBlockedByModalComps (e)) | |||||
| [NSApp sendEvent: e]; | |||||
| } | |||||
| return ! quitMessagePosted; | |||||
| } | |||||
| //============================================================================== | |||||
| void MessageManager::doPlatformSpecificInitialisation() | |||||
| { | |||||
| if (juceAppDelegate == 0) | |||||
| juceAppDelegate = [[JuceAppDelegate alloc] init]; | |||||
| // This launches a dummy thread, which forces Cocoa to initialise NSThreads | |||||
| // correctly (needed prior to 10.5) | |||||
| if (! [NSThread isMultiThreaded]) | |||||
| [NSThread detachNewThreadSelector: @selector (dummyMethod) | |||||
| toTarget: juceAppDelegate | |||||
| withObject: nil]; | |||||
| initialiseMainMenu(); | |||||
| } | |||||
| 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.. | |||||
| for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||||
| { | |||||
| flushingMessages = true; | |||||
| getInstance()->runDispatchLoopUntil (10); | |||||
| } | |||||
| [juceAppDelegate release]; | |||||
| juceAppDelegate = 0; | |||||
| } | |||||
| bool juce_postMessageToSystemQueue (void* message) | |||||
| { | |||||
| atomicIncrement (numPendingMessages); | |||||
| [juceAppDelegate performSelectorOnMainThread: @selector (customEvent:) | |||||
| withObject: (id) [[NSData alloc] initWithBytes: &message | |||||
| length: (int) sizeof (message)] | |||||
| waitUntilDone: NO]; | |||||
| return true; | |||||
| } | |||||
| void MessageManager::broadcastMessage (const String& value) throw() | |||||
| { | |||||
| } | |||||
| void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, | |||||
| void* data) | |||||
| { | |||||
| if (isThisTheMessageThread()) | |||||
| { | |||||
| return (*callback) (data); | |||||
| } | |||||
| else | |||||
| { | |||||
| // If a thread has a MessageManagerLock and then tries to call this method, it'll | |||||
| // deadlock because the message manager is blocked from running, so can never | |||||
| // call your function.. | |||||
| jassert (! MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| const ScopedAutoReleasePool pool; | |||||
| CallbackMessagePayload cmp; | |||||
| cmp.function = callback; | |||||
| cmp.parameter = data; | |||||
| cmp.result = 0; | |||||
| cmp.hasBeenExecuted = false; | |||||
| [juceAppDelegate performSelectorOnMainThread: @selector (performCallback:) | |||||
| withObject: [NSData dataWithBytesNoCopy: &cmp | |||||
| length: sizeof (cmp) | |||||
| freeWhenDone: NO] | |||||
| waitUntilDone: YES]; | |||||
| return cmp.result; | |||||
| } | |||||
| } | |||||
| #endif | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-7 by Raw Material Software ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the | |||||
| GNU General Public License, as published by the Free Software Foundation; | |||||
| either version 2 of the License, or (at your option) any later version. | |||||
| JUCE is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| GNU General Public License for more details. | |||||
| You should have received a copy of the GNU General Public License | |||||
| along with JUCE; if not, visit www.gnu.org/licenses or write to the | |||||
| Free Software Foundation, Inc., 59 Temple Place, Suite 330, | |||||
| Boston, MA 02111-1307 USA | |||||
| ------------------------------------------------------------------------------ | |||||
| If you'd like to release a closed-source product which uses JUCE, commercial | |||||
| licenses are also available: visit www.rawmaterialsoftware.com/juce for | |||||
| more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| // (This file gets included by juce_mac_NativeCode.mm, rather than being | |||||
| // compiled on its own). | |||||
| #ifdef JUCE_INCLUDED_FILE | |||||
| struct CallbackMessagePayload | |||||
| { | |||||
| MessageCallbackFunction* function; | |||||
| void* parameter; | |||||
| void* volatile result; | |||||
| bool volatile hasBeenExecuted; | |||||
| }; | |||||
| /* When you use multiple DLLs which share similarly-named obj-c classes - like | |||||
| for example having more than one juce plugin loaded into a host, then when a | |||||
| method is called, the actual code that runs might actually be in a different module | |||||
| than the one you expect... So any calls to library functions or statics that are | |||||
| made inside obj-c methods will probably end up getting executed in a different DLL's | |||||
| memory space. Not a great thing to happen - this obviously leads to bizarre crashes. | |||||
| To work around this insanity, I'm only allowing obj-c methods to make calls to | |||||
| virtual methods of an object that's known to live inside the right module's space. | |||||
| */ | |||||
| class AppDelegateRedirector | |||||
| { | |||||
| public: | |||||
| AppDelegateRedirector() {} | |||||
| virtual ~AppDelegateRedirector() {} | |||||
| virtual NSApplicationTerminateReply shouldTerminate() | |||||
| { | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->systemRequestedQuit(); | |||||
| return NSTerminateCancel; | |||||
| } | |||||
| return NSTerminateNow; | |||||
| } | |||||
| virtual BOOL openFile (const NSString* filename) | |||||
| { | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->anotherInstanceStarted (nsStringToJuce (filename)); | |||||
| return YES; | |||||
| } | |||||
| return NO; | |||||
| } | |||||
| virtual void openFiles (NSArray* filenames) | |||||
| { | |||||
| StringArray files; | |||||
| for (unsigned int i = 0; i < [filenames count]; ++i) | |||||
| files.add (nsStringToJuce ((NSString*) [filenames objectAtIndex: i])); | |||||
| if (files.size() > 0 && JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| JUCEApplication::getInstance()->anotherInstanceStarted (files.joinIntoString (T(" "))); | |||||
| } | |||||
| } | |||||
| virtual void focusChanged() | |||||
| { | |||||
| juce_HandleProcessFocusChange(); | |||||
| } | |||||
| virtual void deliverMessage (void* message) | |||||
| { | |||||
| // no need for an mm lock here - deliverMessage locks it | |||||
| MessageManager::getInstance()->deliverMessage (message); | |||||
| } | |||||
| virtual void performCallback (CallbackMessagePayload* pl) | |||||
| { | |||||
| pl->result = (*pl->function) (pl->parameter); | |||||
| pl->hasBeenExecuted = true; | |||||
| } | |||||
| virtual void deleteSelf() | |||||
| { | |||||
| delete this; | |||||
| } | |||||
| }; | |||||
| END_JUCE_NAMESPACE | |||||
| using namespace JUCE_NAMESPACE; | |||||
| #define JuceAppDelegate MakeObjCClassName(JuceAppDelegate) | |||||
| static int numPendingMessages = 0; | |||||
| static bool flushingMessages = false; | |||||
| @interface JuceAppDelegate : NSObject | |||||
| { | |||||
| @private | |||||
| id oldDelegate; | |||||
| AppDelegateRedirector* redirector; | |||||
| } | |||||
| - (JuceAppDelegate*) init; | |||||
| - (void) dealloc; | |||||
| - (BOOL) application: (NSApplication*) theApplication openFile: (NSString*) filename; | |||||
| - (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames; | |||||
| - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app; | |||||
| - (void) applicationDidBecomeActive: (NSNotification*) aNotification; | |||||
| - (void) applicationDidResignActive: (NSNotification*) aNotification; | |||||
| - (void) applicationWillUnhide: (NSNotification*) aNotification; | |||||
| - (void) customEvent: (id) data; | |||||
| - (void) performCallback: (id) info; | |||||
| - (void) dummyMethod; | |||||
| @end | |||||
| @implementation JuceAppDelegate | |||||
| - (JuceAppDelegate*) init | |||||
| { | |||||
| [super init]; | |||||
| redirector = new AppDelegateRedirector(); | |||||
| numPendingMessages = 0; | |||||
| flushingMessages = false; | |||||
| NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; | |||||
| if (JUCEApplication::getInstance() != 0) | |||||
| { | |||||
| oldDelegate = [NSApp delegate]; | |||||
| [NSApp setDelegate: self]; | |||||
| } | |||||
| else | |||||
| { | |||||
| oldDelegate = 0; | |||||
| [center addObserver: self selector: @selector (applicationDidResignActive:) | |||||
| name: NSApplicationDidResignActiveNotification object: NSApp]; | |||||
| [center addObserver: self selector: @selector (applicationDidBecomeActive:) | |||||
| name: NSApplicationDidBecomeActiveNotification object: NSApp]; | |||||
| [center addObserver: self selector: @selector (applicationWillUnhide:) | |||||
| name: NSApplicationWillUnhideNotification object: NSApp]; | |||||
| } | |||||
| return self; | |||||
| } | |||||
| - (void) dealloc | |||||
| { | |||||
| if (oldDelegate != 0) | |||||
| [NSApp setDelegate: oldDelegate]; | |||||
| redirector->deleteSelf(); | |||||
| [super dealloc]; | |||||
| } | |||||
| - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication*) app | |||||
| { | |||||
| return redirector->shouldTerminate(); | |||||
| } | |||||
| - (BOOL) application: (NSApplication*) app openFile: (NSString*) filename | |||||
| { | |||||
| return redirector->openFile (filename); | |||||
| } | |||||
| - (void) application: (NSApplication*) sender openFiles: (NSArray*) filenames | |||||
| { | |||||
| return redirector->openFiles (filenames); | |||||
| } | |||||
| - (void) applicationDidBecomeActive: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) applicationDidResignActive: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) applicationWillUnhide: (NSNotification*) aNotification | |||||
| { | |||||
| redirector->focusChanged(); | |||||
| } | |||||
| - (void) customEvent: (id) n | |||||
| { | |||||
| atomicDecrement (numPendingMessages); | |||||
| NSData* data = (NSData*) n; | |||||
| void* message = 0; | |||||
| [data getBytes: &message length: sizeof (message)]; | |||||
| if (message != 0 && ! flushingMessages) | |||||
| redirector->deliverMessage (message); | |||||
| [data release]; | |||||
| } | |||||
| - (void) performCallback: (id) info | |||||
| { | |||||
| if ([info isKindOfClass: [NSData class]]) | |||||
| { | |||||
| CallbackMessagePayload* pl = (CallbackMessagePayload*) [((NSData*) info) bytes]; | |||||
| if (pl != 0) | |||||
| redirector->performCallback (pl); | |||||
| } | |||||
| else | |||||
| { | |||||
| jassertfalse // should never get here! | |||||
| } | |||||
| } | |||||
| - (void) dummyMethod {} // (used as a way of running a dummy thread) | |||||
| @end | |||||
| BEGIN_JUCE_NAMESPACE | |||||
| static JuceAppDelegate* juceAppDelegate = 0; | |||||
| void MessageManager::runDispatchLoop() | |||||
| { | |||||
| if (! quitMessagePosted) // check that the quit message wasn't already posted.. | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| // must only be called by the message thread! | |||||
| jassert (isThisTheMessageThread()); | |||||
| [NSApp run]; | |||||
| } | |||||
| } | |||||
| void MessageManager::stopDispatchLoop() | |||||
| { | |||||
| quitMessagePosted = true; | |||||
| [NSApp stop: nil]; | |||||
| [NSApp activateIgnoringOtherApps: YES]; // (if the app is inactive, it sits there and ignores the quit request until the next time it gets activated) | |||||
| } | |||||
| static bool isEventBlockedByModalComps (NSEvent* e) | |||||
| { | |||||
| if (Component::getNumCurrentlyModalComponents() == 0) | |||||
| return false; | |||||
| NSWindow* const w = [e window]; | |||||
| if (w == 0 || [w worksWhenModal]) | |||||
| return false; | |||||
| bool isKey = false, isInputAttempt = false; | |||||
| switch ([e type]) | |||||
| { | |||||
| case NSKeyDown: | |||||
| case NSKeyUp: | |||||
| isKey = isInputAttempt = true; | |||||
| break; | |||||
| case NSLeftMouseDown: | |||||
| case NSRightMouseDown: | |||||
| case NSOtherMouseDown: | |||||
| isInputAttempt = true; | |||||
| break; | |||||
| case NSLeftMouseDragged: | |||||
| case NSRightMouseDragged: | |||||
| case NSLeftMouseUp: | |||||
| case NSRightMouseUp: | |||||
| case NSOtherMouseUp: | |||||
| case NSOtherMouseDragged: | |||||
| if (Component::getComponentUnderMouse() != 0) | |||||
| return false; | |||||
| break; | |||||
| case NSMouseMoved: | |||||
| case NSMouseEntered: | |||||
| case NSMouseExited: | |||||
| case NSCursorUpdate: | |||||
| case NSScrollWheel: | |||||
| case NSTabletPoint: | |||||
| case NSTabletProximity: | |||||
| break; | |||||
| default: | |||||
| return false; | |||||
| } | |||||
| for (int i = ComponentPeer::getNumPeers(); --i >= 0;) | |||||
| { | |||||
| ComponentPeer* const peer = ComponentPeer::getPeer (i); | |||||
| NSView* const compView = (NSView*) peer->getNativeHandle(); | |||||
| if ([compView window] == w) | |||||
| { | |||||
| if (isKey) | |||||
| { | |||||
| if (compView == [w firstResponder]) | |||||
| return false; | |||||
| } | |||||
| else | |||||
| { | |||||
| if (NSPointInRect ([compView convertPoint: [e locationInWindow] fromView: nil], | |||||
| [compView bounds])) | |||||
| return false; | |||||
| } | |||||
| } | |||||
| } | |||||
| if (isInputAttempt) | |||||
| { | |||||
| if (! [NSApp isActive]) | |||||
| [NSApp activateIgnoringOtherApps: YES]; | |||||
| Component* const modal = Component::getCurrentlyModalComponent (0); | |||||
| if (modal != 0) | |||||
| modal->inputAttemptWhenModal(); | |||||
| } | |||||
| return true; | |||||
| } | |||||
| bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| jassert (isThisTheMessageThread()); // must only be called by the message thread | |||||
| uint32 endTime = Time::getMillisecondCounter() + millisecondsToRunFor; | |||||
| NSDate* endDate = [NSDate dateWithTimeIntervalSinceNow: millisecondsToRunFor * 0.001]; | |||||
| while (Time::getMillisecondCounter() < endTime && ! quitMessagePosted) | |||||
| { | |||||
| const ScopedAutoReleasePool pool; | |||||
| [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode | |||||
| beforeDate: endDate]; | |||||
| NSEvent* e = [NSApp nextEventMatchingMask: NSAnyEventMask | |||||
| untilDate: endDate | |||||
| inMode: NSDefaultRunLoopMode | |||||
| dequeue: YES]; | |||||
| if (e != 0 && ! isEventBlockedByModalComps (e)) | |||||
| [NSApp sendEvent: e]; | |||||
| } | |||||
| return ! quitMessagePosted; | |||||
| } | |||||
| //============================================================================== | |||||
| void MessageManager::doPlatformSpecificInitialisation() | |||||
| { | |||||
| if (juceAppDelegate == 0) | |||||
| juceAppDelegate = [[JuceAppDelegate alloc] init]; | |||||
| // This launches a dummy thread, which forces Cocoa to initialise NSThreads | |||||
| // correctly (needed prior to 10.5) | |||||
| if (! [NSThread isMultiThreaded]) | |||||
| [NSThread detachNewThreadSelector: @selector (dummyMethod) | |||||
| toTarget: juceAppDelegate | |||||
| withObject: nil]; | |||||
| initialiseMainMenu(); | |||||
| } | |||||
| 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.. | |||||
| for (int i = 100; --i >= 0 && numPendingMessages > 0;) | |||||
| { | |||||
| flushingMessages = true; | |||||
| getInstance()->runDispatchLoopUntil (10); | |||||
| } | |||||
| [juceAppDelegate release]; | |||||
| juceAppDelegate = 0; | |||||
| } | |||||
| bool juce_postMessageToSystemQueue (void* message) | |||||
| { | |||||
| atomicIncrement (numPendingMessages); | |||||
| [juceAppDelegate performSelectorOnMainThread: @selector (customEvent:) | |||||
| withObject: (id) [[NSData alloc] initWithBytes: &message | |||||
| length: (int) sizeof (message)] | |||||
| waitUntilDone: NO]; | |||||
| return true; | |||||
| } | |||||
| void MessageManager::broadcastMessage (const String& value) throw() | |||||
| { | |||||
| } | |||||
| void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, | |||||
| void* data) | |||||
| { | |||||
| if (isThisTheMessageThread()) | |||||
| { | |||||
| return (*callback) (data); | |||||
| } | |||||
| else | |||||
| { | |||||
| // If a thread has a MessageManagerLock and then tries to call this method, it'll | |||||
| // deadlock because the message manager is blocked from running, so can never | |||||
| // call your function.. | |||||
| jassert (! MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||||
| const ScopedAutoReleasePool pool; | |||||
| CallbackMessagePayload cmp; | |||||
| cmp.function = callback; | |||||
| cmp.parameter = data; | |||||
| cmp.result = 0; | |||||
| cmp.hasBeenExecuted = false; | |||||
| [juceAppDelegate performSelectorOnMainThread: @selector (performCallback:) | |||||
| withObject: [NSData dataWithBytesNoCopy: &cmp | |||||
| length: sizeof (cmp) | |||||
| freeWhenDone: NO] | |||||
| waitUntilDone: YES]; | |||||
| return cmp.result; | |||||
| } | |||||
| } | |||||
| #endif | |||||
| @@ -64,6 +64,9 @@ END_JUCE_NAMESPACE | |||||
| - (void) rightMouseDown: (NSEvent*) ev; | - (void) rightMouseDown: (NSEvent*) ev; | ||||
| - (void) rightMouseDragged: (NSEvent*) ev; | - (void) rightMouseDragged: (NSEvent*) ev; | ||||
| - (void) rightMouseUp: (NSEvent*) ev; | - (void) rightMouseUp: (NSEvent*) ev; | ||||
| - (void) otherMouseDown: (NSEvent*) ev; | |||||
| - (void) otherMouseDragged: (NSEvent*) ev; | |||||
| - (void) otherMouseUp: (NSEvent*) ev; | |||||
| - (void) scrollWheel: (NSEvent*) ev; | - (void) scrollWheel: (NSEvent*) ev; | ||||
| - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | ||||
| - (void) frameChanged: (NSNotification*) n; | - (void) frameChanged: (NSNotification*) n; | ||||
| @@ -331,6 +334,21 @@ END_JUCE_NAMESPACE | |||||
| [self mouseUp: ev]; | [self mouseUp: ev]; | ||||
| } | } | ||||
| - (void) otherMouseDown: (NSEvent*) ev | |||||
| { | |||||
| [self mouseDown: ev]; | |||||
| } | |||||
| - (void) otherMouseDragged: (NSEvent*) ev | |||||
| { | |||||
| [self mouseDragged: ev]; | |||||
| } | |||||
| - (void) otherMouseUp: (NSEvent*) ev | |||||
| { | |||||
| [self mouseUp: ev]; | |||||
| } | |||||
| - (void) scrollWheel: (NSEvent*) ev | - (void) scrollWheel: (NSEvent*) ev | ||||
| { | { | ||||
| if (owner != 0) | if (owner != 0) | ||||
| @@ -70,7 +70,7 @@ static int CALLBACK browseCallbackProc (HWND hWnd, UINT msg, LPARAM lParam, LPAR | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void juce_setWindowStyleBit (HWND h, int styleType, int feature, bool bitIsSet) throw(); | |||||
| void juce_setWindowStyleBit (HWND h, const int styleType, const int feature, const bool bitIsSet) throw(); | |||||
| static UINT_PTR CALLBACK openCallback (HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM lParam) | static UINT_PTR CALLBACK openCallback (HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM lParam) | ||||
| { | { | ||||
| @@ -564,11 +564,10 @@ const File File::getLinkedTarget() const throw() | |||||
| else if (getFileExtension() != T(".lnk")) | else if (getFileExtension() != T(".lnk")) | ||||
| return result; | return result; | ||||
| IShellLink* shellLink = 0; | |||||
| if (SUCCEEDED (CoCreateInstance (CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, | |||||
| IID_IShellLink, (LPVOID*) &shellLink))) | |||||
| ComSmartPtr <IShellLink> shellLink; | |||||
| if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink, CLSCTX_INPROC_SERVER))) | |||||
| { | { | ||||
| IPersistFile* persistFile; | |||||
| ComSmartPtr <IPersistFile> persistFile; | |||||
| if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile))) | if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile))) | ||||
| { | { | ||||
| if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ)) | if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ)) | ||||
| @@ -580,11 +579,7 @@ const File File::getLinkedTarget() const throw() | |||||
| if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) | if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) | ||||
| result = File (resolvedPath); | result = File (resolvedPath); | ||||
| } | } | ||||
| persistFile->Release(); | |||||
| } | } | ||||
| shellLink->Release(); | |||||
| } | } | ||||
| return result; | return result; | ||||
| @@ -153,4 +153,46 @@ | |||||
| #pragma warning (pop) | #pragma warning (pop) | ||||
| #endif | #endif | ||||
| //============================================================================== | |||||
| /** A simple COM smart pointer. | |||||
| Avoids having to include ATL just to get one of these. | |||||
| */ | |||||
| template <class T> | |||||
| class ComSmartPtr | |||||
| { | |||||
| public: | |||||
| ComSmartPtr() throw() : p (0) {} | |||||
| ComSmartPtr (T* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); } | |||||
| ComSmartPtr (const ComSmartPtr<T>& p_) : p (p_.p) { if (p != 0) p->AddRef(); } | |||||
| ~ComSmartPtr() { if (p != 0) p->Release(); } | |||||
| operator T*() const throw() { return p; } | |||||
| T& operator*() const throw() { return *p; } | |||||
| T** operator&() throw() { return &p; } | |||||
| T* operator->() const throw() { return p; } | |||||
| T* operator= (T* const newP) | |||||
| { | |||||
| if (newP != 0) | |||||
| newP->AddRef(); | |||||
| if (p != 0) | |||||
| p->Release(); | |||||
| p = newP; | |||||
| return newP; | |||||
| } | |||||
| T* operator= (const ComSmartPtr<T>& newP) { return operator= (newP.p); } | |||||
| HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext) | |||||
| { | |||||
| operator= (0); | |||||
| return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof(T), (void**) &p); | |||||
| } | |||||
| T* p; | |||||
| }; | |||||
| #endif // __JUCE_WIN32_NATIVEINCLUDES_JUCEHEADER__ | #endif // __JUCE_WIN32_NATIVEINCLUDES_JUCEHEADER__ | ||||
| @@ -1,69 +0,0 @@ | |||||
| /* | |||||
| ============================================================================== | |||||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||||
| Copyright 2004-7 by Raw Material Software ltd. | |||||
| ------------------------------------------------------------------------------ | |||||
| JUCE can be redistributed and/or modified under the terms of the | |||||
| GNU General Public License, as published by the Free Software Foundation; | |||||
| either version 2 of the License, or (at your option) any later version. | |||||
| JUCE is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| GNU General Public License for more details. | |||||
| You should have received a copy of the GNU General Public License | |||||
| along with JUCE; if not, visit www.gnu.org/licenses or write to the | |||||
| Free Software Foundation, Inc., 59 Temple Place, Suite 330, | |||||
| Boston, MA 02111-1307 USA | |||||
| ------------------------------------------------------------------------------ | |||||
| If you'd like to release a closed-source product which uses JUCE, commercial | |||||
| licenses are also available: visit www.rawmaterialsoftware.com/juce for | |||||
| more information. | |||||
| ============================================================================== | |||||
| */ | |||||
| #ifndef __WIN32_HEADERS_JUCEHEADER__ | |||||
| #define __WIN32_HEADERS_JUCEHEADER__ | |||||
| #include "../../../juce_Config.h" | |||||
| #ifndef STRICT | |||||
| #define STRICT 1 | |||||
| #endif | |||||
| #define WIN32_LEAN_AND_MEAN | |||||
| // don't want to get told about microsoft's mistakes.. | |||||
| #ifdef _MSC_VER | |||||
| #pragma warning (push) | |||||
| #pragma warning (disable : 4100 4201) | |||||
| #endif | |||||
| // use Platform SDK as win2000 unless this is disabled | |||||
| #ifndef DISABLE_TRANSPARENT_WINDOWS | |||||
| #define _WIN32_WINNT 0x0500 | |||||
| #endif | |||||
| #define _UNICODE 1 | |||||
| #define UNICODE 1 | |||||
| #include <windows.h> | |||||
| #include <commdlg.h> | |||||
| #include <shellapi.h> | |||||
| #include <mmsystem.h> | |||||
| #include <vfw.h> | |||||
| #include <tchar.h> | |||||
| #undef PACKED | |||||
| #ifdef _MSC_VER | |||||
| #pragma warning (pop) | |||||
| #endif | |||||
| #endif // __WIN32_HEADERS_JUCEHEADER__ | |||||
| @@ -5762,10 +5762,6 @@ | |||||
| RelativePath="..\platform_specific_code\juce_win32_Windowing.cpp" | RelativePath="..\platform_specific_code\juce_win32_Windowing.cpp" | ||||
| > | > | ||||
| </File> | </File> | ||||
| <File | |||||
| RelativePath="..\platform_specific_code\win32_headers.h" | |||||
| > | |||||
| </File> | |||||
| </Filter> | </Filter> | ||||
| </Filter> | </Filter> | ||||
| </Files> | </Files> | ||||
| @@ -11,6 +11,7 @@ | |||||
| 841083D50DB36EA400AB8583 /* MainComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841083D30DB36EA400AB8583 /* MainComponent.cpp */; }; | 841083D50DB36EA400AB8583 /* MainComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841083D30DB36EA400AB8583 /* MainComponent.cpp */; }; | ||||
| 841084880DB374E700AB8583 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 841084870DB374E700AB8583 /* juce.xcconfig */; }; | 841084880DB374E700AB8583 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 841084870DB374E700AB8583 /* juce.xcconfig */; }; | ||||
| 841136A00D0480DE0054B790 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8411369F0D0480DE0054B790 /* OpenGL.framework */; }; | 841136A00D0480DE0054B790 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8411369F0D0480DE0054B790 /* OpenGL.framework */; }; | ||||
| 84204DA50FDEFA3800FA4ABC /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84204DA40FDEFA3800FA4ABC /* Carbon.framework */; }; | |||||
| 846EC7870EB607050080CCFF /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846EC7860EB607050080CCFF /* QTKit.framework */; }; | 846EC7870EB607050080CCFF /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 846EC7860EB607050080CCFF /* QTKit.framework */; }; | ||||
| 84F30CD108FEAAA20087E26C /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F30CD008FEAAA20087E26C /* Main.cpp */; }; | 84F30CD108FEAAA20087E26C /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F30CD008FEAAA20087E26C /* Main.cpp */; }; | ||||
| 84F30CED08FEAD7A0087E26C /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */; }; | 84F30CED08FEAD7A0087E26C /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */; }; | ||||
| @@ -34,6 +35,7 @@ | |||||
| 841083D40DB36EA400AB8583 /* MainComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../common/MainComponent.h; sourceTree = SOURCE_ROOT; }; | 841083D40DB36EA400AB8583 /* MainComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../common/MainComponent.h; sourceTree = SOURCE_ROOT; }; | ||||
| 841084870DB374E700AB8583 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; | 841084870DB374E700AB8583 /* juce.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = juce.xcconfig; path = ../../../build/macosx/juce.xcconfig; sourceTree = SOURCE_ROOT; }; | ||||
| 8411369F0D0480DE0054B790 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; }; | 8411369F0D0480DE0054B790 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; }; | ||||
| 84204DA40FDEFA3800FA4ABC /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; | |||||
| 846EC7860EB607050080CCFF /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = "<absolute>"; }; | 846EC7860EB607050080CCFF /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = "<absolute>"; }; | ||||
| 84F30CD008FEAAA20087E26C /* Main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../common/Main.cpp; sourceTree = SOURCE_ROOT; }; | 84F30CD008FEAAA20087E26C /* Main.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../common/Main.cpp; sourceTree = SOURCE_ROOT; }; | ||||
| 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; }; | 84F30CEC08FEAD7A0087E26C /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; }; | ||||
| @@ -64,6 +66,7 @@ | |||||
| 84FBB8880E06CCE900B52196 /* AudioUnit.framework in Frameworks */, | 84FBB8880E06CCE900B52196 /* AudioUnit.framework in Frameworks */, | ||||
| 84FBB88D0E06CD0100B52196 /* WebKit.framework in Frameworks */, | 84FBB88D0E06CD0100B52196 /* WebKit.framework in Frameworks */, | ||||
| 846EC7870EB607050080CCFF /* QTKit.framework in Frameworks */, | 846EC7870EB607050080CCFF /* QTKit.framework in Frameworks */, | ||||
| 84204DA50FDEFA3800FA4ABC /* Carbon.framework in Frameworks */, | |||||
| ); | ); | ||||
| runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
| }; | }; | ||||
| @@ -115,6 +118,7 @@ | |||||
| 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { | 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { | ||||
| isa = PBXGroup; | isa = PBXGroup; | ||||
| children = ( | children = ( | ||||
| 84204DA40FDEFA3800FA4ABC /* Carbon.framework */, | |||||
| 84FBB8870E06CCE900B52196 /* AudioUnit.framework */, | 84FBB8870E06CCE900B52196 /* AudioUnit.framework */, | ||||
| 84FBB8720E06CC5D00B52196 /* Cocoa.framework */, | 84FBB8720E06CC5D00B52196 /* Cocoa.framework */, | ||||
| 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, | 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, | ||||
| @@ -107,9 +107,6 @@ | |||||
| <Tool | <Tool | ||||
| Name="VCAppVerifierTool" | Name="VCAppVerifierTool" | ||||
| /> | /> | ||||
| <Tool | |||||
| Name="VCWebDeploymentTool" | |||||
| /> | |||||
| <Tool | <Tool | ||||
| Name="VCPostBuildEventTool" | Name="VCPostBuildEventTool" | ||||
| /> | /> | ||||
| @@ -148,7 +145,7 @@ | |||||
| Name="VCCLCompilerTool" | Name="VCCLCompilerTool" | ||||
| Optimization="0" | Optimization="0" | ||||
| PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" | PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" | ||||
| MinimalRebuild="true" | |||||
| MinimalRebuild="false" | |||||
| BasicRuntimeChecks="3" | BasicRuntimeChecks="3" | ||||
| RuntimeLibrary="1" | RuntimeLibrary="1" | ||||
| BufferSecurityCheck="true" | BufferSecurityCheck="true" | ||||
| @@ -176,7 +173,6 @@ | |||||
| <Tool | <Tool | ||||
| Name="VCLinkerTool" | Name="VCLinkerTool" | ||||
| OutputFile=".\Debug/jucedemo.exe" | OutputFile=".\Debug/jucedemo.exe" | ||||
| LinkIncremental="2" | |||||
| SuppressStartupBanner="true" | SuppressStartupBanner="true" | ||||
| AdditionalLibraryDirectories="../../../juce/bin" | AdditionalLibraryDirectories="../../../juce/bin" | ||||
| IgnoreDefaultLibraryNames="libcmt.lib, msvcrt.lib" | IgnoreDefaultLibraryNames="libcmt.lib, msvcrt.lib" | ||||
| @@ -205,9 +201,6 @@ | |||||
| <Tool | <Tool | ||||
| Name="VCAppVerifierTool" | Name="VCAppVerifierTool" | ||||
| /> | /> | ||||
| <Tool | |||||
| Name="VCWebDeploymentTool" | |||||
| /> | |||||
| <Tool | <Tool | ||||
| Name="VCPostBuildEventTool" | Name="VCPostBuildEventTool" | ||||
| /> | /> | ||||
| @@ -568,6 +568,46 @@ | |||||
| #pragma warning (pop) | #pragma warning (pop) | ||||
| #endif | #endif | ||||
| /** A simple COM smart pointer. | |||||
| Avoids having to include ATL just to get one of these. | |||||
| */ | |||||
| template <class T> | |||||
| class ComSmartPtr | |||||
| { | |||||
| public: | |||||
| ComSmartPtr() throw() : p (0) {} | |||||
| ComSmartPtr (T* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); } | |||||
| ComSmartPtr (const ComSmartPtr<T>& p_) : p (p_.p) { if (p != 0) p->AddRef(); } | |||||
| ~ComSmartPtr() { if (p != 0) p->Release(); } | |||||
| operator T*() const throw() { return p; } | |||||
| T& operator*() const throw() { return *p; } | |||||
| T** operator&() throw() { return &p; } | |||||
| T* operator->() const throw() { return p; } | |||||
| T* operator= (T* const newP) | |||||
| { | |||||
| if (newP != 0) | |||||
| newP->AddRef(); | |||||
| if (p != 0) | |||||
| p->Release(); | |||||
| p = newP; | |||||
| return newP; | |||||
| } | |||||
| T* operator= (const ComSmartPtr<T>& newP) { return operator= (newP.p); } | |||||
| HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext) | |||||
| { | |||||
| operator= (0); | |||||
| return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof(T), (void**) &p); | |||||
| } | |||||
| T* p; | |||||
| }; | |||||
| #endif // __JUCE_WIN32_NATIVEINCLUDES_JUCEHEADER__ | #endif // __JUCE_WIN32_NATIVEINCLUDES_JUCEHEADER__ | ||||
| /********* End of inlined file: juce_win32_NativeIncludes.h *********/ | /********* End of inlined file: juce_win32_NativeIncludes.h *********/ | ||||
| @@ -7655,7 +7695,7 @@ bool StreamingSocket::isLocal() const throw() | |||||
| DatagramSocket::DatagramSocket (const int localPortNumber) | DatagramSocket::DatagramSocket (const int localPortNumber) | ||||
| : portNumber (0), | : portNumber (0), | ||||
| handle (-1), | handle (-1), | ||||
| connected (false), | |||||
| connected (true), | |||||
| serverAddress (0) | serverAddress (0) | ||||
| { | { | ||||
| #if JUCE_WIN32 | #if JUCE_WIN32 | ||||
| @@ -17803,12 +17843,12 @@ class AiffAudioFormatWriter : public AudioFormatWriter | |||||
| public: | public: | ||||
| AiffAudioFormatWriter (OutputStream* out, | AiffAudioFormatWriter (OutputStream* out, | ||||
| const double sampleRate, | |||||
| const double sampleRate_, | |||||
| const unsigned int chans, | const unsigned int chans, | ||||
| const int bits) | const int bits) | ||||
| : AudioFormatWriter (out, | : AudioFormatWriter (out, | ||||
| aiffFormatName, | aiffFormatName, | ||||
| sampleRate, | |||||
| sampleRate_, | |||||
| chans, | chans, | ||||
| bits), | bits), | ||||
| lengthInSamples (0), | lengthInSamples (0), | ||||
| @@ -23300,9 +23340,17 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||||
| { | { | ||||
| if (defaultMidiOutputName != deviceName) | if (defaultMidiOutputName != deviceName) | ||||
| { | { | ||||
| SortedSet <AudioIODeviceCallback*> oldCallbacks; | |||||
| { | |||||
| const ScopedLock sl (audioCallbackLock); | |||||
| oldCallbacks = callbacks; | |||||
| callbacks.clear(); | |||||
| } | |||||
| if (currentAudioDevice != 0) | if (currentAudioDevice != 0) | ||||
| for (int i = callbacks.size(); --i >= 0;) | |||||
| callbacks.getUnchecked(i)->audioDeviceStopped(); | |||||
| for (int i = oldCallbacks.size(); --i >= 0;) | |||||
| oldCallbacks.getUnchecked(i)->audioDeviceStopped(); | |||||
| deleteAndZero (defaultMidiOutput); | deleteAndZero (defaultMidiOutput); | ||||
| defaultMidiOutputName = deviceName; | defaultMidiOutputName = deviceName; | ||||
| @@ -23311,8 +23359,13 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||||
| defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | ||||
| if (currentAudioDevice != 0) | if (currentAudioDevice != 0) | ||||
| for (int i = callbacks.size(); --i >= 0;) | |||||
| callbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); | |||||
| for (int i = oldCallbacks.size(); --i >= 0;) | |||||
| oldCallbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); | |||||
| { | |||||
| const ScopedLock sl (audioCallbackLock); | |||||
| callbacks = oldCallbacks; | |||||
| } | |||||
| updateXml(); | updateXml(); | ||||
| sendChangeMessage (this); | sendChangeMessage (this); | ||||
| @@ -39550,7 +39603,7 @@ void Component::updateMouseCursor() const throw() | |||||
| sendFakeMouseMove(); | sendFakeMouseMove(); | ||||
| } | } | ||||
| void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||||
| void Component::internalUpdateMouseCursor (bool forcedUpdate) throw() | |||||
| { | { | ||||
| ComponentPeer* const peer = getPeer(); | ComponentPeer* const peer = getPeer(); | ||||
| @@ -39563,6 +39616,7 @@ void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||||
| || ! isCursorVisibleUntilOffscreen)) | || ! isCursorVisibleUntilOffscreen)) | ||||
| { | { | ||||
| mc = MouseCursor::NoCursor; | mc = MouseCursor::NoCursor; | ||||
| forcedUpdate = true; | |||||
| } | } | ||||
| static void* currentCursorHandle = 0; | static void* currentCursorHandle = 0; | ||||
| @@ -42841,7 +42895,7 @@ void DrawableButton::paintButton (Graphics& g, | |||||
| g.setFont ((float) textH); | g.setFont ((float) textH); | ||||
| g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | ||||
| g.drawFittedText (getName(), | |||||
| g.drawFittedText (getButtonText(), | |||||
| 2, getHeight() - textH - 1, | 2, getHeight() - textH - 1, | ||||
| getWidth() - 4, textH, | getWidth() - 4, textH, | ||||
| Justification::centred, 1); | Justification::centred, 1); | ||||
| @@ -43046,8 +43100,8 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ImageButton::ImageButton (const String& text) | |||||
| : Button (text), | |||||
| ImageButton::ImageButton (const String& text_) | |||||
| : Button (text_), | |||||
| scaleImageToFit (true), | scaleImageToFit (true), | ||||
| preserveProportions (true), | preserveProportions (true), | ||||
| alphaThreshold (0), | alphaThreshold (0), | ||||
| @@ -43446,11 +43500,11 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| ToolbarButton::ToolbarButton (const int itemId, | |||||
| ToolbarButton::ToolbarButton (const int itemId_, | |||||
| const String& buttonText, | const String& buttonText, | ||||
| Drawable* const normalImage_, | Drawable* const normalImage_, | ||||
| Drawable* const toggledOnImage_) | Drawable* const toggledOnImage_) | ||||
| : ToolbarItemComponent (itemId, buttonText, true), | |||||
| : ToolbarItemComponent (itemId_, buttonText, true), | |||||
| normalImage (normalImage_), | normalImage (normalImage_), | ||||
| toggledOnImage (toggledOnImage_) | toggledOnImage (toggledOnImage_) | ||||
| { | { | ||||
| @@ -48160,12 +48214,12 @@ void TableListBox::paintListBoxItem (int, Graphics&, int, int, bool) | |||||
| { | { | ||||
| } | } | ||||
| Component* TableListBox::refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate) | |||||
| Component* TableListBox::refreshComponentForRow (int rowNumber, bool isRowSelected_, Component* existingComponentToUpdate) | |||||
| { | { | ||||
| if (existingComponentToUpdate == 0) | if (existingComponentToUpdate == 0) | ||||
| existingComponentToUpdate = new TableListRowComp (*this); | existingComponentToUpdate = new TableListRowComp (*this); | ||||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected); | |||||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected_); | |||||
| return existingComponentToUpdate; | return existingComponentToUpdate; | ||||
| } | } | ||||
| @@ -57148,6 +57202,7 @@ void ComponentAnimator::animateComponent (Component* const component, | |||||
| { | { | ||||
| at = new AnimationTask (component); | at = new AnimationTask (component); | ||||
| tasks.add (at); | tasks.add (at); | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| at->msElapsed = 0; | at->msElapsed = 0; | ||||
| @@ -57187,6 +57242,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin | |||||
| delete at; | delete at; | ||||
| tasks.remove (i); | tasks.remove (i); | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -57202,6 +57258,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, | |||||
| tasks.removeValue (at); | tasks.removeValue (at); | ||||
| delete at; | delete at; | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -57217,6 +57274,11 @@ const Rectangle ComponentAnimator::getComponentDestination (Component* const com | |||||
| return Rectangle(); | return Rectangle(); | ||||
| } | } | ||||
| bool ComponentAnimator::isAnimating (Component* component) const | |||||
| { | |||||
| return findTaskFor (component) != 0; | |||||
| } | |||||
| void ComponentAnimator::timerCallback() | void ComponentAnimator::timerCallback() | ||||
| { | { | ||||
| const uint32 timeNow = Time::getMillisecondCounter(); | const uint32 timeNow = Time::getMillisecondCounter(); | ||||
| @@ -57234,6 +57296,7 @@ void ComponentAnimator::timerCallback() | |||||
| { | { | ||||
| tasks.remove (i); | tasks.remove (i); | ||||
| delete at; | delete at; | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -57888,7 +57951,7 @@ void MultiDocumentPanel::addWindow (Component* component) | |||||
| } | } | ||||
| bool MultiDocumentPanel::addDocument (Component* const component, | bool MultiDocumentPanel::addDocument (Component* const component, | ||||
| const Colour& backgroundColour, | |||||
| const Colour& docColour, | |||||
| const bool deleteWhenRemoved) | const bool deleteWhenRemoved) | ||||
| { | { | ||||
| // If you try passing a full DocumentWindow or ResizableWindow in here, you'll end up | // If you try passing a full DocumentWindow or ResizableWindow in here, you'll end up | ||||
| @@ -57900,7 +57963,7 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||||
| components.add (component); | components.add (component); | ||||
| component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | ||||
| component->setComponentProperty (T("mdiDocumentBkg_"), backgroundColour); | |||||
| component->setComponentProperty (T("mdiDocumentBkg_"), docColour); | |||||
| component->addComponentListener (this); | component->addComponentListener (this); | ||||
| if (mode == FloatingWindows) | if (mode == FloatingWindows) | ||||
| @@ -57933,14 +57996,14 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||||
| Array <Component*> temp (components); | Array <Component*> temp (components); | ||||
| for (int i = 0; i < temp.size(); ++i) | for (int i = 0; i < temp.size(); ++i) | ||||
| tabComponent->addTab (temp[i]->getName(), backgroundColour, temp[i], false); | |||||
| tabComponent->addTab (temp[i]->getName(), docColour, temp[i], false); | |||||
| resized(); | resized(); | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| if (tabComponent != 0) | if (tabComponent != 0) | ||||
| tabComponent->addTab (component->getName(), backgroundColour, component, false); | |||||
| tabComponent->addTab (component->getName(), docColour, component, false); | |||||
| else | else | ||||
| addAndMakeVisible (component); | addAndMakeVisible (component); | ||||
| } | } | ||||
| @@ -70390,9 +70453,9 @@ class MagnifyingPeer : public ComponentPeer | |||||
| { | { | ||||
| public: | public: | ||||
| MagnifyingPeer (Component* const component, | |||||
| MagnifyingPeer (Component* const component_, | |||||
| MagnifierComponent* const magnifierComp_) | MagnifierComponent* const magnifierComp_) | ||||
| : ComponentPeer (component, 0), | |||||
| : ComponentPeer (component_, 0), | |||||
| magnifierComp (magnifierComp_) | magnifierComp (magnifierComp_) | ||||
| { | { | ||||
| } | } | ||||
| @@ -87970,65 +88033,65 @@ void PositionedRectangle::decodeSizeString (const String& s, uint8& mode, double | |||||
| } | } | ||||
| void PositionedRectangle::applyPosAndSize (double& xOut, double& wOut, | void PositionedRectangle::applyPosAndSize (double& xOut, double& wOut, | ||||
| const double x, const double w, | |||||
| const uint8 xMode, const uint8 wMode, | |||||
| const double x_, const double w_, | |||||
| const uint8 xMode_, const uint8 wMode_, | |||||
| const int parentPos, | const int parentPos, | ||||
| const int parentSize) const throw() | const int parentSize) const throw() | ||||
| { | { | ||||
| if (wMode == proportionalSize) | |||||
| wOut = roundDoubleToInt (w * parentSize); | |||||
| else if (wMode == parentSizeMinusAbsolute) | |||||
| wOut = jmax (0, parentSize - roundDoubleToInt (w)); | |||||
| if (wMode_ == proportionalSize) | |||||
| wOut = roundDoubleToInt (w_ * parentSize); | |||||
| else if (wMode_ == parentSizeMinusAbsolute) | |||||
| wOut = jmax (0, parentSize - roundDoubleToInt (w_)); | |||||
| else | else | ||||
| wOut = roundDoubleToInt (w); | |||||
| if ((xMode & proportionOfParentSize) != 0) | |||||
| xOut = parentPos + x * parentSize; | |||||
| else if ((xMode & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x; | |||||
| else if ((xMode & absoluteFromParentCentre) != 0) | |||||
| xOut = x + (parentPos + parentSize / 2); | |||||
| wOut = roundDoubleToInt (w_); | |||||
| if ((xMode_ & proportionOfParentSize) != 0) | |||||
| xOut = parentPos + x_ * parentSize; | |||||
| else if ((xMode_ & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x_; | |||||
| else if ((xMode_ & absoluteFromParentCentre) != 0) | |||||
| xOut = x_ + (parentPos + parentSize / 2); | |||||
| else | else | ||||
| xOut = x + parentPos; | |||||
| xOut = x_ + parentPos; | |||||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||||
| xOut -= wOut; | xOut -= wOut; | ||||
| else if ((xMode & anchorAtCentre) != 0) | |||||
| else if ((xMode_ & anchorAtCentre) != 0) | |||||
| xOut -= wOut / 2; | xOut -= wOut / 2; | ||||
| } | } | ||||
| void PositionedRectangle::updatePosAndSize (double& xOut, double& wOut, | void PositionedRectangle::updatePosAndSize (double& xOut, double& wOut, | ||||
| double x, const double w, | |||||
| const uint8 xMode, const uint8 wMode, | |||||
| double x_, const double w_, | |||||
| const uint8 xMode_, const uint8 wMode_, | |||||
| const int parentPos, | const int parentPos, | ||||
| const int parentSize) const throw() | const int parentSize) const throw() | ||||
| { | { | ||||
| if (wMode == proportionalSize) | |||||
| if (wMode_ == proportionalSize) | |||||
| { | { | ||||
| if (parentSize > 0) | if (parentSize > 0) | ||||
| wOut = w / parentSize; | |||||
| wOut = w_ / parentSize; | |||||
| } | } | ||||
| else if (wMode == parentSizeMinusAbsolute) | |||||
| wOut = parentSize - w; | |||||
| else if (wMode_ == parentSizeMinusAbsolute) | |||||
| wOut = parentSize - w_; | |||||
| else | else | ||||
| wOut = w; | |||||
| wOut = w_; | |||||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||||
| x += w; | |||||
| else if ((xMode & anchorAtCentre) != 0) | |||||
| x += w / 2; | |||||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||||
| x_ += w_; | |||||
| else if ((xMode_ & anchorAtCentre) != 0) | |||||
| x_ += w_ / 2; | |||||
| if ((xMode & proportionOfParentSize) != 0) | |||||
| if ((xMode_ & proportionOfParentSize) != 0) | |||||
| { | { | ||||
| if (parentSize > 0) | if (parentSize > 0) | ||||
| xOut = (x - parentPos) / parentSize; | |||||
| xOut = (x_ - parentPos) / parentSize; | |||||
| } | } | ||||
| else if ((xMode & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x; | |||||
| else if ((xMode & absoluteFromParentCentre) != 0) | |||||
| xOut = x - (parentPos + parentSize / 2); | |||||
| else if ((xMode_ & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x_; | |||||
| else if ((xMode_ & absoluteFromParentCentre) != 0) | |||||
| xOut = x_ - (parentPos + parentSize / 2); | |||||
| else | else | ||||
| xOut = x - parentPos; | |||||
| xOut = x_ - parentPos; | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -241899,11 +241962,10 @@ const File File::getLinkedTarget() const throw() | |||||
| else if (getFileExtension() != T(".lnk")) | else if (getFileExtension() != T(".lnk")) | ||||
| return result; | return result; | ||||
| IShellLink* shellLink = 0; | |||||
| if (SUCCEEDED (CoCreateInstance (CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, | |||||
| IID_IShellLink, (LPVOID*) &shellLink))) | |||||
| ComSmartPtr <IShellLink> shellLink; | |||||
| if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink, CLSCTX_INPROC_SERVER))) | |||||
| { | { | ||||
| IPersistFile* persistFile; | |||||
| ComSmartPtr <IPersistFile> persistFile; | |||||
| if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile))) | if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile))) | ||||
| { | { | ||||
| if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ)) | if (SUCCEEDED (persistFile->Load ((const WCHAR*) p, STGM_READ)) | ||||
| @@ -241915,11 +241977,7 @@ const File File::getLinkedTarget() const throw() | |||||
| if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) | if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) | ||||
| result = File (resolvedPath); | result = File (resolvedPath); | ||||
| } | } | ||||
| persistFile->Release(); | |||||
| } | } | ||||
| shellLink->Release(); | |||||
| } | } | ||||
| return result; | return result; | ||||
| @@ -246627,7 +246685,7 @@ static int CALLBACK browseCallbackProc (HWND hWnd, UINT msg, LPARAM lParam, LPAR | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void juce_setWindowStyleBit (HWND h, int styleType, int feature, bool bitIsSet) throw(); | |||||
| void juce_setWindowStyleBit (HWND h, const int styleType, const int feature, const bool bitIsSet) throw(); | |||||
| static UINT_PTR CALLBACK openCallback (HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM lParam) | static UINT_PTR CALLBACK openCallback (HWND hdlg, UINT uiMsg, WPARAM /*wParam*/, LPARAM lParam) | ||||
| { | { | ||||
| @@ -255520,6 +255578,7 @@ END_JUCE_NAMESPACE | |||||
| #include <utime.h> | #include <utime.h> | ||||
| #include <pwd.h> | #include <pwd.h> | ||||
| #include <fcntl.h> | #include <fcntl.h> | ||||
| #include <dlfcn.h> | |||||
| #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_fs.h | #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_fs.h | ||||
| #define U_MSDOS_SUPER_MAGIC (short) 0x4d44 // linux/msdos_fs.h | #define U_MSDOS_SUPER_MAGIC (short) 0x4d44 // linux/msdos_fs.h | ||||
| @@ -256180,6 +256239,15 @@ const File File::getSpecialLocation (const SpecialLocationType type) | |||||
| case currentExecutableFile: | case currentExecutableFile: | ||||
| case currentApplicationFile: | case currentApplicationFile: | ||||
| if (! executableFile.exists()) | |||||
| { | |||||
| Dl_info executableInfo; | |||||
| dladdr ((const void*) juce_getFileTimes, &executableInfo); | |||||
| if (executableInfo.dli_fname != 0) | |||||
| executableFile = File (String (executableInfo.dli_fname)); | |||||
| } | |||||
| // if this fails, it's probably because juce_setCurrentExecutableFileName() | // if this fails, it's probably because juce_setCurrentExecutableFileName() | ||||
| // was never called to set the filename - this should be done by the juce | // was never called to set the filename - this should be done by the juce | ||||
| // main() function, so maybe you've hacked it to use your own custom main()? | // main() function, so maybe you've hacked it to use your own custom main()? | ||||
| @@ -261939,8 +262007,6 @@ public: | |||||
| int ls, ps; | int ls, ps; | ||||
| const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | ||||
| jassert (! isARGB()) | |||||
| for (int y = sy; y < sy + dh; ++y) | for (int y = sy; y < sy + dh; ++y) | ||||
| { | { | ||||
| const uint8* p = pixels + y * ls + sx * ps; | const uint8* p = pixels + y * ls + sx * ps; | ||||
| @@ -263233,16 +263299,16 @@ private: | |||||
| { | { | ||||
| int netHints [2]; | int netHints [2]; | ||||
| int numHints = 0; | int numHints = 0; | ||||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||||
| if (netHints [numHints] != 0) | |||||
| ++numHints; | |||||
| if ((styleFlags & windowIsTemporary) != 0) | if ((styleFlags & windowIsTemporary) != 0) | ||||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | ||||
| else | else | ||||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_NORMAL", True); | netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_NORMAL", True); | ||||
| if (netHints [numHints] != 0) | |||||
| ++numHints; | |||||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||||
| if (netHints [numHints] != 0) | if (netHints [numHints] != 0) | ||||
| ++numHints; | ++numHints; | ||||
| @@ -266948,6 +267014,9 @@ END_JUCE_NAMESPACE | |||||
| - (void) rightMouseDown: (NSEvent*) ev; | - (void) rightMouseDown: (NSEvent*) ev; | ||||
| - (void) rightMouseDragged: (NSEvent*) ev; | - (void) rightMouseDragged: (NSEvent*) ev; | ||||
| - (void) rightMouseUp: (NSEvent*) ev; | - (void) rightMouseUp: (NSEvent*) ev; | ||||
| - (void) otherMouseDown: (NSEvent*) ev; | |||||
| - (void) otherMouseDragged: (NSEvent*) ev; | |||||
| - (void) otherMouseUp: (NSEvent*) ev; | |||||
| - (void) scrollWheel: (NSEvent*) ev; | - (void) scrollWheel: (NSEvent*) ev; | ||||
| - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | ||||
| - (void) frameChanged: (NSNotification*) n; | - (void) frameChanged: (NSNotification*) n; | ||||
| @@ -267206,6 +267275,21 @@ END_JUCE_NAMESPACE | |||||
| [self mouseUp: ev]; | [self mouseUp: ev]; | ||||
| } | } | ||||
| - (void) otherMouseDown: (NSEvent*) ev | |||||
| { | |||||
| [self mouseDown: ev]; | |||||
| } | |||||
| - (void) otherMouseDragged: (NSEvent*) ev | |||||
| { | |||||
| [self mouseDragged: ev]; | |||||
| } | |||||
| - (void) otherMouseUp: (NSEvent*) ev | |||||
| { | |||||
| [self mouseUp: ev]; | |||||
| } | |||||
| - (void) scrollWheel: (NSEvent*) ev | - (void) scrollWheel: (NSEvent*) ev | ||||
| { | { | ||||
| if (owner != 0) | if (owner != 0) | ||||
| @@ -271079,6 +271163,7 @@ void MessageManager::stopDispatchLoop() | |||||
| { | { | ||||
| quitMessagePosted = true; | quitMessagePosted = true; | ||||
| [NSApp stop: nil]; | [NSApp stop: nil]; | ||||
| [NSApp activateIgnoringOtherApps: YES]; // (if the app is inactive, it sits there and ignores the quit request until the next time it gets activated) | |||||
| } | } | ||||
| static bool isEventBlockedByModalComps (NSEvent* e) | static bool isEventBlockedByModalComps (NSEvent* e) | ||||
| @@ -3281,8 +3281,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| OwnedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ObjectClass*> (granularity), | |||||
| OwnedArray (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ObjectClass*> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -4557,8 +4557,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| Array (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity), | |||||
| Array (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -10474,8 +10474,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| SortedSet (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity), | |||||
| SortedSet (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -42387,8 +42387,12 @@ private: | |||||
| You'll need to make sure the animator object isn't deleted before it finishes | You'll need to make sure the animator object isn't deleted before it finishes | ||||
| moving the components. | moving the components. | ||||
| The class is a ChangeBroadcaster and sends a notification when any components | |||||
| start or finish being animated. | |||||
| */ | */ | ||||
| class JUCE_API ComponentAnimator : private Timer | |||||
| class JUCE_API ComponentAnimator : public ChangeBroadcaster, | |||||
| private Timer | |||||
| { | { | ||||
| public: | public: | ||||
| @@ -42458,6 +42462,10 @@ public: | |||||
| */ | */ | ||||
| const Rectangle getComponentDestination (Component* const component); | const Rectangle getComponentDestination (Component* const component); | ||||
| /** Returns true if the specified component is currently being animated. | |||||
| */ | |||||
| bool isAnimating (Component* component) const; | |||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| private: | private: | ||||
| @@ -621,12 +621,12 @@ class AiffAudioFormatWriter : public AudioFormatWriter | |||||
| public: | public: | ||||
| //============================================================================== | //============================================================================== | ||||
| AiffAudioFormatWriter (OutputStream* out, | AiffAudioFormatWriter (OutputStream* out, | ||||
| const double sampleRate, | |||||
| const double sampleRate_, | |||||
| const unsigned int chans, | const unsigned int chans, | ||||
| const int bits) | const int bits) | ||||
| : AudioFormatWriter (out, | : AudioFormatWriter (out, | ||||
| aiffFormatName, | aiffFormatName, | ||||
| sampleRate, | |||||
| sampleRate_, | |||||
| chans, | chans, | ||||
| bits), | bits), | ||||
| lengthInSamples (0), | lengthInSamples (0), | ||||
| @@ -863,9 +863,17 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||||
| { | { | ||||
| if (defaultMidiOutputName != deviceName) | if (defaultMidiOutputName != deviceName) | ||||
| { | { | ||||
| SortedSet <AudioIODeviceCallback*> oldCallbacks; | |||||
| { | |||||
| const ScopedLock sl (audioCallbackLock); | |||||
| oldCallbacks = callbacks; | |||||
| callbacks.clear(); | |||||
| } | |||||
| if (currentAudioDevice != 0) | if (currentAudioDevice != 0) | ||||
| for (int i = callbacks.size(); --i >= 0;) | |||||
| callbacks.getUnchecked(i)->audioDeviceStopped(); | |||||
| for (int i = oldCallbacks.size(); --i >= 0;) | |||||
| oldCallbacks.getUnchecked(i)->audioDeviceStopped(); | |||||
| deleteAndZero (defaultMidiOutput); | deleteAndZero (defaultMidiOutput); | ||||
| defaultMidiOutputName = deviceName; | defaultMidiOutputName = deviceName; | ||||
| @@ -874,8 +882,13 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||||
| defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | ||||
| if (currentAudioDevice != 0) | if (currentAudioDevice != 0) | ||||
| for (int i = callbacks.size(); --i >= 0;) | |||||
| callbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); | |||||
| for (int i = oldCallbacks.size(); --i >= 0;) | |||||
| oldCallbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); | |||||
| { | |||||
| const ScopedLock sl (audioCallbackLock); | |||||
| callbacks = oldCallbacks; | |||||
| } | |||||
| updateXml(); | updateXml(); | ||||
| sendChangeMessage (this); | sendChangeMessage (this); | ||||
| @@ -196,7 +196,7 @@ void DrawableButton::paintButton (Graphics& g, | |||||
| g.setFont ((float) textH); | g.setFont ((float) textH); | ||||
| g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | ||||
| g.drawFittedText (getName(), | |||||
| g.drawFittedText (getButtonText(), | |||||
| 2, getHeight() - textH - 1, | 2, getHeight() - textH - 1, | ||||
| getWidth() - 4, textH, | getWidth() - 4, textH, | ||||
| Justification::centred, 1); | Justification::centred, 1); | ||||
| @@ -39,8 +39,8 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| ImageButton::ImageButton (const String& text) | |||||
| : Button (text), | |||||
| ImageButton::ImageButton (const String& text_) | |||||
| : Button (text_), | |||||
| scaleImageToFit (true), | scaleImageToFit (true), | ||||
| preserveProportions (true), | preserveProportions (true), | ||||
| alphaThreshold (0), | alphaThreshold (0), | ||||
| @@ -40,11 +40,11 @@ BEGIN_JUCE_NAMESPACE | |||||
| //============================================================================== | //============================================================================== | ||||
| ToolbarButton::ToolbarButton (const int itemId, | |||||
| ToolbarButton::ToolbarButton (const int itemId_, | |||||
| const String& buttonText, | const String& buttonText, | ||||
| Drawable* const normalImage_, | Drawable* const normalImage_, | ||||
| Drawable* const toggledOnImage_) | Drawable* const toggledOnImage_) | ||||
| : ToolbarItemComponent (itemId, buttonText, true), | |||||
| : ToolbarItemComponent (itemId_, buttonText, true), | |||||
| normalImage (normalImage_), | normalImage (normalImage_), | ||||
| toggledOnImage (toggledOnImage_) | toggledOnImage (toggledOnImage_) | ||||
| { | { | ||||
| @@ -432,12 +432,12 @@ void TableListBox::paintListBoxItem (int, Graphics&, int, int, bool) | |||||
| { | { | ||||
| } | } | ||||
| Component* TableListBox::refreshComponentForRow (int rowNumber, bool isRowSelected, Component* existingComponentToUpdate) | |||||
| Component* TableListBox::refreshComponentForRow (int rowNumber, bool isRowSelected_, Component* existingComponentToUpdate) | |||||
| { | { | ||||
| if (existingComponentToUpdate == 0) | if (existingComponentToUpdate == 0) | ||||
| existingComponentToUpdate = new TableListRowComp (*this); | existingComponentToUpdate = new TableListRowComp (*this); | ||||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected); | |||||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected_); | |||||
| return existingComponentToUpdate; | return existingComponentToUpdate; | ||||
| } | } | ||||
| @@ -1619,7 +1619,7 @@ void Component::updateMouseCursor() const throw() | |||||
| sendFakeMouseMove(); | sendFakeMouseMove(); | ||||
| } | } | ||||
| void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||||
| void Component::internalUpdateMouseCursor (bool forcedUpdate) throw() | |||||
| { | { | ||||
| ComponentPeer* const peer = getPeer(); | ComponentPeer* const peer = getPeer(); | ||||
| @@ -1632,6 +1632,7 @@ void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||||
| || ! isCursorVisibleUntilOffscreen)) | || ! isCursorVisibleUntilOffscreen)) | ||||
| { | { | ||||
| mc = MouseCursor::NoCursor; | mc = MouseCursor::NoCursor; | ||||
| forcedUpdate = true; | |||||
| } | } | ||||
| static void* currentCursorHandle = 0; | static void* currentCursorHandle = 0; | ||||
| @@ -142,6 +142,7 @@ void ComponentAnimator::animateComponent (Component* const component, | |||||
| { | { | ||||
| at = new AnimationTask (component); | at = new AnimationTask (component); | ||||
| tasks.add (at); | tasks.add (at); | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| at->msElapsed = 0; | at->msElapsed = 0; | ||||
| @@ -181,6 +182,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin | |||||
| delete at; | delete at; | ||||
| tasks.remove (i); | tasks.remove (i); | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -196,6 +198,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, | |||||
| tasks.removeValue (at); | tasks.removeValue (at); | ||||
| delete at; | delete at; | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -211,6 +214,11 @@ const Rectangle ComponentAnimator::getComponentDestination (Component* const com | |||||
| return Rectangle(); | return Rectangle(); | ||||
| } | } | ||||
| bool ComponentAnimator::isAnimating (Component* component) const | |||||
| { | |||||
| return findTaskFor (component) != 0; | |||||
| } | |||||
| void ComponentAnimator::timerCallback() | void ComponentAnimator::timerCallback() | ||||
| { | { | ||||
| const uint32 timeNow = Time::getMillisecondCounter(); | const uint32 timeNow = Time::getMillisecondCounter(); | ||||
| @@ -228,6 +236,7 @@ void ComponentAnimator::timerCallback() | |||||
| { | { | ||||
| tasks.remove (i); | tasks.remove (i); | ||||
| delete at; | delete at; | ||||
| sendChangeMessage (this); | |||||
| } | } | ||||
| } | } | ||||
| @@ -34,6 +34,7 @@ | |||||
| #include "../juce_Component.h" | #include "../juce_Component.h" | ||||
| #include "../juce_ComponentDeletionWatcher.h" | #include "../juce_ComponentDeletionWatcher.h" | ||||
| #include "../../../events/juce_ChangeBroadcaster.h" | |||||
| #include "../../../events/juce_Timer.h" | #include "../../../events/juce_Timer.h" | ||||
| @@ -49,8 +50,12 @@ | |||||
| You'll need to make sure the animator object isn't deleted before it finishes | You'll need to make sure the animator object isn't deleted before it finishes | ||||
| moving the components. | moving the components. | ||||
| The class is a ChangeBroadcaster and sends a notification when any components | |||||
| start or finish being animated. | |||||
| */ | */ | ||||
| class JUCE_API ComponentAnimator : private Timer | |||||
| class JUCE_API ComponentAnimator : public ChangeBroadcaster, | |||||
| private Timer | |||||
| { | { | ||||
| public: | public: | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -121,6 +126,9 @@ public: | |||||
| */ | */ | ||||
| const Rectangle getComponentDestination (Component* const component); | const Rectangle getComponentDestination (Component* const component); | ||||
| /** Returns true if the specified component is currently being animated. | |||||
| */ | |||||
| bool isAnimating (Component* component) const; | |||||
| //============================================================================== | //============================================================================== | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| @@ -179,7 +179,7 @@ void MultiDocumentPanel::addWindow (Component* component) | |||||
| } | } | ||||
| bool MultiDocumentPanel::addDocument (Component* const component, | bool MultiDocumentPanel::addDocument (Component* const component, | ||||
| const Colour& backgroundColour, | |||||
| const Colour& docColour, | |||||
| const bool deleteWhenRemoved) | const bool deleteWhenRemoved) | ||||
| { | { | ||||
| // If you try passing a full DocumentWindow or ResizableWindow in here, you'll end up | // If you try passing a full DocumentWindow or ResizableWindow in here, you'll end up | ||||
| @@ -191,7 +191,7 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||||
| components.add (component); | components.add (component); | ||||
| component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | ||||
| component->setComponentProperty (T("mdiDocumentBkg_"), backgroundColour); | |||||
| component->setComponentProperty (T("mdiDocumentBkg_"), docColour); | |||||
| component->addComponentListener (this); | component->addComponentListener (this); | ||||
| if (mode == FloatingWindows) | if (mode == FloatingWindows) | ||||
| @@ -224,14 +224,14 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||||
| Array <Component*> temp (components); | Array <Component*> temp (components); | ||||
| for (int i = 0; i < temp.size(); ++i) | for (int i = 0; i < temp.size(); ++i) | ||||
| tabComponent->addTab (temp[i]->getName(), backgroundColour, temp[i], false); | |||||
| tabComponent->addTab (temp[i]->getName(), docColour, temp[i], false); | |||||
| resized(); | resized(); | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| if (tabComponent != 0) | if (tabComponent != 0) | ||||
| tabComponent->addTab (component->getName(), backgroundColour, component, false); | |||||
| tabComponent->addTab (component->getName(), docColour, component, false); | |||||
| else | else | ||||
| addAndMakeVisible (component); | addAndMakeVisible (component); | ||||
| } | } | ||||
| @@ -42,9 +42,9 @@ class MagnifyingPeer : public ComponentPeer | |||||
| { | { | ||||
| public: | public: | ||||
| //============================================================================== | //============================================================================== | ||||
| MagnifyingPeer (Component* const component, | |||||
| MagnifyingPeer (Component* const component_, | |||||
| MagnifierComponent* const magnifierComp_) | MagnifierComponent* const magnifierComp_) | ||||
| : ComponentPeer (component, 0), | |||||
| : ComponentPeer (component_, 0), | |||||
| magnifierComp (magnifierComp_) | magnifierComp (magnifierComp_) | ||||
| { | { | ||||
| } | } | ||||
| @@ -335,65 +335,65 @@ void PositionedRectangle::decodeSizeString (const String& s, uint8& mode, double | |||||
| } | } | ||||
| void PositionedRectangle::applyPosAndSize (double& xOut, double& wOut, | void PositionedRectangle::applyPosAndSize (double& xOut, double& wOut, | ||||
| const double x, const double w, | |||||
| const uint8 xMode, const uint8 wMode, | |||||
| const double x_, const double w_, | |||||
| const uint8 xMode_, const uint8 wMode_, | |||||
| const int parentPos, | const int parentPos, | ||||
| const int parentSize) const throw() | const int parentSize) const throw() | ||||
| { | { | ||||
| if (wMode == proportionalSize) | |||||
| wOut = roundDoubleToInt (w * parentSize); | |||||
| else if (wMode == parentSizeMinusAbsolute) | |||||
| wOut = jmax (0, parentSize - roundDoubleToInt (w)); | |||||
| if (wMode_ == proportionalSize) | |||||
| wOut = roundDoubleToInt (w_ * parentSize); | |||||
| else if (wMode_ == parentSizeMinusAbsolute) | |||||
| wOut = jmax (0, parentSize - roundDoubleToInt (w_)); | |||||
| else | else | ||||
| wOut = roundDoubleToInt (w); | |||||
| if ((xMode & proportionOfParentSize) != 0) | |||||
| xOut = parentPos + x * parentSize; | |||||
| else if ((xMode & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x; | |||||
| else if ((xMode & absoluteFromParentCentre) != 0) | |||||
| xOut = x + (parentPos + parentSize / 2); | |||||
| wOut = roundDoubleToInt (w_); | |||||
| if ((xMode_ & proportionOfParentSize) != 0) | |||||
| xOut = parentPos + x_ * parentSize; | |||||
| else if ((xMode_ & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x_; | |||||
| else if ((xMode_ & absoluteFromParentCentre) != 0) | |||||
| xOut = x_ + (parentPos + parentSize / 2); | |||||
| else | else | ||||
| xOut = x + parentPos; | |||||
| xOut = x_ + parentPos; | |||||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||||
| xOut -= wOut; | xOut -= wOut; | ||||
| else if ((xMode & anchorAtCentre) != 0) | |||||
| else if ((xMode_ & anchorAtCentre) != 0) | |||||
| xOut -= wOut / 2; | xOut -= wOut / 2; | ||||
| } | } | ||||
| void PositionedRectangle::updatePosAndSize (double& xOut, double& wOut, | void PositionedRectangle::updatePosAndSize (double& xOut, double& wOut, | ||||
| double x, const double w, | |||||
| const uint8 xMode, const uint8 wMode, | |||||
| double x_, const double w_, | |||||
| const uint8 xMode_, const uint8 wMode_, | |||||
| const int parentPos, | const int parentPos, | ||||
| const int parentSize) const throw() | const int parentSize) const throw() | ||||
| { | { | ||||
| if (wMode == proportionalSize) | |||||
| if (wMode_ == proportionalSize) | |||||
| { | { | ||||
| if (parentSize > 0) | if (parentSize > 0) | ||||
| wOut = w / parentSize; | |||||
| wOut = w_ / parentSize; | |||||
| } | } | ||||
| else if (wMode == parentSizeMinusAbsolute) | |||||
| wOut = parentSize - w; | |||||
| else if (wMode_ == parentSizeMinusAbsolute) | |||||
| wOut = parentSize - w_; | |||||
| else | else | ||||
| wOut = w; | |||||
| wOut = w_; | |||||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||||
| x += w; | |||||
| else if ((xMode & anchorAtCentre) != 0) | |||||
| x += w / 2; | |||||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||||
| x_ += w_; | |||||
| else if ((xMode_ & anchorAtCentre) != 0) | |||||
| x_ += w_ / 2; | |||||
| if ((xMode & proportionOfParentSize) != 0) | |||||
| if ((xMode_ & proportionOfParentSize) != 0) | |||||
| { | { | ||||
| if (parentSize > 0) | if (parentSize > 0) | ||||
| xOut = (x - parentPos) / parentSize; | |||||
| xOut = (x_ - parentPos) / parentSize; | |||||
| } | } | ||||
| else if ((xMode & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x; | |||||
| else if ((xMode & absoluteFromParentCentre) != 0) | |||||
| xOut = x - (parentPos + parentSize / 2); | |||||
| else if ((xMode_ & absoluteFromParentBottomRight) != 0) | |||||
| xOut = (parentPos + parentSize) - x_; | |||||
| else if ((xMode_ & absoluteFromParentCentre) != 0) | |||||
| xOut = x_ - (parentPos + parentSize / 2); | |||||
| else | else | ||||
| xOut = x - parentPos; | |||||
| xOut = x_ - parentPos; | |||||
| } | } | ||||
| END_JUCE_NAMESPACE | END_JUCE_NAMESPACE | ||||
| @@ -70,8 +70,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| Array (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity), | |||||
| Array (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -71,8 +71,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| OwnedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ObjectClass*> (granularity), | |||||
| OwnedArray (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ObjectClass*> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -76,8 +76,8 @@ public: | |||||
| @see ArrayAllocationBase | @see ArrayAllocationBase | ||||
| */ | */ | ||||
| SortedSet (const int granularity = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity), | |||||
| SortedSet (const int granularity_ = juceDefaultArrayGranularity) throw() | |||||
| : ArrayAllocationBase <ElementType> (granularity_), | |||||
| numUsed (0) | numUsed (0) | ||||
| { | { | ||||
| } | } | ||||
| @@ -504,7 +504,7 @@ bool StreamingSocket::isLocal() const throw() | |||||
| DatagramSocket::DatagramSocket (const int localPortNumber) | DatagramSocket::DatagramSocket (const int localPortNumber) | ||||
| : portNumber (0), | : portNumber (0), | ||||
| handle (-1), | handle (-1), | ||||
| connected (false), | |||||
| connected (true), | |||||
| serverAddress (0) | serverAddress (0) | ||||
| { | { | ||||
| #if JUCE_WIN32 | #if JUCE_WIN32 | ||||