| @@ -304,11 +304,23 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) | |||||
| if (message.isSysEx()) | 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); | MIDISend (mpe->port, mpe->endPoint, packets); | ||||
| juce_free (packets); | juce_free (packets); | ||||
| @@ -77,6 +77,7 @@ END_JUCE_NAMESPACE | |||||
| - (BOOL) becomeFirstResponder; | - (BOOL) becomeFirstResponder; | ||||
| - (BOOL) resignFirstResponder; | - (BOOL) resignFirstResponder; | ||||
| - (BOOL) acceptsFirstResponder; | |||||
| - (NSArray*) getSupportedDragTypes; | - (NSArray*) getSupportedDragTypes; | ||||
| - (BOOL) sendDragCallback: (int) type sender: (id <NSDraggingInfo>) sender; | - (BOOL) sendDragCallback: (int) type sender: (id <NSDraggingInfo>) sender; | ||||
| @@ -392,6 +393,11 @@ END_JUCE_NAMESPACE | |||||
| return true; | return true; | ||||
| } | } | ||||
| - (BOOL) acceptsFirstResponder | |||||
| { | |||||
| return owner != 0 && owner->canBecomeKeyWindow(); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| - (NSArray*) getSupportedDragTypes | - (NSArray*) getSupportedDragTypes | ||||
| { | { | ||||
| @@ -1156,7 +1162,8 @@ void juce_HandleProcessFocusChange() | |||||
| bool NSViewComponentPeer::isFocused() const | bool NSViewComponentPeer::isFocused() const | ||||
| { | { | ||||
| return window != 0 && [window isKeyWindow]; | |||||
| return isSharedWindow ? this == currentlyFocusedPeer | |||||
| : (window != 0 && [window isKeyWindow]); | |||||
| } | } | ||||
| void NSViewComponentPeer::grabFocus() | void NSViewComponentPeer::grabFocus() | ||||
| @@ -926,6 +926,12 @@ public: | |||||
| setSize (editorComp->getWidth(), editorComp->getHeight()); | setSize (editorComp->getWidth(), editorComp->getHeight()); | ||||
| addAndMakeVisible (editorComp); | addAndMakeVisible (editorComp); | ||||
| editorComp->addComponentListener (this); | editorComp->addComponentListener (this); | ||||
| #if ! JucePlugin_EditorRequiresKeyboardFocus | |||||
| setWantsKeyboardFocus (false); | |||||
| #else | |||||
| setWantsKeyboardFocus (true); | |||||
| #endif | |||||
| } | } | ||||
| ~EditorCompHolder() | ~EditorCompHolder() | ||||
| @@ -1196,6 +1202,7 @@ private: | |||||
| setWantsKeyboardFocus (false); | setWantsKeyboardFocus (false); | ||||
| #else | #else | ||||
| addToDesktop (ComponentPeer::windowIsTemporary); | addToDesktop (ComponentPeer::windowIsTemporary); | ||||
| setWantsKeyboardFocus (true); | |||||
| #endif | #endif | ||||
| setVisible (true); | setVisible (true); | ||||
| @@ -1203,6 +1210,9 @@ private: | |||||
| addSubWindow(); | addSubWindow(); | ||||
| NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; | |||||
| [pluginWindow setNextResponder: hostWindow]; | |||||
| // Adds a callback bodge to work around some problems with wrapped | // Adds a callback bodge to work around some problems with wrapped | ||||
| // carbon windows.. | // carbon windows.. | ||||
| const EventTypeSpec eventsToCatch[] = { | const EventTypeSpec eventsToCatch[] = { | ||||
| @@ -21314,11 +21314,8 @@ void AudioTransportSource::setSource (PositionableAudioSource* const newSource, | |||||
| if (oldMasterSource != 0) | if (oldMasterSource != 0) | ||||
| oldMasterSource->releaseResources(); | oldMasterSource->releaseResources(); | ||||
| if (oldResamplerSource != 0) | |||||
| delete oldResamplerSource; | |||||
| if (oldBufferingSource != 0) | |||||
| delete oldBufferingSource; | |||||
| delete oldResamplerSource; | |||||
| delete oldBufferingSource; | |||||
| } | } | ||||
| void AudioTransportSource::start() | void AudioTransportSource::start() | ||||
| @@ -32849,7 +32846,7 @@ const String VSTPluginInstance::getVersion() const throw() | |||||
| if (v != 0) | if (v != 0) | ||||
| { | { | ||||
| int versionBits[4]; | int versionBits[4]; | ||||
| unsigned int n = 0; | |||||
| int n = 0; | |||||
| while (v != 0) | while (v != 0) | ||||
| { | { | ||||
| @@ -71808,6 +71805,9 @@ void PreferencesPanel::addSettingsPage (const String& title, | |||||
| addAndMakeVisible (button); | addAndMakeVisible (button); | ||||
| resized(); | resized(); | ||||
| if (currentPage == 0) | |||||
| setCurrentPage (title); | |||||
| } | } | ||||
| void PreferencesPanel::addSettingsPage (const String& title, | void PreferencesPanel::addSettingsPage (const String& title, | ||||
| @@ -71824,9 +71824,6 @@ void PreferencesPanel::addSettingsPage (const String& title, | |||||
| iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); | iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); | ||||
| addSettingsPage (title, &icon, &iconOver, &iconDown); | addSettingsPage (title, &icon, &iconOver, &iconDown); | ||||
| if (currentPage == 0) | |||||
| setCurrentPage (title); | |||||
| } | } | ||||
| class PrefsDialogWindow : public DialogWindow | class PrefsDialogWindow : public DialogWindow | ||||
| @@ -266964,6 +266961,7 @@ END_JUCE_NAMESPACE | |||||
| - (BOOL) becomeFirstResponder; | - (BOOL) becomeFirstResponder; | ||||
| - (BOOL) resignFirstResponder; | - (BOOL) resignFirstResponder; | ||||
| - (BOOL) acceptsFirstResponder; | |||||
| - (NSArray*) getSupportedDragTypes; | - (NSArray*) getSupportedDragTypes; | ||||
| - (BOOL) sendDragCallback: (int) type sender: (id <NSDraggingInfo>) sender; | - (BOOL) sendDragCallback: (int) type sender: (id <NSDraggingInfo>) sender; | ||||
| @@ -267269,6 +267267,11 @@ END_JUCE_NAMESPACE | |||||
| return true; | return true; | ||||
| } | } | ||||
| - (BOOL) acceptsFirstResponder | |||||
| { | |||||
| return owner != 0 && owner->canBecomeKeyWindow(); | |||||
| } | |||||
| - (NSArray*) getSupportedDragTypes | - (NSArray*) getSupportedDragTypes | ||||
| { | { | ||||
| return [NSArray arrayWithObjects: NSFilenamesPboardType, /*NSFilesPromisePboardType, NSStringPboardType,*/ nil]; | return [NSArray arrayWithObjects: NSFilenamesPboardType, /*NSFilesPromisePboardType, NSStringPboardType,*/ nil]; | ||||
| @@ -268024,7 +268027,8 @@ void juce_HandleProcessFocusChange() | |||||
| bool NSViewComponentPeer::isFocused() const | bool NSViewComponentPeer::isFocused() const | ||||
| { | { | ||||
| return window != 0 && [window isKeyWindow]; | |||||
| return isSharedWindow ? this == currentlyFocusedPeer | |||||
| : (window != 0 && [window isKeyWindow]); | |||||
| } | } | ||||
| void NSViewComponentPeer::grabFocus() | void NSViewComponentPeer::grabFocus() | ||||
| @@ -273031,11 +273035,23 @@ void MidiOutput::sendMessageNow (const MidiMessage& message) | |||||
| if (message.isSysEx()) | 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); | MIDISend (mpe->port, mpe->endPoint, packets); | ||||
| juce_free (packets); | juce_free (packets); | ||||
| @@ -128,11 +128,8 @@ void AudioTransportSource::setSource (PositionableAudioSource* const newSource, | |||||
| if (oldMasterSource != 0) | if (oldMasterSource != 0) | ||||
| oldMasterSource->releaseResources(); | oldMasterSource->releaseResources(); | ||||
| if (oldResamplerSource != 0) | |||||
| delete oldResamplerSource; | |||||
| if (oldBufferingSource != 0) | |||||
| delete oldBufferingSource; | |||||
| delete oldResamplerSource; | |||||
| delete oldBufferingSource; | |||||
| } | } | ||||
| void AudioTransportSource::start() | void AudioTransportSource::start() | ||||
| @@ -67,6 +67,9 @@ void PreferencesPanel::addSettingsPage (const String& title, | |||||
| addAndMakeVisible (button); | addAndMakeVisible (button); | ||||
| resized(); | resized(); | ||||
| if (currentPage == 0) | |||||
| setCurrentPage (title); | |||||
| } | } | ||||
| void PreferencesPanel::addSettingsPage (const String& title, | void PreferencesPanel::addSettingsPage (const String& title, | ||||
| @@ -83,9 +86,6 @@ void PreferencesPanel::addSettingsPage (const String& title, | |||||
| iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); | iconDown.setOverlayColour (Colours::black.withAlpha (0.25f)); | ||||
| addSettingsPage (title, &icon, &iconOver, &iconDown); | addSettingsPage (title, &icon, &iconOver, &iconDown); | ||||
| if (currentPage == 0) | |||||
| setCurrentPage (title); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||