@@ -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); | |||
@@ -77,6 +77,7 @@ END_JUCE_NAMESPACE | |||
- (BOOL) becomeFirstResponder; | |||
- (BOOL) resignFirstResponder; | |||
- (BOOL) acceptsFirstResponder; | |||
- (NSArray*) getSupportedDragTypes; | |||
- (BOOL) sendDragCallback: (int) type sender: (id <NSDraggingInfo>) 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() | |||
@@ -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[] = { | |||
@@ -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 <NSDraggingInfo>) 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); | |||
@@ -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() | |||
@@ -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); | |||
} | |||
//============================================================================== | |||