diff --git a/modules/juce_core/threads/juce_Thread.cpp b/modules/juce_core/threads/juce_Thread.cpp index 6d2417b1fd..d123732c3e 100644 --- a/modules/juce_core/threads/juce_Thread.cpp +++ b/modules/juce_core/threads/juce_Thread.cpp @@ -23,44 +23,7 @@ ============================================================================== */ -static ThreadLocalValue& getCurrentThreadHolder() -{ - static ThreadLocalValue tls; - return tls; -} -void Thread::threadEntryPoint() -{ - getCurrentThreadHolder() = this; - - JUCE_TRY - { - if (threadName.isNotEmpty()) - setCurrentThreadName (threadName); - - if (startSuspensionEvent.wait (10000)) - { - jassert (getCurrentThreadId() == threadId); - - if (affinityMask != 0) - setCurrentThreadAffinityMask (affinityMask); - - run(); - } - } - JUCE_CATCH_ALL_ASSERT - - getCurrentThreadHolder().releaseCurrentThreadStorage(); - closeThreadHandle(); -} - -// used to wrap the incoming call from the platform-specific code -void JUCE_API juce_threadEntryPoint (void* userData) -{ - static_cast (userData)->threadEntryPoint(); -} - -//============================================================================== Thread::Thread (const String& threadName_) : threadName (threadName_), threadHandle (nullptr), @@ -85,6 +48,64 @@ Thread::~Thread() stopThread (100); } +//============================================================================== +// Use a ref-counted object to hold this shared data, so that it can outlive its static +// shared pointer when threads are still running during static shutdown. +struct CurrentThreadHolder : public ReferenceCountedObject +{ + CurrentThreadHolder() noexcept {} + + typedef ReferenceCountedObjectPtr Ptr; + ThreadLocalValue value; + + JUCE_DECLARE_NON_COPYABLE (CurrentThreadHolder); +}; + +static char currentThreadHolderLock [sizeof (SpinLock)]; // (statically initialised to zeros). + +static CurrentThreadHolder::Ptr getCurrentThreadHolder() +{ + static CurrentThreadHolder::Ptr currentThreadHolder; + SpinLock::ScopedLockType lock (*reinterpret_cast (currentThreadHolderLock)); + + if (currentThreadHolder == nullptr) + currentThreadHolder = new CurrentThreadHolder(); + + return currentThreadHolder; +} + +void Thread::threadEntryPoint() +{ + const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder()); + currentThreadHolder->value = this; + + JUCE_TRY + { + if (threadName.isNotEmpty()) + setCurrentThreadName (threadName); + + if (startSuspensionEvent.wait (10000)) + { + jassert (getCurrentThreadId() == threadId); + + if (affinityMask != 0) + setCurrentThreadAffinityMask (affinityMask); + + run(); + } + } + JUCE_CATCH_ALL_ASSERT + + currentThreadHolder->value.releaseCurrentThreadStorage(); + closeThreadHandle(); +} + +// used to wrap the incoming call from the platform-specific code +void JUCE_API juce_threadEntryPoint (void* userData) +{ + static_cast (userData)->threadEntryPoint(); +} + //============================================================================== void Thread::startThread() { @@ -120,6 +141,11 @@ bool Thread::isThreadRunning() const return threadHandle != nullptr; } +Thread* Thread::getCurrentThread() +{ + return getCurrentThreadHolder()->value.get(); +} + //============================================================================== void Thread::signalThreadShouldExit() { @@ -211,12 +237,6 @@ void Thread::notify() const defaultEvent.signal(); } -//============================================================================== -Thread* Thread::getCurrentThread() -{ - return *getCurrentThreadHolder(); -} - //============================================================================== void SpinLock::enter() const noexcept { diff --git a/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp b/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp index e33eb8f987..62fd13dc92 100644 --- a/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp @@ -54,6 +54,22 @@ void ToolbarButton::contentAreaChanged (const Rectangle&) buttonStateChanged(); } +void ToolbarButton::setCurrentImage (Drawable* const newImage) +{ + if (newImage != currentImage) + { + removeChildComponent (currentImage); + currentImage = newImage; + + if (currentImage != nullptr) + { + enablementChanged(); + addAndMakeVisible (currentImage); + updateDrawable(); + } + } +} + void ToolbarButton::updateDrawable() { if (currentImage != nullptr) @@ -75,23 +91,18 @@ void ToolbarButton::enablementChanged() updateDrawable(); } -void ToolbarButton::buttonStateChanged() +Drawable* ToolbarButton::getImageToUse() const { - Drawable* d = normalImage; + if (getStyle() == Toolbar::textOnly) + return nullptr; if (getToggleState() && toggledOnImage != nullptr) - d = toggledOnImage; + return toggledOnImage; - if (d != currentImage) - { - removeChildComponent (currentImage); - currentImage = d; - - if (d != nullptr) - { - enablementChanged(); - addAndMakeVisible (d); - updateDrawable(); - } - } + return normalImage; +} + +void ToolbarButton::buttonStateChanged() +{ + setCurrentImage (getImageToUse()); } diff --git a/modules/juce_gui_basics/buttons/juce_ToolbarButton.h b/modules/juce_gui_basics/buttons/juce_ToolbarButton.h index a6a33969eb..23234d931d 100644 --- a/modules/juce_gui_basics/buttons/juce_ToolbarButton.h +++ b/modules/juce_gui_basics/buttons/juce_ToolbarButton.h @@ -74,9 +74,9 @@ public: bool getToolbarItemSizes (int toolbarDepth, bool isToolbarVertical, int& preferredSize, int& minSize, int& maxSize); /** @internal */ - void paintButtonArea (Graphics& g, int width, int height, bool isMouseOver, bool isMouseDown); + void paintButtonArea (Graphics&, int width, int height, bool isMouseOver, bool isMouseDown); /** @internal */ - void contentAreaChanged (const Rectangle& newBounds); + void contentAreaChanged (const Rectangle&); /** @internal */ void buttonStateChanged(); /** @internal */ @@ -90,6 +90,8 @@ private: Drawable* currentImage; void updateDrawable(); + Drawable* getImageToUse() const; + void setCurrentImage (Drawable*); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToolbarButton); }; diff --git a/modules/juce_gui_extra/misc/juce_ColourSelector.cpp b/modules/juce_gui_extra/misc/juce_ColourSelector.cpp index fb08940858..9ca730106f 100644 --- a/modules/juce_gui_extra/misc/juce_ColourSelector.cpp +++ b/modules/juce_gui_extra/misc/juce_ColourSelector.cpp @@ -443,7 +443,7 @@ void ColourSelector::paint (Graphics& g) Colour (0xffffffff).overlaidWith (currentColour)); g.setColour (Colours::white.overlaidWith (currentColour).contrasting()); - g.setFont (14.0f, true); + g.setFont (14.0f, Font::bold); g.drawText (currentColour.toDisplayString ((flags & showAlphaChannel) != 0), previewArea.getX(), previewArea.getY(), previewArea.getWidth(), previewArea.getHeight(), Justification::centred, false);