mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-02-07 04:10:08 +00:00
This commit is contained in:
parent
716f7ef9ac
commit
a24962151e
17 changed files with 332 additions and 113 deletions
|
|
@ -2028,7 +2028,9 @@ private:
|
|||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
handleUserClosingWindow();
|
||||
if (! component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
handleUserClosingWindow();
|
||||
|
||||
return 0;
|
||||
|
||||
case WM_QUIT:
|
||||
|
|
@ -2120,6 +2122,9 @@ private:
|
|||
switch (wParam & 0xfff0)
|
||||
{
|
||||
case SC_CLOSE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar())
|
||||
{
|
||||
PostMessage (h, WM_CLOSE, 0, 0);
|
||||
|
|
@ -2128,16 +2133,25 @@ private:
|
|||
break;
|
||||
|
||||
case SC_KEYMENU:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar() && h == GetCapture())
|
||||
ReleaseCapture();
|
||||
|
||||
break;
|
||||
|
||||
case SC_MAXIMIZE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
setFullScreen (true);
|
||||
return 0;
|
||||
|
||||
case SC_MINIMIZE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (! hasTitleBar())
|
||||
{
|
||||
setMinimised (true);
|
||||
|
|
@ -2146,6 +2160,9 @@ private:
|
|||
break;
|
||||
|
||||
case SC_RESTORE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar())
|
||||
{
|
||||
if (isFullScreen())
|
||||
|
|
@ -2179,14 +2196,7 @@ private:
|
|||
case WM_NCLBUTTONDOWN:
|
||||
case WM_NCRBUTTONDOWN:
|
||||
case WM_NCMBUTTONDOWN:
|
||||
if (component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
{
|
||||
Component* const current = Component::getCurrentlyModalComponent();
|
||||
|
||||
if (current != 0)
|
||||
current->inputAttemptWhenModal();
|
||||
}
|
||||
|
||||
sendInputAttemptWhenModalMessage();
|
||||
break;
|
||||
|
||||
//case WM_IME_STARTCOMPOSITION;
|
||||
|
|
@ -2206,6 +2216,21 @@ private:
|
|||
return DefWindowProc (h, message, wParam, lParam);
|
||||
}
|
||||
|
||||
bool sendInputAttemptWhenModalMessage()
|
||||
{
|
||||
if (component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
{
|
||||
Component* const current = Component::getCurrentlyModalComponent();
|
||||
|
||||
if (current != 0)
|
||||
current->inputAttemptWhenModal();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Win32ComponentPeer (const Win32ComponentPeer&);
|
||||
const Win32ComponentPeer& operator= (const Win32ComponentPeer&);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ public:
|
|||
bool fileMightContainThisPluginType (const File&) { return false; }
|
||||
const FileSearchPath getDefaultLocationsToSearch() { return FileSearchPath(); }
|
||||
void findAllTypesForFile (OwnedArray <PluginDescription>&, const File&) {}
|
||||
bool doesPluginStillExist (const PluginDescription&) { return true; }
|
||||
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -15226,6 +15226,9 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
jassert (appInstance == 0);
|
||||
appInstance = app;
|
||||
|
||||
app->commandLineParameters = commandLine.trim();
|
||||
commandLine = String::empty;
|
||||
|
||||
initialiseJuce_GUI();
|
||||
|
||||
InterProcessLock* appLock = 0;
|
||||
|
|
@ -15236,11 +15239,10 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
|
||||
if (! appLock->enter(0))
|
||||
{
|
||||
MessageManager::broadcastMessage (app->getApplicationName() + "/" + commandLine);
|
||||
MessageManager::broadcastMessage (app->getApplicationName() + "/" + app->commandLineParameters);
|
||||
|
||||
delete appInstance;
|
||||
appInstance = 0;
|
||||
commandLine = String::empty;
|
||||
|
||||
DBG ("Another instance is running - quitting...");
|
||||
return 0;
|
||||
|
|
@ -15252,9 +15254,7 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
juce_setCurrentThreadName ("Juce Message Thread");
|
||||
|
||||
// let the app do its setting-up..
|
||||
app->initialise (commandLine.trim());
|
||||
|
||||
commandLine = String::empty;
|
||||
app->initialise (app->commandLineParameters);
|
||||
|
||||
// register for broadcast new app messages
|
||||
MessageManager::getInstance()->registerBroadcastListener (app);
|
||||
|
|
@ -26448,7 +26448,7 @@ AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const Plugi
|
|||
|
||||
if (result == 0)
|
||||
{
|
||||
if (description.file != File::nonexistent && ! description.file.exists())
|
||||
if (! doesPluginStillExist (description))
|
||||
errorMessage = TRANS ("This plug-in file no longer exists");
|
||||
else
|
||||
errorMessage = TRANS ("This plug-in failed to load correctly");
|
||||
|
|
@ -26457,6 +26457,15 @@ AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const Plugi
|
|||
return result;
|
||||
}
|
||||
|
||||
bool AudioPluginFormatManager::doesPluginStillExist (const PluginDescription& description) const
|
||||
{
|
||||
for (int i = 0; i < formats.size(); ++i)
|
||||
if (formats.getUnchecked(i)->getName() == description.pluginFormatName)
|
||||
return formats.getUnchecked(i)->doesPluginStillExist (description);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
/********* End of inlined file: juce_AudioPluginFormatManager.cpp *********/
|
||||
|
||||
|
|
@ -26500,7 +26509,7 @@ void KnownPluginList::clear()
|
|||
PluginDescription* KnownPluginList::getTypeForFile (const File& file) const throw()
|
||||
{
|
||||
for (int i = 0; i < types.size(); ++i)
|
||||
if (types.getUnchecked(i)->file == file)
|
||||
if (types.getUnchecked(i)->fileOrIdentifier == file.getFullPathName())
|
||||
return types.getUnchecked(i);
|
||||
|
||||
return 0;
|
||||
|
|
@ -26550,7 +26559,7 @@ bool KnownPluginList::isListingUpToDate (const File& possiblePluginFile) const t
|
|||
{
|
||||
const PluginDescription* const d = types.getUnchecked(i);
|
||||
|
||||
if (d->file == possiblePluginFile
|
||||
if (d->fileOrIdentifier == possiblePluginFile.getFullPathName()
|
||||
&& d->lastFileModTime != possiblePluginFile.getLastModificationTime())
|
||||
{
|
||||
return false;
|
||||
|
|
@ -26575,7 +26584,7 @@ bool KnownPluginList::scanAndAddFile (const File& possiblePluginFile,
|
|||
{
|
||||
const PluginDescription* const d = types.getUnchecked(i);
|
||||
|
||||
if (d->file == possiblePluginFile)
|
||||
if (d->fileOrIdentifier == possiblePluginFile.getFullPathName())
|
||||
{
|
||||
if (d->lastFileModTime != possiblePluginFile.getLastModificationTime())
|
||||
needsRescanning = true;
|
||||
|
|
@ -26654,7 +26663,10 @@ public:
|
|||
else if (method == KnownPluginList::sortByManufacturer)
|
||||
diff = first->manufacturerName.compareLexicographically (second->manufacturerName);
|
||||
else if (method == KnownPluginList::sortByFileSystemLocation)
|
||||
diff = first->file.getParentDirectory().getFullPathName().compare (second->file.getParentDirectory().getFullPathName());
|
||||
diff = first->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false)
|
||||
.compare (second->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false));
|
||||
|
||||
if (diff == 0)
|
||||
diff = first->name.compareLexicographically (second->name);
|
||||
|
|
@ -26764,13 +26776,13 @@ public:
|
|||
{
|
||||
for (int i = 0; i < allPlugins.size(); ++i)
|
||||
{
|
||||
String path (allPlugins.getUnchecked(i)->file.getParentDirectory().getFullPathName());
|
||||
String path (allPlugins.getUnchecked(i)
|
||||
->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false));
|
||||
|
||||
if (path.substring (1, 2) == T(":"))
|
||||
path = path.substring (2);
|
||||
|
||||
path = path.replaceCharacter (T('\\'), T('/'));
|
||||
|
||||
addPlugin (allPlugins.getUnchecked(i), path);
|
||||
}
|
||||
|
||||
|
|
@ -26891,7 +26903,7 @@ PluginDescription::PluginDescription (const PluginDescription& other) throw()
|
|||
category (other.category),
|
||||
manufacturerName (other.manufacturerName),
|
||||
version (other.version),
|
||||
file (other.file),
|
||||
fileOrIdentifier (other.fileOrIdentifier),
|
||||
lastFileModTime (other.lastFileModTime),
|
||||
uid (other.uid),
|
||||
isInstrument (other.isInstrument),
|
||||
|
|
@ -26907,7 +26919,7 @@ const PluginDescription& PluginDescription::operator= (const PluginDescription&
|
|||
category = other.category;
|
||||
manufacturerName = other.manufacturerName;
|
||||
version = other.version;
|
||||
file = other.file;
|
||||
fileOrIdentifier = other.fileOrIdentifier;
|
||||
uid = other.uid;
|
||||
isInstrument = other.isInstrument;
|
||||
lastFileModTime = other.lastFileModTime;
|
||||
|
|
@ -26919,7 +26931,7 @@ const PluginDescription& PluginDescription::operator= (const PluginDescription&
|
|||
|
||||
bool PluginDescription::isDuplicateOf (const PluginDescription& other) const
|
||||
{
|
||||
return file == other.file
|
||||
return fileOrIdentifier == other.fileOrIdentifier
|
||||
&& uid == other.uid;
|
||||
}
|
||||
|
||||
|
|
@ -26927,7 +26939,7 @@ const String PluginDescription::createIdentifierString() const throw()
|
|||
{
|
||||
return pluginFormatName
|
||||
+ T("-") + name
|
||||
+ T("-") + String::toHexString (file.getFileName().hashCode())
|
||||
+ T("-") + String::toHexString (fileOrIdentifier.hashCode())
|
||||
+ T("-") + String::toHexString (uid);
|
||||
}
|
||||
|
||||
|
|
@ -26939,7 +26951,7 @@ XmlElement* PluginDescription::createXml() const
|
|||
e->setAttribute (T("category"), category);
|
||||
e->setAttribute (T("manufacturer"), manufacturerName);
|
||||
e->setAttribute (T("version"), version);
|
||||
e->setAttribute (T("file"), file.getFullPathName());
|
||||
e->setAttribute (T("file"), fileOrIdentifier);
|
||||
e->setAttribute (T("uid"), String::toHexString (uid));
|
||||
e->setAttribute (T("isInstrument"), isInstrument);
|
||||
e->setAttribute (T("fileTime"), String::toHexString (lastFileModTime.toMilliseconds()));
|
||||
|
|
@ -26958,7 +26970,7 @@ bool PluginDescription::loadFromXml (const XmlElement& xml)
|
|||
category = xml.getStringAttribute (T("category"));
|
||||
manufacturerName = xml.getStringAttribute (T("manufacturer"));
|
||||
version = xml.getStringAttribute (T("version"));
|
||||
file = File (xml.getStringAttribute (T("file")));
|
||||
fileOrIdentifier = xml.getStringAttribute (T("file"));
|
||||
uid = xml.getStringAttribute (T("uid")).getHexValue32();
|
||||
isInstrument = xml.getBoolAttribute (T("isInstrument"), false);
|
||||
lastFileModTime = Time (xml.getStringAttribute (T("fileTime")).getHexValue64());
|
||||
|
|
@ -27251,14 +27263,16 @@ void PluginListComponent::buttonClicked (Button* b)
|
|||
const PluginDescription* const desc = list.getType (listBox->getSelectedRow());
|
||||
|
||||
if (desc != 0)
|
||||
desc->file.getParentDirectory().startAsProcess();
|
||||
{
|
||||
if (File (desc->fileOrIdentifier).existsAsFile())
|
||||
File (desc->fileOrIdentifier).getParentDirectory().startAsProcess();
|
||||
}
|
||||
}
|
||||
else if (r == 7)
|
||||
{
|
||||
for (int i = list.getNumTypes(); --i >= 0;)
|
||||
{
|
||||
if (list.getType (i)->file != File::nonexistent
|
||||
&& ! list.getType (i)->file.exists())
|
||||
if (! AudioPluginFormatManager::getInstance()->doesPluginStillExist (*list.getType (i)))
|
||||
{
|
||||
list.removeType (i);
|
||||
}
|
||||
|
|
@ -28155,22 +28169,45 @@ OSStatus AudioUnitPluginInstance::getTransportState (Boolean* outIsPlaying,
|
|||
|
||||
if (ph != 0 && ph->getCurrentPosition (result))
|
||||
{
|
||||
*outIsPlaying = result.isPlaying;
|
||||
*outTransportStateChanged = result.isPlaying != wasPlaying;
|
||||
if (outIsPlaying != 0)
|
||||
*outIsPlaying = result.isPlaying;
|
||||
|
||||
if (outTransportStateChanged != 0)
|
||||
*outTransportStateChanged = result.isPlaying != wasPlaying;
|
||||
|
||||
wasPlaying = result.isPlaying;
|
||||
*outCurrentSampleInTimeLine = roundDoubleToInt (result.timeInSeconds * getSampleRate());
|
||||
*outIsCycling = false;
|
||||
*outCycleStartBeat = 0;
|
||||
*outCycleEndBeat = 0;
|
||||
|
||||
if (outCurrentSampleInTimeLine != 0)
|
||||
*outCurrentSampleInTimeLine = roundDoubleToInt (result.timeInSeconds * getSampleRate());
|
||||
|
||||
if (outIsCycling != 0)
|
||||
*outIsCycling = false;
|
||||
|
||||
if (outCycleStartBeat != 0)
|
||||
*outCycleStartBeat = 0;
|
||||
|
||||
if (outCycleEndBeat != 0)
|
||||
*outCycleEndBeat = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*outIsPlaying = false;
|
||||
*outTransportStateChanged = false;
|
||||
*outCurrentSampleInTimeLine = 0;
|
||||
*outIsCycling = false;
|
||||
*outCycleStartBeat = 0;
|
||||
*outCycleEndBeat = 0;
|
||||
if (outIsPlaying != 0)
|
||||
*outIsPlaying = false;
|
||||
|
||||
if (outTransportStateChanged != 0)
|
||||
*outTransportStateChanged = false;
|
||||
|
||||
if (outCurrentSampleInTimeLine != 0)
|
||||
*outCurrentSampleInTimeLine = 0;
|
||||
|
||||
if (outIsCycling != 0)
|
||||
*outIsCycling = false;
|
||||
|
||||
if (outCycleStartBeat != 0)
|
||||
*outCycleStartBeat = 0;
|
||||
|
||||
if (outCycleEndBeat != 0)
|
||||
*outCycleEndBeat = 0;
|
||||
}
|
||||
|
||||
return noErr;
|
||||
|
|
@ -28763,6 +28800,11 @@ bool AudioUnitPluginFormat::fileMightContainThisPluginType (const File& f)
|
|||
&& f.isDirectory();
|
||||
}
|
||||
|
||||
bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc)
|
||||
{
|
||||
return File (desc.fileOrIdentifier).exists();
|
||||
}
|
||||
|
||||
const FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch()
|
||||
{
|
||||
return FileSearchPath ("~/Library/Audio/Plug-Ins/Components;/Library/Audio/Plug-Ins/Components");
|
||||
|
|
@ -29816,9 +29858,9 @@ public:
|
|||
void fillInPluginDescription (PluginDescription& desc) const
|
||||
{
|
||||
desc.name = name;
|
||||
desc.file = module->file;
|
||||
desc.fileOrIdentifier = module->file.getFullPathName();
|
||||
desc.uid = getUID();
|
||||
desc.lastFileModTime = desc.file.getLastModificationTime();
|
||||
desc.lastFileModTime = module->file.getLastModificationTime();
|
||||
desc.pluginFormatName = "VST";
|
||||
desc.category = getCategory();
|
||||
|
||||
|
|
@ -31985,7 +32027,7 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>& resul
|
|||
return;
|
||||
|
||||
PluginDescription desc;
|
||||
desc.file = file;
|
||||
desc.fileOrIdentifier = file.getFullPathName();
|
||||
desc.uid = 0;
|
||||
|
||||
VSTPluginInstance* instance = dynamic_cast <VSTPluginInstance*> (createInstanceFromDescription (desc));
|
||||
|
|
@ -32063,12 +32105,14 @@ AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const Plugi
|
|||
{
|
||||
VSTPluginInstance* result = 0;
|
||||
|
||||
if (fileMightContainThisPluginType (desc.file))
|
||||
File file (desc.fileOrIdentifier);
|
||||
|
||||
if (fileMightContainThisPluginType (file))
|
||||
{
|
||||
const File previousWorkingDirectory (File::getCurrentWorkingDirectory());
|
||||
desc.file.getParentDirectory().setAsCurrentWorkingDirectory();
|
||||
file.getParentDirectory().setAsCurrentWorkingDirectory();
|
||||
|
||||
const ReferenceCountedObjectPtr <ModuleHandle> module (ModuleHandle::findOrCreateModule (desc.file));
|
||||
const ReferenceCountedObjectPtr <ModuleHandle> module (ModuleHandle::findOrCreateModule (file));
|
||||
|
||||
if (module != 0)
|
||||
{
|
||||
|
|
@ -32126,6 +32170,11 @@ bool VSTPluginFormat::fileMightContainThisPluginType (const File& f)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool VSTPluginFormat::doesPluginStillExist (const PluginDescription& desc)
|
||||
{
|
||||
return File (desc.fileOrIdentifier).exists();
|
||||
}
|
||||
|
||||
const FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
|
|
@ -64756,12 +64805,16 @@ public:
|
|||
{
|
||||
Component* const over = dynamic_cast <Component*> (currentlyOver);
|
||||
|
||||
// (note: use a local copy of the dragDesc member in case the callback runs
|
||||
// a modal loop and deletes this object before the method completes)
|
||||
const String dragDescLocal (dragDesc);
|
||||
|
||||
if (over != 0
|
||||
&& over->isValidComponent()
|
||||
&& source->isValidComponent()
|
||||
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
||||
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
||||
{
|
||||
currentlyOver->itemDragExit (dragDesc, source);
|
||||
currentlyOver->itemDragExit (dragDescLocal, source);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -64802,11 +64855,15 @@ public:
|
|||
hit = hit->getComponentAt (rx, ry);
|
||||
}
|
||||
|
||||
// (note: use a local copy of the dragDesc member in case the callback runs
|
||||
// a modal loop and deletes this object before the method completes)
|
||||
const String dragDescLocal (dragDesc);
|
||||
|
||||
while (hit != 0)
|
||||
{
|
||||
DragAndDropTarget* const ddt = dynamic_cast <DragAndDropTarget*> (hit);
|
||||
|
||||
if (ddt != 0 && ddt->isInterestedInDragSource (dragDesc, source))
|
||||
if (ddt != 0 && ddt->isInterestedInDragSource (dragDescLocal, source))
|
||||
{
|
||||
relX = screenX;
|
||||
relY = screenY;
|
||||
|
|
@ -64868,7 +64925,13 @@ public:
|
|||
getParentComponent()->removeChildComponent (this);
|
||||
|
||||
if (dropAccepted && ddt != 0)
|
||||
ddt->itemDropped (dragDesc, source, relX, relY);
|
||||
{
|
||||
// (note: use a local copy of the dragDesc member in case the callback runs
|
||||
// a modal loop and deletes this object before the method completes)
|
||||
const String dragDescLocal (dragDesc);
|
||||
|
||||
ddt->itemDropped (dragDescLocal, source, relX, relY);
|
||||
}
|
||||
|
||||
// careful - this object could now be deleted..
|
||||
}
|
||||
|
|
@ -64876,6 +64939,10 @@ public:
|
|||
|
||||
void updateLocation (const bool canDoExternalDrag, int x, int y)
|
||||
{
|
||||
// (note: use a local copy of the dragDesc member in case the callback runs
|
||||
// a modal loop and deletes this object before it returns)
|
||||
const String dragDescLocal (dragDesc);
|
||||
|
||||
int newX = x - xOff;
|
||||
int newY = y - yOff;
|
||||
|
||||
|
|
@ -64898,21 +64965,21 @@ public:
|
|||
if (over != 0
|
||||
&& over->isValidComponent()
|
||||
&& ! (sourceWatcher->hasBeenDeleted())
|
||||
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
||||
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
||||
{
|
||||
currentlyOver->itemDragExit (dragDesc, source);
|
||||
currentlyOver->itemDragExit (dragDescLocal, source);
|
||||
}
|
||||
|
||||
currentlyOver = ddt;
|
||||
|
||||
if (currentlyOver != 0
|
||||
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
||||
currentlyOver->itemDragEnter (dragDesc, source, relX, relY);
|
||||
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
||||
currentlyOver->itemDragEnter (dragDescLocal, source, relX, relY);
|
||||
}
|
||||
|
||||
if (currentlyOver != 0
|
||||
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
||||
currentlyOver->itemDragMove (dragDesc, source, relX, relY);
|
||||
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
||||
currentlyOver->itemDragMove (dragDescLocal, source, relX, relY);
|
||||
|
||||
if (currentlyOver == 0
|
||||
&& canDoExternalDrag
|
||||
|
|
@ -64924,7 +64991,7 @@ public:
|
|||
StringArray files;
|
||||
bool canMoveFiles = false;
|
||||
|
||||
if (owner->shouldDropFilesWhenDraggedExternally (dragDesc, source, files, canMoveFiles)
|
||||
if (owner->shouldDropFilesWhenDraggedExternally (dragDescLocal, source, files, canMoveFiles)
|
||||
&& files.size() > 0)
|
||||
{
|
||||
ComponentDeletionWatcher cdw (this);
|
||||
|
|
@ -242749,7 +242816,9 @@ private:
|
|||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
handleUserClosingWindow();
|
||||
if (! component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
handleUserClosingWindow();
|
||||
|
||||
return 0;
|
||||
|
||||
case WM_QUIT:
|
||||
|
|
@ -242839,6 +242908,9 @@ private:
|
|||
switch (wParam & 0xfff0)
|
||||
{
|
||||
case SC_CLOSE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar())
|
||||
{
|
||||
PostMessage (h, WM_CLOSE, 0, 0);
|
||||
|
|
@ -242847,16 +242919,25 @@ private:
|
|||
break;
|
||||
|
||||
case SC_KEYMENU:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar() && h == GetCapture())
|
||||
ReleaseCapture();
|
||||
|
||||
break;
|
||||
|
||||
case SC_MAXIMIZE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
setFullScreen (true);
|
||||
return 0;
|
||||
|
||||
case SC_MINIMIZE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (! hasTitleBar())
|
||||
{
|
||||
setMinimised (true);
|
||||
|
|
@ -242865,6 +242946,9 @@ private:
|
|||
break;
|
||||
|
||||
case SC_RESTORE:
|
||||
if (sendInputAttemptWhenModalMessage())
|
||||
return 0;
|
||||
|
||||
if (hasTitleBar())
|
||||
{
|
||||
if (isFullScreen())
|
||||
|
|
@ -242898,14 +242982,7 @@ private:
|
|||
case WM_NCLBUTTONDOWN:
|
||||
case WM_NCRBUTTONDOWN:
|
||||
case WM_NCMBUTTONDOWN:
|
||||
if (component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
{
|
||||
Component* const current = Component::getCurrentlyModalComponent();
|
||||
|
||||
if (current != 0)
|
||||
current->inputAttemptWhenModal();
|
||||
}
|
||||
|
||||
sendInputAttemptWhenModalMessage();
|
||||
break;
|
||||
|
||||
//case WM_IME_STARTCOMPOSITION;
|
||||
|
|
@ -242925,6 +243002,21 @@ private:
|
|||
return DefWindowProc (h, message, wParam, lParam);
|
||||
}
|
||||
|
||||
bool sendInputAttemptWhenModalMessage()
|
||||
{
|
||||
if (component->isCurrentlyBlockedByAnotherModalComponent())
|
||||
{
|
||||
Component* const current = Component::getCurrentlyModalComponent();
|
||||
|
||||
if (current != 0)
|
||||
current->inputAttemptWhenModal();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Win32ComponentPeer (const Win32ComponentPeer&);
|
||||
const Win32ComponentPeer& operator= (const Win32ComponentPeer&);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -23269,6 +23269,10 @@ public:
|
|||
*/
|
||||
int getApplicationReturnValue() const throw() { return appReturnValue; }
|
||||
|
||||
/** Returns the application's command line params.
|
||||
*/
|
||||
const String getCommandLineParameters() const throw() { return commandLineParameters; }
|
||||
|
||||
// These are used by the START_JUCE_APPLICATION() macro and aren't for public use.
|
||||
|
||||
/** @internal */
|
||||
|
|
@ -23294,6 +23298,7 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
String commandLineParameters;
|
||||
int appReturnValue;
|
||||
bool stillInitialising;
|
||||
|
||||
|
|
@ -27828,8 +27833,13 @@ public:
|
|||
/** The version. This string doesn't have any particular format. */
|
||||
String version;
|
||||
|
||||
/** The binary module file containing the plugin. */
|
||||
File file;
|
||||
/** Either the file containing the plugin module, or some other unique way
|
||||
of identifying it.
|
||||
|
||||
E.g. for an AU, this would be the component ID, because not all AUs actually
|
||||
live in a file...
|
||||
*/
|
||||
String fileOrIdentifier;
|
||||
|
||||
/** The last time the plugin file was changed.
|
||||
This is handy when scanning for new or changed plugins.
|
||||
|
|
@ -27971,6 +27981,13 @@ public:
|
|||
*/
|
||||
virtual bool fileMightContainThisPluginType (const File& file) = 0;
|
||||
|
||||
/** Checks whether this plugin could possibly be loaded.
|
||||
|
||||
It doesn't actually need to load it, just to check whether the file or component
|
||||
still exists.
|
||||
*/
|
||||
virtual bool doesPluginStillExist (const PluginDescription& desc) = 0;
|
||||
|
||||
/** Returns the typical places to look for this kind of plugin.
|
||||
|
||||
Note that if this returns no paths, it means that the format can't be scanned-for
|
||||
|
|
@ -28039,6 +28056,12 @@ public:
|
|||
AudioPluginInstance* createPluginInstance (const PluginDescription& description,
|
||||
String& errorMessage) const;
|
||||
|
||||
/** Checks that the file or component for this plugin actually still exists.
|
||||
|
||||
(This won't try to load the plugin)
|
||||
*/
|
||||
bool doesPluginStillExist (const PluginDescription& description) const;
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
|
|
@ -34658,6 +34681,7 @@ public:
|
|||
void findAllTypesForFile (OwnedArray <PluginDescription>& results, const File& file);
|
||||
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
|
||||
bool fileMightContainThisPluginType (const File& file);
|
||||
bool doesPluginStillExist (const PluginDescription& desc);
|
||||
const FileSearchPath getDefaultLocationsToSearch();
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
|
@ -34773,6 +34797,7 @@ public:
|
|||
void findAllTypesForFile (OwnedArray <PluginDescription>& results, const File& file);
|
||||
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
|
||||
bool fileMightContainThisPluginType (const File& file);
|
||||
bool doesPluginStillExist (const PluginDescription& desc);
|
||||
const FileSearchPath getDefaultLocationsToSearch();
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
|
|
|||
|
|
@ -167,6 +167,9 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
jassert (appInstance == 0);
|
||||
appInstance = app;
|
||||
|
||||
app->commandLineParameters = commandLine.trim();
|
||||
commandLine = String::empty;
|
||||
|
||||
initialiseJuce_GUI();
|
||||
|
||||
InterProcessLock* appLock = 0;
|
||||
|
|
@ -177,11 +180,10 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
|
||||
if (! appLock->enter(0))
|
||||
{
|
||||
MessageManager::broadcastMessage (app->getApplicationName() + "/" + commandLine);
|
||||
MessageManager::broadcastMessage (app->getApplicationName() + "/" + app->commandLineParameters);
|
||||
|
||||
delete appInstance;
|
||||
appInstance = 0;
|
||||
commandLine = String::empty;
|
||||
|
||||
DBG ("Another instance is running - quitting...");
|
||||
return 0;
|
||||
|
|
@ -193,9 +195,7 @@ int JUCEApplication::main (String& commandLine, JUCEApplication* const app)
|
|||
juce_setCurrentThreadName ("Juce Message Thread");
|
||||
|
||||
// let the app do its setting-up..
|
||||
app->initialise (commandLine.trim());
|
||||
|
||||
commandLine = String::empty;
|
||||
app->initialise (app->commandLineParameters);
|
||||
|
||||
// register for broadcast new app messages
|
||||
MessageManager::getInstance()->registerBroadcastListener (app);
|
||||
|
|
|
|||
|
|
@ -260,6 +260,10 @@ public:
|
|||
*/
|
||||
int getApplicationReturnValue() const throw() { return appReturnValue; }
|
||||
|
||||
/** Returns the application's command line params.
|
||||
*/
|
||||
const String getCommandLineParameters() const throw() { return commandLineParameters; }
|
||||
|
||||
//==============================================================================
|
||||
// These are used by the START_JUCE_APPLICATION() macro and aren't for public use.
|
||||
|
||||
|
|
@ -287,6 +291,7 @@ public:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
String commandLineParameters;
|
||||
int appReturnValue;
|
||||
bool stillInitialising;
|
||||
|
||||
|
|
|
|||
|
|
@ -648,22 +648,45 @@ OSStatus AudioUnitPluginInstance::getTransportState (Boolean* outIsPlaying,
|
|||
|
||||
if (ph != 0 && ph->getCurrentPosition (result))
|
||||
{
|
||||
*outIsPlaying = result.isPlaying;
|
||||
*outTransportStateChanged = result.isPlaying != wasPlaying;
|
||||
if (outIsPlaying != 0)
|
||||
*outIsPlaying = result.isPlaying;
|
||||
|
||||
if (outTransportStateChanged != 0)
|
||||
*outTransportStateChanged = result.isPlaying != wasPlaying;
|
||||
|
||||
wasPlaying = result.isPlaying;
|
||||
*outCurrentSampleInTimeLine = roundDoubleToInt (result.timeInSeconds * getSampleRate());
|
||||
*outIsCycling = false;
|
||||
*outCycleStartBeat = 0;
|
||||
*outCycleEndBeat = 0;
|
||||
|
||||
if (outCurrentSampleInTimeLine != 0)
|
||||
*outCurrentSampleInTimeLine = roundDoubleToInt (result.timeInSeconds * getSampleRate());
|
||||
|
||||
if (outIsCycling != 0)
|
||||
*outIsCycling = false;
|
||||
|
||||
if (outCycleStartBeat != 0)
|
||||
*outCycleStartBeat = 0;
|
||||
|
||||
if (outCycleEndBeat != 0)
|
||||
*outCycleEndBeat = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
*outIsPlaying = false;
|
||||
*outTransportStateChanged = false;
|
||||
*outCurrentSampleInTimeLine = 0;
|
||||
*outIsCycling = false;
|
||||
*outCycleStartBeat = 0;
|
||||
*outCycleEndBeat = 0;
|
||||
if (outIsPlaying != 0)
|
||||
*outIsPlaying = false;
|
||||
|
||||
if (outTransportStateChanged != 0)
|
||||
*outTransportStateChanged = false;
|
||||
|
||||
if (outCurrentSampleInTimeLine != 0)
|
||||
*outCurrentSampleInTimeLine = 0;
|
||||
|
||||
if (outIsCycling != 0)
|
||||
*outIsCycling = false;
|
||||
|
||||
if (outCycleStartBeat != 0)
|
||||
*outCycleStartBeat = 0;
|
||||
|
||||
if (outCycleEndBeat != 0)
|
||||
*outCycleEndBeat = 0;
|
||||
}
|
||||
|
||||
return noErr;
|
||||
|
|
@ -1278,6 +1301,11 @@ bool AudioUnitPluginFormat::fileMightContainThisPluginType (const File& f)
|
|||
&& f.isDirectory();
|
||||
}
|
||||
|
||||
bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc)
|
||||
{
|
||||
return File (desc.fileOrIdentifier).exists();
|
||||
}
|
||||
|
||||
const FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch()
|
||||
{
|
||||
return FileSearchPath ("~/Library/Audio/Plug-Ins/Components;/Library/Audio/Plug-Ins/Components");
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public:
|
|||
void findAllTypesForFile (OwnedArray <PluginDescription>& results, const File& file);
|
||||
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
|
||||
bool fileMightContainThisPluginType (const File& file);
|
||||
bool doesPluginStillExist (const PluginDescription& desc);
|
||||
const FileSearchPath getDefaultLocationsToSearch();
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -690,9 +690,9 @@ public:
|
|||
void fillInPluginDescription (PluginDescription& desc) const
|
||||
{
|
||||
desc.name = name;
|
||||
desc.file = module->file;
|
||||
desc.fileOrIdentifier = module->file.getFullPathName();
|
||||
desc.uid = getUID();
|
||||
desc.lastFileModTime = desc.file.getLastModificationTime();
|
||||
desc.lastFileModTime = module->file.getLastModificationTime();
|
||||
desc.pluginFormatName = "VST";
|
||||
desc.category = getCategory();
|
||||
|
||||
|
|
@ -2898,7 +2898,7 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>& resul
|
|||
return;
|
||||
|
||||
PluginDescription desc;
|
||||
desc.file = file;
|
||||
desc.fileOrIdentifier = file.getFullPathName();
|
||||
desc.uid = 0;
|
||||
|
||||
VSTPluginInstance* instance = dynamic_cast <VSTPluginInstance*> (createInstanceFromDescription (desc));
|
||||
|
|
@ -2976,12 +2976,14 @@ AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const Plugi
|
|||
{
|
||||
VSTPluginInstance* result = 0;
|
||||
|
||||
if (fileMightContainThisPluginType (desc.file))
|
||||
File file (desc.fileOrIdentifier);
|
||||
|
||||
if (fileMightContainThisPluginType (file))
|
||||
{
|
||||
const File previousWorkingDirectory (File::getCurrentWorkingDirectory());
|
||||
desc.file.getParentDirectory().setAsCurrentWorkingDirectory();
|
||||
file.getParentDirectory().setAsCurrentWorkingDirectory();
|
||||
|
||||
const ReferenceCountedObjectPtr <ModuleHandle> module (ModuleHandle::findOrCreateModule (desc.file));
|
||||
const ReferenceCountedObjectPtr <ModuleHandle> module (ModuleHandle::findOrCreateModule (file));
|
||||
|
||||
if (module != 0)
|
||||
{
|
||||
|
|
@ -3039,6 +3041,11 @@ bool VSTPluginFormat::fileMightContainThisPluginType (const File& f)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool VSTPluginFormat::doesPluginStillExist (const PluginDescription& desc)
|
||||
{
|
||||
return File (desc.fileOrIdentifier).exists();
|
||||
}
|
||||
|
||||
const FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch()
|
||||
{
|
||||
#if JUCE_MAC
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ public:
|
|||
void findAllTypesForFile (OwnedArray <PluginDescription>& results, const File& file);
|
||||
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
|
||||
bool fileMightContainThisPluginType (const File& file);
|
||||
bool doesPluginStillExist (const PluginDescription& desc);
|
||||
const FileSearchPath getDefaultLocationsToSearch();
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -84,6 +84,14 @@ public:
|
|||
*/
|
||||
virtual bool fileMightContainThisPluginType (const File& file) = 0;
|
||||
|
||||
/** Checks whether this plugin could possibly be loaded.
|
||||
|
||||
It doesn't actually need to load it, just to check whether the file or component
|
||||
still exists.
|
||||
*/
|
||||
virtual bool doesPluginStillExist (const PluginDescription& desc) = 0;
|
||||
|
||||
|
||||
/** Returns the typical places to look for this kind of plugin.
|
||||
|
||||
Note that if this returns no paths, it means that the format can't be scanned-for
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const Plugi
|
|||
|
||||
if (result == 0)
|
||||
{
|
||||
if (description.file != File::nonexistent && ! description.file.exists())
|
||||
if (! doesPluginStillExist (description))
|
||||
errorMessage = TRANS ("This plug-in file no longer exists");
|
||||
else
|
||||
errorMessage = TRANS ("This plug-in failed to load correctly");
|
||||
|
|
@ -135,4 +135,14 @@ AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const Plugi
|
|||
return result;
|
||||
}
|
||||
|
||||
bool AudioPluginFormatManager::doesPluginStillExist (const PluginDescription& description) const
|
||||
{
|
||||
for (int i = 0; i < formats.size(); ++i)
|
||||
if (formats.getUnchecked(i)->getName() == description.pluginFormatName)
|
||||
return formats.getUnchecked(i)->doesPluginStillExist (description);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -92,6 +92,12 @@ public:
|
|||
AudioPluginInstance* createPluginInstance (const PluginDescription& description,
|
||||
String& errorMessage) const;
|
||||
|
||||
/** Checks that the file or component for this plugin actually still exists.
|
||||
|
||||
(This won't try to load the plugin)
|
||||
*/
|
||||
bool doesPluginStillExist (const PluginDescription& description) const;
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ void KnownPluginList::clear()
|
|||
PluginDescription* KnownPluginList::getTypeForFile (const File& file) const throw()
|
||||
{
|
||||
for (int i = 0; i < types.size(); ++i)
|
||||
if (types.getUnchecked(i)->file == file)
|
||||
if (types.getUnchecked(i)->fileOrIdentifier == file.getFullPathName())
|
||||
return types.getUnchecked(i);
|
||||
|
||||
return 0;
|
||||
|
|
@ -108,7 +108,7 @@ bool KnownPluginList::isListingUpToDate (const File& possiblePluginFile) const t
|
|||
{
|
||||
const PluginDescription* const d = types.getUnchecked(i);
|
||||
|
||||
if (d->file == possiblePluginFile
|
||||
if (d->fileOrIdentifier == possiblePluginFile.getFullPathName()
|
||||
&& d->lastFileModTime != possiblePluginFile.getLastModificationTime())
|
||||
{
|
||||
return false;
|
||||
|
|
@ -133,7 +133,7 @@ bool KnownPluginList::scanAndAddFile (const File& possiblePluginFile,
|
|||
{
|
||||
const PluginDescription* const d = types.getUnchecked(i);
|
||||
|
||||
if (d->file == possiblePluginFile)
|
||||
if (d->fileOrIdentifier == possiblePluginFile.getFullPathName())
|
||||
{
|
||||
if (d->lastFileModTime != possiblePluginFile.getLastModificationTime())
|
||||
needsRescanning = true;
|
||||
|
|
@ -213,7 +213,10 @@ public:
|
|||
else if (method == KnownPluginList::sortByManufacturer)
|
||||
diff = first->manufacturerName.compareLexicographically (second->manufacturerName);
|
||||
else if (method == KnownPluginList::sortByFileSystemLocation)
|
||||
diff = first->file.getParentDirectory().getFullPathName().compare (second->file.getParentDirectory().getFullPathName());
|
||||
diff = first->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false)
|
||||
.compare (second->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false));
|
||||
|
||||
if (diff == 0)
|
||||
diff = first->name.compareLexicographically (second->name);
|
||||
|
|
@ -325,13 +328,13 @@ public:
|
|||
{
|
||||
for (int i = 0; i < allPlugins.size(); ++i)
|
||||
{
|
||||
String path (allPlugins.getUnchecked(i)->file.getParentDirectory().getFullPathName());
|
||||
String path (allPlugins.getUnchecked(i)
|
||||
->fileOrIdentifier.replaceCharacter (T('\\'), T('/'))
|
||||
.upToLastOccurrenceOf (T("/"), false, false));
|
||||
|
||||
if (path.substring (1, 2) == T(":"))
|
||||
path = path.substring (2);
|
||||
|
||||
path = path.replaceCharacter (T('\\'), T('/'));
|
||||
|
||||
addPlugin (allPlugins.getUnchecked(i), path);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ PluginDescription::PluginDescription (const PluginDescription& other) throw()
|
|||
category (other.category),
|
||||
manufacturerName (other.manufacturerName),
|
||||
version (other.version),
|
||||
file (other.file),
|
||||
fileOrIdentifier (other.fileOrIdentifier),
|
||||
lastFileModTime (other.lastFileModTime),
|
||||
uid (other.uid),
|
||||
isInstrument (other.isInstrument),
|
||||
|
|
@ -72,7 +72,7 @@ const PluginDescription& PluginDescription::operator= (const PluginDescription&
|
|||
category = other.category;
|
||||
manufacturerName = other.manufacturerName;
|
||||
version = other.version;
|
||||
file = other.file;
|
||||
fileOrIdentifier = other.fileOrIdentifier;
|
||||
uid = other.uid;
|
||||
isInstrument = other.isInstrument;
|
||||
lastFileModTime = other.lastFileModTime;
|
||||
|
|
@ -84,7 +84,7 @@ const PluginDescription& PluginDescription::operator= (const PluginDescription&
|
|||
|
||||
bool PluginDescription::isDuplicateOf (const PluginDescription& other) const
|
||||
{
|
||||
return file == other.file
|
||||
return fileOrIdentifier == other.fileOrIdentifier
|
||||
&& uid == other.uid;
|
||||
}
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ const String PluginDescription::createIdentifierString() const throw()
|
|||
{
|
||||
return pluginFormatName
|
||||
+ T("-") + name
|
||||
+ T("-") + String::toHexString (file.getFileName().hashCode())
|
||||
+ T("-") + String::toHexString (fileOrIdentifier.hashCode())
|
||||
+ T("-") + String::toHexString (uid);
|
||||
}
|
||||
|
||||
|
|
@ -104,7 +104,7 @@ XmlElement* PluginDescription::createXml() const
|
|||
e->setAttribute (T("category"), category);
|
||||
e->setAttribute (T("manufacturer"), manufacturerName);
|
||||
e->setAttribute (T("version"), version);
|
||||
e->setAttribute (T("file"), file.getFullPathName());
|
||||
e->setAttribute (T("file"), fileOrIdentifier);
|
||||
e->setAttribute (T("uid"), String::toHexString (uid));
|
||||
e->setAttribute (T("isInstrument"), isInstrument);
|
||||
e->setAttribute (T("fileTime"), String::toHexString (lastFileModTime.toMilliseconds()));
|
||||
|
|
@ -123,7 +123,7 @@ bool PluginDescription::loadFromXml (const XmlElement& xml)
|
|||
category = xml.getStringAttribute (T("category"));
|
||||
manufacturerName = xml.getStringAttribute (T("manufacturer"));
|
||||
version = xml.getStringAttribute (T("version"));
|
||||
file = File (xml.getStringAttribute (T("file")));
|
||||
fileOrIdentifier = xml.getStringAttribute (T("file"));
|
||||
uid = xml.getStringAttribute (T("uid")).getHexValue32();
|
||||
isInstrument = xml.getBoolAttribute (T("isInstrument"), false);
|
||||
lastFileModTime = Time (xml.getStringAttribute (T("fileTime")).getHexValue64());
|
||||
|
|
|
|||
|
|
@ -74,8 +74,13 @@ public:
|
|||
/** The version. This string doesn't have any particular format. */
|
||||
String version;
|
||||
|
||||
/** The binary module file containing the plugin. */
|
||||
File file;
|
||||
/** Either the file containing the plugin module, or some other unique way
|
||||
of identifying it.
|
||||
|
||||
E.g. for an AU, this would be the component ID, because not all AUs actually
|
||||
live in a file...
|
||||
*/
|
||||
String fileOrIdentifier;
|
||||
|
||||
/** The last time the plugin file was changed.
|
||||
This is handy when scanning for new or changed plugins.
|
||||
|
|
|
|||
|
|
@ -190,14 +190,16 @@ void PluginListComponent::buttonClicked (Button* b)
|
|||
const PluginDescription* const desc = list.getType (listBox->getSelectedRow());
|
||||
|
||||
if (desc != 0)
|
||||
desc->file.getParentDirectory().startAsProcess();
|
||||
{
|
||||
if (File (desc->fileOrIdentifier).existsAsFile())
|
||||
File (desc->fileOrIdentifier).getParentDirectory().startAsProcess();
|
||||
}
|
||||
}
|
||||
else if (r == 7)
|
||||
{
|
||||
for (int i = list.getNumTypes(); --i >= 0;)
|
||||
{
|
||||
if (list.getType (i)->file != File::nonexistent
|
||||
&& ! list.getType (i)->file.exists())
|
||||
if (! AudioPluginFormatManager::getInstance()->doesPluginStillExist (*list.getType (i)))
|
||||
{
|
||||
list.removeType (i);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue