From d86d68446c24e60f1204b81500de416741dd42bc Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Tue, 23 Aug 2011 15:02:11 +0100 Subject: [PATCH] RTAS mac window position fix. Introjucer fixes for Windows. --- .../VisualStudio2010/The Introjucer.vcxproj | 2 ++ .../Project Saving/jucer_ProjectExport_MSVC.h | 10 +++--- .../Project Saving/jucer_ProjectSaver.h | 1 - .../Source/Project/jucer_AudioPluginModule.h | 2 +- .../Source/Project/jucer_Module.cpp | 5 +-- .../Builds/VisualStudio2010/Juce Demo.vcxproj | 2 ++ .../Builds/VisualStudio2010/juce.vcxproj | 2 ++ .../Builds/VisualStudio2010/Jucer.vcxproj | 2 ++ .../RTAS/juce_RTAS_MacUtilities.mm | 6 ++-- modules/juce_core/containers/juce_Array.h | 6 ++-- modules/juce_core/containers/juce_HashMap.h | 4 +-- .../containers/juce_NamedValueSet.cpp | 31 ++++++++++++++++ .../juce_core/containers/juce_NamedValueSet.h | 9 +++++ .../containers/juce_ReferenceCountedArray.h | 10 +++--- modules/juce_core/containers/juce_SparseSet.h | 2 +- modules/juce_core/containers/juce_Variant.cpp | 35 +++++++++++++------ modules/juce_core/containers/juce_Variant.h | 24 +++++++------ .../memory/juce_ReferenceCountedObject.h | 10 +----- modules/juce_core/text/juce_StringPairArray.h | 4 --- .../values/juce_Value.cpp | 3 +- .../native/juce_win32_Messaging.cpp | 3 +- 21 files changed, 112 insertions(+), 61 deletions(-) diff --git a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj index 048d74b64a..76eaa62d19 100644 --- a/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj +++ b/extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj @@ -63,6 +63,7 @@ .\Debug\ Level4 true + true _DEBUG;%(PreprocessorDefinitions) @@ -101,6 +102,7 @@ .\Release\ Level4 true + true NDEBUG;%(PreprocessorDefinitions) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h index 514140d616..c8f2ac216d 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectExport_MSVC.h @@ -361,7 +361,7 @@ public: if (settings.hasType (getValueTreeTypeName())) return new MSVCProjectExporterVC2008 (project, settings); - return 0; + return nullptr; } //============================================================================== @@ -594,9 +594,6 @@ protected: linker->setAttribute ("OutputFile", FileHelpers::windowsStylePath (binariesPath + "/" + outputFileName)); linker->setAttribute ("SuppressStartupBanner", "true"); - //if (project.getJuceLinkageMode() == Project::useLinkedJuce) - // linker->setAttribute ("AdditionalLibraryDirectories", getJucePathFromTargetFolder().getChildFile ("bin").toWindowsStyle()); - linker->setAttribute ("IgnoreDefaultLibraryNames", isDebug ? "libcmt.lib, msvcrt.lib" : ""); linker->setAttribute ("GenerateDebugInformation", isDebug ? "true" : "false"); linker->setAttribute ("ProgramDatabaseFile", FileHelpers::windowsStylePath (intermediatesPath + "/" + binaryName + ".pdb")); @@ -744,7 +741,7 @@ public: if (settings.hasType (getValueTreeTypeName())) return new MSVCProjectExporterVC6 (project, settings); - return 0; + return nullptr; } //============================================================================== @@ -1012,7 +1009,7 @@ public: if (settings.hasType (getValueTreeTypeName())) return new MSVCProjectExporterVC2010 (project, settings); - return 0; + return nullptr; } //============================================================================== @@ -1192,6 +1189,7 @@ protected: cl->createNewChildElement ("ProgramDataBaseFileName")->addTextElement (FileHelpers::windowsStylePath (intermediatesPath + "/")); cl->createNewChildElement ("WarningLevel")->addTextElement ("Level4"); cl->createNewChildElement ("SuppressStartupBanner")->addTextElement ("true"); + cl->createNewChildElement ("MultiProcessorCompilation")->addTextElement ("true"); const String extraFlags (replacePreprocessorTokens (config, getExtraCompilerFlags().toString()).trim()); if (extraFlags.isNotEmpty()) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h index 699645253d..30fc926474 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h @@ -435,7 +435,6 @@ private: if (exporter->getTargetFolder().createDirectory()) { exporter->addToExtraSearchPaths (RelativePath ("JuceLibraryCode", RelativePath::projectFolder)); - //exporter->addToExtraSearchPaths (RelativePath (exporter->getJuceFolder().toString(), RelativePath::projectFolder).getChildFile ("modules")); generatedFilesGroup.getNode() = originalGeneratedGroup.createCopy(); project.getProjectType().prepareExporter (*exporter); diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index 95eed42b4a..ac5af0df45 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -278,7 +278,7 @@ namespace RTASHelpers RelativePath rtasFolder (getRTASFolder (exporter).toString(), RelativePath::projectFolder); exporter.msvcExtraPreprocessorDefs.set ("JucePlugin_WinBag_path", CodeHelpers::addEscapeChars (rtasFolder.getChildFile ("WinBag") - .toWindowsStyle().quoted())); + .toWindowsStyle().quoted())); String msvcPathToRTASFolder (exporter.getJucePathFromTargetFolder() .getChildFile ("modules/juce_audio_plugin_client/RTAS") diff --git a/extras/Introjucer/Source/Project/jucer_Module.cpp b/extras/Introjucer/Source/Project/jucer_Module.cpp index 1dde1874b4..d0f65b0c21 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.cpp +++ b/extras/Introjucer/Source/Project/jucer_Module.cpp @@ -429,14 +429,15 @@ void LibraryModule::findWildcardMatches (const File& localModuleFolder, const St DirectoryIterator iter (localModuleFolder.getChildFile (path), false, wildCard); while (iter.next()) - tempList.addSorted (sorter, iter.getFile()); + if (! iter.getFile().isHidden()) + tempList.addSorted (sorter, iter.getFile()); result.addArray (tempList); } void LibraryModule::addFileWithGroups (Project::Item& group, const RelativePath& file, const String& path) const { - const int slash = path.indexOfChar ('/'); + const int slash = path.indexOfChar (File::separator); if (slash >= 0) { diff --git a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj index d59eda994f..e14caf2077 100644 --- a/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj +++ b/extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj @@ -63,6 +63,7 @@ .\Debug\ Level4 true + true _DEBUG;%(PreprocessorDefinitions) @@ -101,6 +102,7 @@ .\Release\ Level4 true + true NDEBUG;%(PreprocessorDefinitions) diff --git a/extras/static library/Builds/VisualStudio2010/juce.vcxproj b/extras/static library/Builds/VisualStudio2010/juce.vcxproj index 77e68f29f9..ace301daf8 100644 --- a/extras/static library/Builds/VisualStudio2010/juce.vcxproj +++ b/extras/static library/Builds/VisualStudio2010/juce.vcxproj @@ -63,6 +63,7 @@ .\Debug\ Level4 true + true _DEBUG;%(PreprocessorDefinitions) @@ -101,6 +102,7 @@ .\Release\ Level4 true + true NDEBUG;%(PreprocessorDefinitions) diff --git a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj index 64b61e75db..295dacac17 100644 --- a/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj +++ b/extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj @@ -63,6 +63,7 @@ .\Debug\ Level4 true + true _DEBUG;%(PreprocessorDefinitions) @@ -101,6 +102,7 @@ .\Release\ Level4 true + true NDEBUG;%(PreprocessorDefinitions) diff --git a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm index ad2bae5ba5..6f28e0f8cc 100644 --- a/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm +++ b/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm @@ -66,20 +66,22 @@ void* attachSubWindow (void* hostWindowRef, Component* comp) NSRect hostWindowScreenFrame = [[hostWindow screen] frame]; + const int mainScreenHeight = [[[NSScreen screens] objectAtIndex: 0] frame].size.height; + #if WINDOWPOSITION_BODGE { Rect winBounds; GetWindowBounds ((WindowRef) hostWindowRef, kWindowContentRgn, &winBounds); NSRect w = [hostWindow frame]; w.origin.x = winBounds.left; - w.origin.y = hostWindowScreenFrame.size.height + hostWindowScreenFrame.origin.y - winBounds.bottom; + w.origin.y = mainScreenHeight - winBounds.bottom; [hostWindow setFrame: w display: NO animate: NO]; } #endif NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; windowPos.x = windowPos.x + jmax (0.0f, (oldWindowFrame.size.width - f.size.width) / 2.0f); - windowPos.y = hostWindowScreenFrame.size.height + hostWindowScreenFrame.origin.y - (windowPos.y + f.size.height); + windowPos.y = mainScreenHeight - (windowPos.y + f.size.height); comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); diff --git a/modules/juce_core/containers/juce_Array.h b/modules/juce_core/containers/juce_Array.h index 6f6a63bf90..c92deef95e 100644 --- a/modules/juce_core/containers/juce_Array.h +++ b/modules/juce_core/containers/juce_Array.h @@ -225,7 +225,7 @@ public: @param index the index of the element being requested (0 is the first element in the array) @see getUnchecked, getFirst, getLast */ - const ElementType operator[] (const int index) const + ElementType operator[] (const int index) const { const ScopedLockType lock (getLock()); return isPositiveAndBelow (index, numUsed) ? data.elements [index] @@ -241,7 +241,7 @@ public: @param index the index of the element being requested (0 is the first element in the array) @see operator[], getFirst, getLast */ - inline const ElementType getUnchecked (const int index) const + inline ElementType getUnchecked (const int index) const { const ScopedLockType lock (getLock()); jassert (isPositiveAndBelow (index, numUsed)); @@ -1022,7 +1022,7 @@ private: ArrayAllocationBase data; int numUsed; - inline void deleteAllElements() + inline void deleteAllElements() noexcept { for (int i = 0; i < numUsed; ++i) data.elements[i].~ElementType(); diff --git a/modules/juce_core/containers/juce_HashMap.h b/modules/juce_core/containers/juce_HashMap.h index 5fae8eef5b..86beaacc0e 100644 --- a/modules/juce_core/containers/juce_HashMap.h +++ b/modules/juce_core/containers/juce_HashMap.h @@ -402,7 +402,7 @@ public: /** Returns the current item's key. This should only be called when a call to next() has just returned true. */ - const KeyType getKey() const + KeyType getKey() const { return entry != nullptr ? entry->key : KeyType(); } @@ -410,7 +410,7 @@ public: /** Returns the current item's value. This should only be called when a call to next() has just returned true. */ - const ValueType getValue() const + ValueType getValue() const { return entry != nullptr ? entry->value : ValueType(); } diff --git a/modules/juce_core/containers/juce_NamedValueSet.cpp b/modules/juce_core/containers/juce_NamedValueSet.cpp index b5f2e024e7..f87eb5730c 100644 --- a/modules/juce_core/containers/juce_NamedValueSet.cpp +++ b/modules/juce_core/containers/juce_NamedValueSet.cpp @@ -55,6 +55,11 @@ NamedValueSet::NamedValue::NamedValue (NamedValue&& other) noexcept { } +inline NamedValueSet::NamedValue::NamedValue (const Identifier& name_, var&& value_) + : name (name_), value (static_cast (value_)) +{ +} + NamedValueSet::NamedValue& NamedValueSet::NamedValue::operator= (NamedValue&& other) noexcept { nextListItem = static_cast &&> (other.nextListItem); @@ -160,6 +165,32 @@ var* NamedValueSet::getVarPointer (const Identifier& name) const noexcept return nullptr; } +#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS +bool NamedValueSet::set (const Identifier& name, var&& newValue) +{ + LinkedListPointer* i = &values; + + while (i->get() != nullptr) + { + NamedValue* const v = i->get(); + + if (v->name == name) + { + if (v->value.equalsWithSameType (newValue)) + return false; + + v->value = static_cast (newValue); + return true; + } + + i = &(v->nextListItem); + } + + i->insertNext (new NamedValue (name, static_cast (newValue))); + return true; +} +#endif + bool NamedValueSet::set (const Identifier& name, const var& newValue) { LinkedListPointer* i = &values; diff --git a/modules/juce_core/containers/juce_NamedValueSet.h b/modules/juce_core/containers/juce_NamedValueSet.h index 42f8ab849a..ded2011536 100644 --- a/modules/juce_core/containers/juce_NamedValueSet.h +++ b/modules/juce_core/containers/juce_NamedValueSet.h @@ -84,6 +84,14 @@ public: */ bool set (const Identifier& name, const var& newValue); + #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS + /** Changes or adds a named value. + @returns true if a value was changed or added; false if the + value was already set the the value passed-in. + */ + bool set (const Identifier& name, var&& newValue); + #endif + /** Returns true if the set contains an item with the specified name. */ bool contains (const Identifier& name) const; @@ -135,6 +143,7 @@ private: NamedValue& operator= (const NamedValue&); #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS NamedValue (NamedValue&&) noexcept; + NamedValue (const Identifier& name, var&& value); NamedValue& operator= (NamedValue&&) noexcept; #endif bool operator== (const NamedValue& other) const noexcept; diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.h b/modules/juce_core/containers/juce_ReferenceCountedArray.h index f46770d858..9ab3835b44 100644 --- a/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ b/modules/juce_core/containers/juce_ReferenceCountedArray.h @@ -128,7 +128,7 @@ public: @see getUnchecked */ - inline const ObjectClassPtr operator[] (const int index) const noexcept + inline ObjectClassPtr operator[] (const int index) const noexcept { const ScopedLockType lock (getLock()); return isPositiveAndBelow (index, numUsed) ? data.elements [index] @@ -140,7 +140,7 @@ public: This is a faster and less safe version of operator[] which doesn't check the index passed in, so it can be used when you're sure the index if always going to be legal. */ - inline const ObjectClassPtr getUnchecked (const int index) const noexcept + inline ObjectClassPtr getUnchecked (const int index) const noexcept { const ScopedLockType lock (getLock()); jassert (isPositiveAndBelow (index, numUsed)); @@ -152,7 +152,7 @@ public: This will return a null pointer if the array's empty. @see getLast */ - inline const ObjectClassPtr getFirst() const noexcept + inline ObjectClassPtr getFirst() const noexcept { const ScopedLockType lock (getLock()); return numUsed > 0 ? data.elements [0] @@ -164,7 +164,7 @@ public: This will return a null pointer if the array's empty. @see getFirst */ - inline const ObjectClassPtr getLast() const noexcept + inline ObjectClassPtr getLast() const noexcept { const ScopedLockType lock (getLock()); return numUsed > 0 ? data.elements [numUsed - 1] @@ -466,7 +466,7 @@ public: @param indexToRemove the index of the element to remove @see remove, removeObject, removeRange */ - const ObjectClassPtr removeAndReturn (const int indexToRemove) + ObjectClassPtr removeAndReturn (const int indexToRemove) { ObjectClassPtr removedItem; const ScopedLockType lock (getLock()); diff --git a/modules/juce_core/containers/juce_SparseSet.h b/modules/juce_core/containers/juce_SparseSet.h index 7490824e26..1e3f1a2005 100644 --- a/modules/juce_core/containers/juce_SparseSet.h +++ b/modules/juce_core/containers/juce_SparseSet.h @@ -146,7 +146,7 @@ public: /** Returns the range between the lowest and highest values in the set. @see getRange */ - const Range getTotalRange() const + Range getTotalRange() const { if (values.size() > 0) { diff --git a/modules/juce_core/containers/juce_Variant.cpp b/modules/juce_core/containers/juce_Variant.cpp index 5f10260ec2..376fbaca6b 100644 --- a/modules/juce_core/containers/juce_Variant.cpp +++ b/modules/juce_core/containers/juce_Variant.cpp @@ -399,17 +399,17 @@ void var::swapWith (var& other) noexcept std::swap (value, other.value); } -const var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; } -const var& var::operator= (const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v; return *this; } -const var& var::operator= (const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v; return *this; } -const var& var::operator= (const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v; return *this; } -const var& var::operator= (const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v; return *this; } -const var& var::operator= (const char* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -const var& var::operator= (const wchar_t* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -const var& var::operator= (const String& v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -const var& var::operator= (const Array& v) { var v2 (v); swapWith (v2); return *this; } -const var& var::operator= (ReferenceCountedObject* v) { var v2 (v); swapWith (v2); return *this; } -const var& var::operator= (MethodFunction v) { var v2 (v); swapWith (v2); return *this; } +var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; } +var& var::operator= (const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v; return *this; } +var& var::operator= (const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v; return *this; } +var& var::operator= (const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v; return *this; } +var& var::operator= (const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v; return *this; } +var& var::operator= (const char* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } +var& var::operator= (const wchar_t* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } +var& var::operator= (const String& v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } +var& var::operator= (const Array& v) { var v2 (v); swapWith (v2); return *this; } +var& var::operator= (ReferenceCountedObject* v) { var v2 (v); swapWith (v2); return *this; } +var& var::operator= (MethodFunction v) { var v2 (v); swapWith (v2); return *this; } #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS var::var (var&& other) noexcept @@ -424,6 +424,19 @@ var& var::operator= (var&& other) noexcept swapWith (other); return *this; } + +var::var (String&& value_) : type (&VariantType_String::instance) +{ + new (value.stringValue) String (static_cast (value_)); +} + +var& var::operator= (String&& v) +{ + type->cleanUp (value); + type = &VariantType_String::instance; + new (value.stringValue) String (static_cast (v)); + return *this; +} #endif //============================================================================== diff --git a/modules/juce_core/containers/juce_Variant.h b/modules/juce_core/containers/juce_Variant.h index d7633e44d2..107bc111f6 100644 --- a/modules/juce_core/containers/juce_Variant.h +++ b/modules/juce_core/containers/juce_Variant.h @@ -78,21 +78,23 @@ public: var (ReferenceCountedObject* object); var (MethodFunction method) noexcept; - const var& operator= (const var& valueToCopy); - const var& operator= (int value); - const var& operator= (int64 value); - const var& operator= (bool value); - const var& operator= (double value); - const var& operator= (const char* value); - const var& operator= (const wchar_t* value); - const var& operator= (const String& value); - const var& operator= (const Array& value); - const var& operator= (ReferenceCountedObject* object); - const var& operator= (MethodFunction method); + var& operator= (const var& valueToCopy); + var& operator= (int value); + var& operator= (int64 value); + var& operator= (bool value); + var& operator= (double value); + var& operator= (const char* value); + var& operator= (const wchar_t* value); + var& operator= (const String& value); + var& operator= (const Array& value); + var& operator= (ReferenceCountedObject* object); + var& operator= (MethodFunction method); #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS var (var&& other) noexcept; + var (String&& value); var& operator= (var&& other) noexcept; + var& operator= (String&& value); #endif void swapWith (var& other) noexcept; diff --git a/modules/juce_core/memory/juce_ReferenceCountedObject.h b/modules/juce_core/memory/juce_ReferenceCountedObject.h index faabcdb9d6..dc4be82897 100644 --- a/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ b/modules/juce_core/memory/juce_ReferenceCountedObject.h @@ -256,15 +256,7 @@ public: #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) { - if (this != &other) - { - if (referencedObject != nullptr) - referencedObject->decReferenceCount(); - - referencedObject = other.referencedObject; - other.referencedObject = nullptr; - } - + std::swap (referencedObject, other.referencedObject); return *this; } #endif diff --git a/modules/juce_core/text/juce_StringPairArray.h b/modules/juce_core/text/juce_StringPairArray.h index a78b9c5326..383cdd8cbb 100644 --- a/modules/juce_core/text/juce_StringPairArray.h +++ b/modules/juce_core/text/juce_StringPairArray.h @@ -53,17 +53,13 @@ public: //============================================================================== /** Compares two arrays. - Comparisons are case-sensitive. - @returns true only if the other array contains exactly the same strings with the same keys */ bool operator== (const StringPairArray& other) const; /** Compares two arrays. - Comparisons are case-sensitive. - @returns false if the other array contains exactly the same strings with the same keys */ bool operator!= (const StringPairArray& other) const; diff --git a/modules/juce_data_structures/values/juce_Value.cpp b/modules/juce_data_structures/values/juce_Value.cpp index 1125cfe1c2..066152f047 100644 --- a/modules/juce_data_structures/values/juce_Value.cpp +++ b/modules/juce_data_structures/values/juce_Value.cpp @@ -51,7 +51,8 @@ void Value::ValueSource::sendChangeMessage (const bool synchronous) } else { - triggerAsyncUpdate(); + if (valuesWithListeners.size() > 0) + triggerAsyncUpdate(); } } diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index 962b955316..5fefdea9b5 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -142,8 +142,7 @@ bool MessageManager::postMessageToSystemQueue (Message* message) return PostMessage (juce_messageWindowHandle, WindowsMessageHelpers::specialId, 0, (LPARAM) message) != 0; } -void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, - void* userData) +void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* callback, void* userData) { if (MessageManager::getInstance()->isThisTheMessageThread()) {