Browse Source

Tweaks to VST for building on linux; improved linux code for detecting the executable's file path; small changes to linux window hinting; change on the Mac to fix app shutdown when the app isn't currently active; added Mac support for 3rd mouse button; fix to AudioDeviceManager thread safety when changing midi output devices; fix to DrawableButton text; made ComponentAnimator a change broadcaster to send messages when animations stop and start; small fix to DatagramSocket.

tags/2021-05-28
jules 16 years ago
parent
commit
749c2be6cb
30 changed files with 2360 additions and 2232 deletions
  1. +10
    -0
      build/linux/platform_specific_code/juce_linux_Files.cpp
  2. +5
    -7
      build/linux/platform_specific_code/juce_linux_Windowing.cpp
  3. +463
    -462
      build/macosx/platform_specific_code/juce_mac_MessageManager.mm
  4. +18
    -0
      build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm
  5. +1
    -1
      build/win32/platform_specific_code/juce_win32_FileChooser.cpp
  6. +3
    -8
      build/win32/platform_specific_code/juce_win32_Files.cpp
  7. +42
    -0
      build/win32/platform_specific_code/juce_win32_NativeIncludes.h
  8. +0
    -69
      build/win32/platform_specific_code/win32_headers.h
  9. +0
    -4
      build/win32/vc8/JUCE.vcproj
  10. +1547
    -1531
      extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp
  11. +4
    -0
      extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj
  12. +1
    -8
      extras/juce demo/build/win32_vc8/jucedemo.vcproj
  13. +157
    -72
      juce_amalgamated.cpp
  14. +15
    -7
      juce_amalgamated.h
  15. +2
    -2
      src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp
  16. +17
    -4
      src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp
  17. +1
    -1
      src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp
  18. +2
    -2
      src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp
  19. +2
    -2
      src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp
  20. +2
    -2
      src/juce_appframework/gui/components/controls/juce_TableListBox.cpp
  21. +2
    -1
      src/juce_appframework/gui/components/juce_Component.cpp
  22. +9
    -0
      src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp
  23. +9
    -1
      src/juce_appframework/gui/components/layout/juce_ComponentAnimator.h
  24. +4
    -4
      src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp
  25. +2
    -2
      src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp
  26. +35
    -35
      src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp
  27. +2
    -2
      src/juce_core/containers/juce_Array.h
  28. +2
    -2
      src/juce_core/containers/juce_OwnedArray.h
  29. +2
    -2
      src/juce_core/containers/juce_SortedSet.h
  30. +1
    -1
      src/juce_core/io/network/juce_Socket.cpp

+ 10
- 0
build/linux/platform_specific_code/juce_linux_Files.cpp View File

@@ -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()?


+ 5
- 7
build/linux/platform_specific_code/juce_linux_Windowing.cpp View File

@@ -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;


+ 463
- 462
build/macosx/platform_specific_code/juce_mac_MessageManager.mm View File

@@ -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

+ 18
- 0
build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm View File

@@ -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)


+ 1
- 1
build/win32/platform_specific_code/juce_win32_FileChooser.cpp View File

@@ -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)
{ {


+ 3
- 8
build/win32/platform_specific_code/juce_win32_Files.cpp View File

@@ -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;


+ 42
- 0
build/win32/platform_specific_code/juce_win32_NativeIncludes.h View File

@@ -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__

+ 0
- 69
build/win32/platform_specific_code/win32_headers.h View File

@@ -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__

+ 0
- 4
build/win32/vc8/JUCE.vcproj View File

@@ -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>


+ 1547
- 1531
extras/audio plugins/wrapper/VST/juce_VST_Wrapper.cpp
File diff suppressed because it is too large
View File


+ 4
- 0
extras/example projects/example_project_for_Mac/juce_application.xcodeproj/project.pbxproj View File

@@ -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 */,


+ 1
- 8
extras/juce demo/build/win32_vc8/jucedemo.vcproj View File

@@ -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"
/> />


+ 157
- 72
juce_amalgamated.cpp View File

@@ -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)


+ 15
- 7
juce_amalgamated.h View File

@@ -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:


+ 2
- 2
src/juce_appframework/audio/audio_file_formats/juce_AiffAudioFormat.cpp View File

@@ -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),


+ 17
- 4
src/juce_appframework/audio/devices/juce_AudioDeviceManager.cpp View File

@@ -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);


+ 1
- 1
src/juce_appframework/gui/components/buttons/juce_DrawableButton.cpp View File

@@ -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);


+ 2
- 2
src/juce_appframework/gui/components/buttons/juce_ImageButton.cpp View File

@@ -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),


+ 2
- 2
src/juce_appframework/gui/components/buttons/juce_ToolbarButton.cpp View File

@@ -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_)
{ {


+ 2
- 2
src/juce_appframework/gui/components/controls/juce_TableListBox.cpp View File

@@ -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;
} }


+ 2
- 1
src/juce_appframework/gui/components/juce_Component.cpp View File

@@ -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;


+ 9
- 0
src/juce_appframework/gui/components/layout/juce_ComponentAnimator.cpp View File

@@ -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);
} }
} }


+ 9
- 1
src/juce_appframework/gui/components/layout/juce_ComponentAnimator.h View File

@@ -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


+ 4
- 4
src/juce_appframework/gui/components/layout/juce_MultiDocumentPanel.cpp View File

@@ -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);
} }


+ 2
- 2
src/juce_appframework/gui/components/special/juce_MagnifierComponent.cpp View File

@@ -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_)
{ {
} }


+ 35
- 35
src/juce_appframework/gui/graphics/geometry/juce_PositionedRectangle.cpp View File

@@ -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

+ 2
- 2
src/juce_core/containers/juce_Array.h View File

@@ -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)
{ {
} }


+ 2
- 2
src/juce_core/containers/juce_OwnedArray.h View File

@@ -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)
{ {
} }


+ 2
- 2
src/juce_core/containers/juce_SortedSet.h View File

@@ -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)
{ {
} }


+ 1
- 1
src/juce_core/io/network/juce_Socket.cpp View File

@@ -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


Loading…
Cancel
Save