diff --git a/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp b/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp index 8f8ee00d4c..6b4a332209 100644 --- a/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp +++ b/build/macosx/platform_specific_code/juce_mac_CoreMidi.cpp @@ -304,11 +304,23 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) if (message.isSysEx()) { - MIDIPacketList* const packets = (MIDIPacketList*) juce_malloc (32 + message.getRawDataSize()); - packets->numPackets = 1; - packets->packet[0].timeStamp = 0; - packets->packet[0].length = message.getRawDataSize(); - memcpy (packets->packet[0].data, message.getRawData(), message.getRawDataSize()); + const int maxPacketSize = 256; + int pos = 0, bytesLeft = message.getRawDataSize(); + const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize; + MIDIPacketList* const packets = (MIDIPacketList*) juce_malloc (32 * numPackets + message.getRawDataSize()); + packets->numPackets = numPackets; + + MIDIPacket* p = packets->packet; + + for (int i = 0; i < numPackets; ++i) + { + p->timeStamp = 0; + p->length = jmin (maxPacketSize, bytesLeft); + memcpy (p->data, message.getRawData() + pos, p->length); + pos += p->length; + bytesLeft -= p->length; + p = MIDIPacketNext (p); + } MIDISend (mpe->port, mpe->endPoint, packets); juce_free (packets); diff --git a/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm b/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm index 3fe71d5ee4..e61e5c5b84 100644 --- a/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm +++ b/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm @@ -77,6 +77,7 @@ END_JUCE_NAMESPACE - (BOOL) becomeFirstResponder; - (BOOL) resignFirstResponder; +- (BOOL) acceptsFirstResponder; - (NSArray*) getSupportedDragTypes; - (BOOL) sendDragCallback: (int) type sender: (id ) sender; @@ -392,6 +393,11 @@ END_JUCE_NAMESPACE return true; } +- (BOOL) acceptsFirstResponder +{ + return owner != 0 && owner->canBecomeKeyWindow(); +} + //============================================================================== - (NSArray*) getSupportedDragTypes { @@ -1156,7 +1162,8 @@ void juce_HandleProcessFocusChange() bool NSViewComponentPeer::isFocused() const { - return window != 0 && [window isKeyWindow]; + return isSharedWindow ? this == currentlyFocusedPeer + : (window != 0 && [window isKeyWindow]); } void NSViewComponentPeer::grabFocus() diff --git a/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm b/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm index 8d053210b7..eeea235489 100644 --- a/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm +++ b/extras/audio plugins/wrapper/AU/juce_AU_Wrapper.mm @@ -926,6 +926,12 @@ public: setSize (editorComp->getWidth(), editorComp->getHeight()); addAndMakeVisible (editorComp); editorComp->addComponentListener (this); + +#if ! JucePlugin_EditorRequiresKeyboardFocus + setWantsKeyboardFocus (false); +#else + setWantsKeyboardFocus (true); +#endif } ~EditorCompHolder() @@ -1196,6 +1202,7 @@ private: setWantsKeyboardFocus (false); #else addToDesktop (ComponentPeer::windowIsTemporary); + setWantsKeyboardFocus (true); #endif setVisible (true); @@ -1203,6 +1210,9 @@ private: addSubWindow(); + NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; + [pluginWindow setNextResponder: hostWindow]; + // Adds a callback bodge to work around some problems with wrapped // carbon windows.. const EventTypeSpec eventsToCatch[] = { diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 258cc5df9c..3e2202be0d 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -21314,11 +21314,8 @@ void AudioTransportSource::setSource (PositionableAudioSource* const newSource, if (oldMasterSource != 0) oldMasterSource->releaseResources(); - if (oldResamplerSource != 0) - delete oldResamplerSource; - - if (oldBufferingSource != 0) - delete oldBufferingSource; + delete oldResamplerSource; + delete oldBufferingSource; } void AudioTransportSource::start() @@ -32849,7 +32846,7 @@ const String VSTPluginInstance::getVersion() const throw() if (v != 0) { int versionBits[4]; - unsigned int n = 0; + int n = 0; while (v != 0) { @@ -71808,6 +71805,9 @@ void PreferencesPanel::addSettingsPage (const String& title, addAndMakeVisible (button); resized(); + + if (currentPage == 0) + setCurrentPage (title); } void PreferencesPanel::addSettingsPage (const String& title, @@ -71824,9 +71824,6 @@ void PreferencesPanel::addSettingsPage (const String& title, iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); addSettingsPage (title, &icon, &iconOver, &iconDown); - - if (currentPage == 0) - setCurrentPage (title); } class PrefsDialogWindow : public DialogWindow @@ -266964,6 +266961,7 @@ END_JUCE_NAMESPACE - (BOOL) becomeFirstResponder; - (BOOL) resignFirstResponder; +- (BOOL) acceptsFirstResponder; - (NSArray*) getSupportedDragTypes; - (BOOL) sendDragCallback: (int) type sender: (id ) sender; @@ -267269,6 +267267,11 @@ END_JUCE_NAMESPACE return true; } +- (BOOL) acceptsFirstResponder +{ + return owner != 0 && owner->canBecomeKeyWindow(); +} + - (NSArray*) getSupportedDragTypes { return [NSArray arrayWithObjects: NSFilenamesPboardType, /*NSFilesPromisePboardType, NSStringPboardType,*/ nil]; @@ -268024,7 +268027,8 @@ void juce_HandleProcessFocusChange() bool NSViewComponentPeer::isFocused() const { - return window != 0 && [window isKeyWindow]; + return isSharedWindow ? this == currentlyFocusedPeer + : (window != 0 && [window isKeyWindow]); } void NSViewComponentPeer::grabFocus() @@ -273031,11 +273035,23 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) if (message.isSysEx()) { - MIDIPacketList* const packets = (MIDIPacketList*) juce_malloc (32 + message.getRawDataSize()); - packets->numPackets = 1; - packets->packet[0].timeStamp = 0; - packets->packet[0].length = message.getRawDataSize(); - memcpy (packets->packet[0].data, message.getRawData(), message.getRawDataSize()); + const int maxPacketSize = 256; + int pos = 0, bytesLeft = message.getRawDataSize(); + const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize; + MIDIPacketList* const packets = (MIDIPacketList*) juce_malloc (32 * numPackets + message.getRawDataSize()); + packets->numPackets = numPackets; + + MIDIPacket* p = packets->packet; + + for (int i = 0; i < numPackets; ++i) + { + p->timeStamp = 0; + p->length = jmin (maxPacketSize, bytesLeft); + memcpy (p->data, message.getRawData() + pos, p->length); + pos += p->length; + bytesLeft -= p->length; + p = MIDIPacketNext (p); + } MIDISend (mpe->port, mpe->endPoint, packets); juce_free (packets); diff --git a/src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp b/src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp index bd626b8051..7deb6eca01 100644 --- a/src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp +++ b/src/juce_appframework/audio/audio_sources/juce_AudioTransportSource.cpp @@ -128,11 +128,8 @@ void AudioTransportSource::setSource (PositionableAudioSource* const newSource, if (oldMasterSource != 0) oldMasterSource->releaseResources(); - if (oldResamplerSource != 0) - delete oldResamplerSource; - - if (oldBufferingSource != 0) - delete oldBufferingSource; + delete oldResamplerSource; + delete oldBufferingSource; } void AudioTransportSource::start() diff --git a/src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp b/src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp index 4bde220ce2..f26e185ea3 100644 --- a/src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp +++ b/src/juce_appframework/gui/components/special/juce_PreferencesPanel.cpp @@ -67,6 +67,9 @@ void PreferencesPanel::addSettingsPage (const String& title, addAndMakeVisible (button); resized(); + + if (currentPage == 0) + setCurrentPage (title); } void PreferencesPanel::addSettingsPage (const String& title, @@ -83,9 +86,6 @@ void PreferencesPanel::addSettingsPage (const String& title, iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); addSettingsPage (title, &icon, &iconOver, &iconDown); - - if (currentPage == 0) - setCurrentPage (title); } //==============================================================================