| @@ -42,6 +42,7 @@ | |||
| #include <utime.h> | |||
| #include <pwd.h> | |||
| #include <fcntl.h> | |||
| #include <dlfcn.h> | |||
| #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_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 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() | |||
| // 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()? | |||
| @@ -660,8 +660,6 @@ public: | |||
| int ls, ps; | |||
| const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | |||
| jassert (! isARGB()) | |||
| for (int y = sy; y < sy + dh; ++y) | |||
| { | |||
| const uint8* p = pixels + y * ls + sx * ps; | |||
| @@ -1961,16 +1959,16 @@ private: | |||
| { | |||
| int netHints [2]; | |||
| int numHints = 0; | |||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||
| if (netHints [numHints] != 0) | |||
| ++numHints; | |||
| if ((styleFlags & windowIsTemporary) != 0) | |||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | |||
| else | |||
| 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) | |||
| ++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) rightMouseDragged: (NSEvent*) ev; | |||
| - (void) rightMouseUp: (NSEvent*) ev; | |||
| - (void) otherMouseDown: (NSEvent*) ev; | |||
| - (void) otherMouseDragged: (NSEvent*) ev; | |||
| - (void) otherMouseUp: (NSEvent*) ev; | |||
| - (void) scrollWheel: (NSEvent*) ev; | |||
| - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | |||
| - (void) frameChanged: (NSNotification*) n; | |||
| @@ -331,6 +334,21 @@ END_JUCE_NAMESPACE | |||
| [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 | |||
| { | |||
| if (owner != 0) | |||
| @@ -70,7 +70,7 @@ static int CALLBACK browseCallbackProc (HWND hWnd, UINT msg, LPARAM lParam, LPAR | |||
| 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) | |||
| { | |||
| @@ -564,11 +564,10 @@ const File File::getLinkedTarget() const throw() | |||
| else if (getFileExtension() != T(".lnk")) | |||
| 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 (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))) | |||
| result = File (resolvedPath); | |||
| } | |||
| persistFile->Release(); | |||
| } | |||
| shellLink->Release(); | |||
| } | |||
| return result; | |||
| @@ -153,4 +153,46 @@ | |||
| #pragma warning (pop) | |||
| #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__ | |||
| @@ -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" | |||
| > | |||
| </File> | |||
| <File | |||
| RelativePath="..\platform_specific_code\win32_headers.h" | |||
| > | |||
| </File> | |||
| </Filter> | |||
| </Filter> | |||
| </Files> | |||
| @@ -11,6 +11,7 @@ | |||
| 841083D50DB36EA400AB8583 /* MainComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 841083D30DB36EA400AB8583 /* MainComponent.cpp */; }; | |||
| 841084880DB374E700AB8583 /* juce.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 841084870DB374E700AB8583 /* juce.xcconfig */; }; | |||
| 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 */; }; | |||
| 84F30CD108FEAAA20087E26C /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F30CD008FEAAA20087E26C /* Main.cpp */; }; | |||
| 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; }; | |||
| 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>"; }; | |||
| 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>"; }; | |||
| 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>"; }; | |||
| @@ -64,6 +66,7 @@ | |||
| 84FBB8880E06CCE900B52196 /* AudioUnit.framework in Frameworks */, | |||
| 84FBB88D0E06CD0100B52196 /* WebKit.framework in Frameworks */, | |||
| 846EC7870EB607050080CCFF /* QTKit.framework in Frameworks */, | |||
| 84204DA50FDEFA3800FA4ABC /* Carbon.framework in Frameworks */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| @@ -115,6 +118,7 @@ | |||
| 20286C32FDCF999611CA2CEA /* External Frameworks and Libraries */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 84204DA40FDEFA3800FA4ABC /* Carbon.framework */, | |||
| 84FBB8870E06CCE900B52196 /* AudioUnit.framework */, | |||
| 84FBB8720E06CC5D00B52196 /* Cocoa.framework */, | |||
| 4A9504CAFFE6A41611CA0CBA /* CoreServices.framework */, | |||
| @@ -107,9 +107,6 @@ | |||
| <Tool | |||
| Name="VCAppVerifierTool" | |||
| /> | |||
| <Tool | |||
| Name="VCWebDeploymentTool" | |||
| /> | |||
| <Tool | |||
| Name="VCPostBuildEventTool" | |||
| /> | |||
| @@ -148,7 +145,7 @@ | |||
| Name="VCCLCompilerTool" | |||
| Optimization="0" | |||
| PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" | |||
| MinimalRebuild="true" | |||
| MinimalRebuild="false" | |||
| BasicRuntimeChecks="3" | |||
| RuntimeLibrary="1" | |||
| BufferSecurityCheck="true" | |||
| @@ -176,7 +173,6 @@ | |||
| <Tool | |||
| Name="VCLinkerTool" | |||
| OutputFile=".\Debug/jucedemo.exe" | |||
| LinkIncremental="2" | |||
| SuppressStartupBanner="true" | |||
| AdditionalLibraryDirectories="../../../juce/bin" | |||
| IgnoreDefaultLibraryNames="libcmt.lib, msvcrt.lib" | |||
| @@ -205,9 +201,6 @@ | |||
| <Tool | |||
| Name="VCAppVerifierTool" | |||
| /> | |||
| <Tool | |||
| Name="VCWebDeploymentTool" | |||
| /> | |||
| <Tool | |||
| Name="VCPostBuildEventTool" | |||
| /> | |||
| @@ -568,6 +568,46 @@ | |||
| #pragma warning (pop) | |||
| #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__ | |||
| /********* End of inlined file: juce_win32_NativeIncludes.h *********/ | |||
| @@ -7655,7 +7695,7 @@ bool StreamingSocket::isLocal() const throw() | |||
| DatagramSocket::DatagramSocket (const int localPortNumber) | |||
| : portNumber (0), | |||
| handle (-1), | |||
| connected (false), | |||
| connected (true), | |||
| serverAddress (0) | |||
| { | |||
| #if JUCE_WIN32 | |||
| @@ -17803,12 +17843,12 @@ class AiffAudioFormatWriter : public AudioFormatWriter | |||
| public: | |||
| AiffAudioFormatWriter (OutputStream* out, | |||
| const double sampleRate, | |||
| const double sampleRate_, | |||
| const unsigned int chans, | |||
| const int bits) | |||
| : AudioFormatWriter (out, | |||
| aiffFormatName, | |||
| sampleRate, | |||
| sampleRate_, | |||
| chans, | |||
| bits), | |||
| lengthInSamples (0), | |||
| @@ -23300,9 +23340,17 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||
| { | |||
| if (defaultMidiOutputName != deviceName) | |||
| { | |||
| SortedSet <AudioIODeviceCallback*> oldCallbacks; | |||
| { | |||
| const ScopedLock sl (audioCallbackLock); | |||
| oldCallbacks = callbacks; | |||
| callbacks.clear(); | |||
| } | |||
| 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); | |||
| defaultMidiOutputName = deviceName; | |||
| @@ -23311,8 +23359,13 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||
| defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | |||
| 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(); | |||
| sendChangeMessage (this); | |||
| @@ -39550,7 +39603,7 @@ void Component::updateMouseCursor() const throw() | |||
| sendFakeMouseMove(); | |||
| } | |||
| void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||
| void Component::internalUpdateMouseCursor (bool forcedUpdate) throw() | |||
| { | |||
| ComponentPeer* const peer = getPeer(); | |||
| @@ -39563,6 +39616,7 @@ void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||
| || ! isCursorVisibleUntilOffscreen)) | |||
| { | |||
| mc = MouseCursor::NoCursor; | |||
| forcedUpdate = true; | |||
| } | |||
| static void* currentCursorHandle = 0; | |||
| @@ -42841,7 +42895,7 @@ void DrawableButton::paintButton (Graphics& g, | |||
| g.setFont ((float) textH); | |||
| g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | |||
| g.drawFittedText (getName(), | |||
| g.drawFittedText (getButtonText(), | |||
| 2, getHeight() - textH - 1, | |||
| getWidth() - 4, textH, | |||
| Justification::centred, 1); | |||
| @@ -43046,8 +43100,8 @@ END_JUCE_NAMESPACE | |||
| BEGIN_JUCE_NAMESPACE | |||
| ImageButton::ImageButton (const String& text) | |||
| : Button (text), | |||
| ImageButton::ImageButton (const String& text_) | |||
| : Button (text_), | |||
| scaleImageToFit (true), | |||
| preserveProportions (true), | |||
| alphaThreshold (0), | |||
| @@ -43446,11 +43500,11 @@ END_JUCE_NAMESPACE | |||
| BEGIN_JUCE_NAMESPACE | |||
| ToolbarButton::ToolbarButton (const int itemId, | |||
| ToolbarButton::ToolbarButton (const int itemId_, | |||
| const String& buttonText, | |||
| Drawable* const normalImage_, | |||
| Drawable* const toggledOnImage_) | |||
| : ToolbarItemComponent (itemId, buttonText, true), | |||
| : ToolbarItemComponent (itemId_, buttonText, true), | |||
| normalImage (normalImage_), | |||
| 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) | |||
| existingComponentToUpdate = new TableListRowComp (*this); | |||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected); | |||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected_); | |||
| return existingComponentToUpdate; | |||
| } | |||
| @@ -57148,6 +57202,7 @@ void ComponentAnimator::animateComponent (Component* const component, | |||
| { | |||
| at = new AnimationTask (component); | |||
| tasks.add (at); | |||
| sendChangeMessage (this); | |||
| } | |||
| at->msElapsed = 0; | |||
| @@ -57187,6 +57242,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin | |||
| delete at; | |||
| tasks.remove (i); | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -57202,6 +57258,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, | |||
| tasks.removeValue (at); | |||
| delete at; | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -57217,6 +57274,11 @@ const Rectangle ComponentAnimator::getComponentDestination (Component* const com | |||
| return Rectangle(); | |||
| } | |||
| bool ComponentAnimator::isAnimating (Component* component) const | |||
| { | |||
| return findTaskFor (component) != 0; | |||
| } | |||
| void ComponentAnimator::timerCallback() | |||
| { | |||
| const uint32 timeNow = Time::getMillisecondCounter(); | |||
| @@ -57234,6 +57296,7 @@ void ComponentAnimator::timerCallback() | |||
| { | |||
| tasks.remove (i); | |||
| delete at; | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -57888,7 +57951,7 @@ void MultiDocumentPanel::addWindow (Component* component) | |||
| } | |||
| bool MultiDocumentPanel::addDocument (Component* const component, | |||
| const Colour& backgroundColour, | |||
| const Colour& docColour, | |||
| const bool deleteWhenRemoved) | |||
| { | |||
| // 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); | |||
| component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | |||
| component->setComponentProperty (T("mdiDocumentBkg_"), backgroundColour); | |||
| component->setComponentProperty (T("mdiDocumentBkg_"), docColour); | |||
| component->addComponentListener (this); | |||
| if (mode == FloatingWindows) | |||
| @@ -57933,14 +57996,14 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||
| Array <Component*> temp (components); | |||
| 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(); | |||
| } | |||
| else | |||
| { | |||
| if (tabComponent != 0) | |||
| tabComponent->addTab (component->getName(), backgroundColour, component, false); | |||
| tabComponent->addTab (component->getName(), docColour, component, false); | |||
| else | |||
| addAndMakeVisible (component); | |||
| } | |||
| @@ -70390,9 +70453,9 @@ class MagnifyingPeer : public ComponentPeer | |||
| { | |||
| public: | |||
| MagnifyingPeer (Component* const component, | |||
| MagnifyingPeer (Component* const component_, | |||
| MagnifierComponent* const magnifierComp_) | |||
| : ComponentPeer (component, 0), | |||
| : ComponentPeer (component_, 0), | |||
| magnifierComp (magnifierComp_) | |||
| { | |||
| } | |||
| @@ -87970,65 +88033,65 @@ void PositionedRectangle::decodeSizeString (const String& s, uint8& mode, double | |||
| } | |||
| 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 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 | |||
| 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 | |||
| xOut = x + parentPos; | |||
| xOut = x_ + parentPos; | |||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||
| xOut -= wOut; | |||
| else if ((xMode & anchorAtCentre) != 0) | |||
| else if ((xMode_ & anchorAtCentre) != 0) | |||
| xOut -= wOut / 2; | |||
| } | |||
| 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 parentSize) const throw() | |||
| { | |||
| if (wMode == proportionalSize) | |||
| if (wMode_ == proportionalSize) | |||
| { | |||
| if (parentSize > 0) | |||
| wOut = w / parentSize; | |||
| wOut = w_ / parentSize; | |||
| } | |||
| else if (wMode == parentSizeMinusAbsolute) | |||
| wOut = parentSize - w; | |||
| else if (wMode_ == parentSizeMinusAbsolute) | |||
| wOut = parentSize - w_; | |||
| 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) | |||
| 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 | |||
| xOut = x - parentPos; | |||
| xOut = x_ - parentPos; | |||
| } | |||
| END_JUCE_NAMESPACE | |||
| @@ -241899,11 +241962,10 @@ const File File::getLinkedTarget() const throw() | |||
| else if (getFileExtension() != T(".lnk")) | |||
| 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 (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))) | |||
| result = File (resolvedPath); | |||
| } | |||
| persistFile->Release(); | |||
| } | |||
| shellLink->Release(); | |||
| } | |||
| return result; | |||
| @@ -246627,7 +246685,7 @@ static int CALLBACK browseCallbackProc (HWND hWnd, UINT msg, LPARAM lParam, LPAR | |||
| 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) | |||
| { | |||
| @@ -255520,6 +255578,7 @@ END_JUCE_NAMESPACE | |||
| #include <utime.h> | |||
| #include <pwd.h> | |||
| #include <fcntl.h> | |||
| #include <dlfcn.h> | |||
| #define U_ISOFS_SUPER_MAGIC (short) 0x9660 // linux/iso_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 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() | |||
| // 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()? | |||
| @@ -261939,8 +262007,6 @@ public: | |||
| int ls, ps; | |||
| const uint8* const pixels = lockPixelDataReadOnly (0, 0, getWidth(), getHeight(), ls, ps); | |||
| jassert (! isARGB()) | |||
| for (int y = sy; y < sy + dh; ++y) | |||
| { | |||
| const uint8* p = pixels + y * ls + sx * ps; | |||
| @@ -263233,16 +263299,16 @@ private: | |||
| { | |||
| int netHints [2]; | |||
| int numHints = 0; | |||
| netHints[numHints] = XInternAtom (display, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True); | |||
| if (netHints [numHints] != 0) | |||
| ++numHints; | |||
| if ((styleFlags & windowIsTemporary) != 0) | |||
| netHints [numHints] = XInternAtom (display, "_NET_WM_WINDOW_TYPE_MENU", True); | |||
| else | |||
| 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) | |||
| ++numHints; | |||
| @@ -266948,6 +267014,9 @@ END_JUCE_NAMESPACE | |||
| - (void) rightMouseDown: (NSEvent*) ev; | |||
| - (void) rightMouseDragged: (NSEvent*) ev; | |||
| - (void) rightMouseUp: (NSEvent*) ev; | |||
| - (void) otherMouseDown: (NSEvent*) ev; | |||
| - (void) otherMouseDragged: (NSEvent*) ev; | |||
| - (void) otherMouseUp: (NSEvent*) ev; | |||
| - (void) scrollWheel: (NSEvent*) ev; | |||
| - (BOOL) acceptsFirstMouse: (NSEvent*) ev; | |||
| - (void) frameChanged: (NSNotification*) n; | |||
| @@ -267206,6 +267275,21 @@ END_JUCE_NAMESPACE | |||
| [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 | |||
| { | |||
| if (owner != 0) | |||
| @@ -271079,6 +271163,7 @@ 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) | |||
| @@ -3281,8 +3281,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| OwnedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ObjectClass*> (granularity), | |||
| OwnedArray (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ObjectClass*> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -4557,8 +4557,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| Array (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity), | |||
| Array (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -10474,8 +10474,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| SortedSet (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity), | |||
| SortedSet (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -42387,8 +42387,12 @@ private: | |||
| You'll need to make sure the animator object isn't deleted before it finishes | |||
| 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: | |||
| @@ -42458,6 +42462,10 @@ public: | |||
| */ | |||
| const Rectangle getComponentDestination (Component* const component); | |||
| /** Returns true if the specified component is currently being animated. | |||
| */ | |||
| bool isAnimating (Component* component) const; | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| @@ -621,12 +621,12 @@ class AiffAudioFormatWriter : public AudioFormatWriter | |||
| public: | |||
| //============================================================================== | |||
| AiffAudioFormatWriter (OutputStream* out, | |||
| const double sampleRate, | |||
| const double sampleRate_, | |||
| const unsigned int chans, | |||
| const int bits) | |||
| : AudioFormatWriter (out, | |||
| aiffFormatName, | |||
| sampleRate, | |||
| sampleRate_, | |||
| chans, | |||
| bits), | |||
| lengthInSamples (0), | |||
| @@ -863,9 +863,17 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||
| { | |||
| if (defaultMidiOutputName != deviceName) | |||
| { | |||
| SortedSet <AudioIODeviceCallback*> oldCallbacks; | |||
| { | |||
| const ScopedLock sl (audioCallbackLock); | |||
| oldCallbacks = callbacks; | |||
| callbacks.clear(); | |||
| } | |||
| 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); | |||
| defaultMidiOutputName = deviceName; | |||
| @@ -874,8 +882,13 @@ void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) | |||
| defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); | |||
| 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(); | |||
| sendChangeMessage (this); | |||
| @@ -196,7 +196,7 @@ void DrawableButton::paintButton (Graphics& g, | |||
| g.setFont ((float) textH); | |||
| g.setColour (Colours::black.withAlpha (isEnabled() ? 1.0f : 0.4f)); | |||
| g.drawFittedText (getName(), | |||
| g.drawFittedText (getButtonText(), | |||
| 2, getHeight() - textH - 1, | |||
| getWidth() - 4, textH, | |||
| 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), | |||
| preserveProportions (true), | |||
| alphaThreshold (0), | |||
| @@ -40,11 +40,11 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| ToolbarButton::ToolbarButton (const int itemId, | |||
| ToolbarButton::ToolbarButton (const int itemId_, | |||
| const String& buttonText, | |||
| Drawable* const normalImage_, | |||
| Drawable* const toggledOnImage_) | |||
| : ToolbarItemComponent (itemId, buttonText, true), | |||
| : ToolbarItemComponent (itemId_, buttonText, true), | |||
| normalImage (normalImage_), | |||
| 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) | |||
| existingComponentToUpdate = new TableListRowComp (*this); | |||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected); | |||
| ((TableListRowComp*) existingComponentToUpdate)->update (rowNumber, isRowSelected_); | |||
| return existingComponentToUpdate; | |||
| } | |||
| @@ -1619,7 +1619,7 @@ void Component::updateMouseCursor() const throw() | |||
| sendFakeMouseMove(); | |||
| } | |||
| void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||
| void Component::internalUpdateMouseCursor (bool forcedUpdate) throw() | |||
| { | |||
| ComponentPeer* const peer = getPeer(); | |||
| @@ -1632,6 +1632,7 @@ void Component::internalUpdateMouseCursor (const bool forcedUpdate) throw() | |||
| || ! isCursorVisibleUntilOffscreen)) | |||
| { | |||
| mc = MouseCursor::NoCursor; | |||
| forcedUpdate = true; | |||
| } | |||
| static void* currentCursorHandle = 0; | |||
| @@ -142,6 +142,7 @@ void ComponentAnimator::animateComponent (Component* const component, | |||
| { | |||
| at = new AnimationTask (component); | |||
| tasks.add (at); | |||
| sendChangeMessage (this); | |||
| } | |||
| at->msElapsed = 0; | |||
| @@ -181,6 +182,7 @@ void ComponentAnimator::cancelAllAnimations (const bool moveComponentsToTheirFin | |||
| delete at; | |||
| tasks.remove (i); | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -196,6 +198,7 @@ void ComponentAnimator::cancelAnimation (Component* const component, | |||
| tasks.removeValue (at); | |||
| delete at; | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -211,6 +214,11 @@ const Rectangle ComponentAnimator::getComponentDestination (Component* const com | |||
| return Rectangle(); | |||
| } | |||
| bool ComponentAnimator::isAnimating (Component* component) const | |||
| { | |||
| return findTaskFor (component) != 0; | |||
| } | |||
| void ComponentAnimator::timerCallback() | |||
| { | |||
| const uint32 timeNow = Time::getMillisecondCounter(); | |||
| @@ -228,6 +236,7 @@ void ComponentAnimator::timerCallback() | |||
| { | |||
| tasks.remove (i); | |||
| delete at; | |||
| sendChangeMessage (this); | |||
| } | |||
| } | |||
| @@ -34,6 +34,7 @@ | |||
| #include "../juce_Component.h" | |||
| #include "../juce_ComponentDeletionWatcher.h" | |||
| #include "../../../events/juce_ChangeBroadcaster.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 | |||
| 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: | |||
| //============================================================================== | |||
| @@ -121,6 +126,9 @@ public: | |||
| */ | |||
| const Rectangle getComponentDestination (Component* const component); | |||
| /** Returns true if the specified component is currently being animated. | |||
| */ | |||
| bool isAnimating (Component* component) const; | |||
| //============================================================================== | |||
| juce_UseDebuggingNewOperator | |||
| @@ -179,7 +179,7 @@ void MultiDocumentPanel::addWindow (Component* component) | |||
| } | |||
| bool MultiDocumentPanel::addDocument (Component* const component, | |||
| const Colour& backgroundColour, | |||
| const Colour& docColour, | |||
| const bool deleteWhenRemoved) | |||
| { | |||
| // 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); | |||
| component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved); | |||
| component->setComponentProperty (T("mdiDocumentBkg_"), backgroundColour); | |||
| component->setComponentProperty (T("mdiDocumentBkg_"), docColour); | |||
| component->addComponentListener (this); | |||
| if (mode == FloatingWindows) | |||
| @@ -224,14 +224,14 @@ bool MultiDocumentPanel::addDocument (Component* const component, | |||
| Array <Component*> temp (components); | |||
| 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(); | |||
| } | |||
| else | |||
| { | |||
| if (tabComponent != 0) | |||
| tabComponent->addTab (component->getName(), backgroundColour, component, false); | |||
| tabComponent->addTab (component->getName(), docColour, component, false); | |||
| else | |||
| addAndMakeVisible (component); | |||
| } | |||
| @@ -42,9 +42,9 @@ class MagnifyingPeer : public ComponentPeer | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| MagnifyingPeer (Component* const component, | |||
| MagnifyingPeer (Component* const component_, | |||
| MagnifierComponent* const magnifierComp_) | |||
| : ComponentPeer (component, 0), | |||
| : ComponentPeer (component_, 0), | |||
| magnifierComp (magnifierComp_) | |||
| { | |||
| } | |||
| @@ -335,65 +335,65 @@ void PositionedRectangle::decodeSizeString (const String& s, uint8& mode, double | |||
| } | |||
| 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 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 | |||
| 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 | |||
| xOut = x + parentPos; | |||
| xOut = x_ + parentPos; | |||
| if ((xMode & anchorAtRightOrBottom) != 0) | |||
| if ((xMode_ & anchorAtRightOrBottom) != 0) | |||
| xOut -= wOut; | |||
| else if ((xMode & anchorAtCentre) != 0) | |||
| else if ((xMode_ & anchorAtCentre) != 0) | |||
| xOut -= wOut / 2; | |||
| } | |||
| 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 parentSize) const throw() | |||
| { | |||
| if (wMode == proportionalSize) | |||
| if (wMode_ == proportionalSize) | |||
| { | |||
| if (parentSize > 0) | |||
| wOut = w / parentSize; | |||
| wOut = w_ / parentSize; | |||
| } | |||
| else if (wMode == parentSizeMinusAbsolute) | |||
| wOut = parentSize - w; | |||
| else if (wMode_ == parentSizeMinusAbsolute) | |||
| wOut = parentSize - w_; | |||
| 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) | |||
| 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 | |||
| xOut = x - parentPos; | |||
| xOut = x_ - parentPos; | |||
| } | |||
| END_JUCE_NAMESPACE | |||
| @@ -70,8 +70,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| Array (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity), | |||
| Array (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -71,8 +71,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| OwnedArray (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ObjectClass*> (granularity), | |||
| OwnedArray (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ObjectClass*> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -76,8 +76,8 @@ public: | |||
| @see ArrayAllocationBase | |||
| */ | |||
| SortedSet (const int granularity = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity), | |||
| SortedSet (const int granularity_ = juceDefaultArrayGranularity) throw() | |||
| : ArrayAllocationBase <ElementType> (granularity_), | |||
| numUsed (0) | |||
| { | |||
| } | |||
| @@ -504,7 +504,7 @@ bool StreamingSocket::isLocal() const throw() | |||
| DatagramSocket::DatagramSocket (const int localPortNumber) | |||
| : portNumber (0), | |||
| handle (-1), | |||
| connected (false), | |||
| connected (true), | |||
| serverAddress (0) | |||
| { | |||
| #if JUCE_WIN32 | |||