0dd3b02
@@ -60,7 +60,11 @@ public: | |||||
CGColorSpaceRelease (colourSpace); | CGColorSpaceRelease (colourSpace); | ||||
} | } | ||||
~CoreGraphicsPixelData() override; | |||||
~CoreGraphicsPixelData() override | |||||
{ | |||||
freeCachedImageRef(); | |||||
CGContextRelease (context); | |||||
} | |||||
std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override | std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override | ||||
{ | { | ||||
@@ -185,14 +189,6 @@ private: | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsPixelData) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsPixelData) | ||||
}; | }; | ||||
// The following implementation is outside of the class definition to avoid spurious | |||||
// warning messages when dynamically loading libraries at runtime on macOS | |||||
CoreGraphicsPixelData::~CoreGraphicsPixelData() | |||||
{ | |||||
freeCachedImageRef(); | |||||
CGContextRelease (context); | |||||
} | |||||
ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const | ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const | ||||
{ | { | ||||
return *new CoreGraphicsPixelData (format == Image::RGB ? Image::ARGB : format, width, height, clearImage); | return *new CoreGraphicsPixelData (format == Image::RGB ? Image::ARGB : format, width, height, clearImage); | ||||
@@ -586,10 +586,24 @@ public: | |||||
CFRelease (numberRef); | CFRelease (numberRef); | ||||
} | } | ||||
// The implementation of at least one overridden function needs to be outside | |||||
// of the class definition to avoid spurious warning messages when dynamically | |||||
// loading libraries at runtime on macOS... | |||||
~OSXTypeface() override; | |||||
~OSXTypeface() override | |||||
{ | |||||
if (attributedStringAtts != nullptr) | |||||
CFRelease (attributedStringAtts); | |||||
if (fontRef != nullptr) | |||||
{ | |||||
#if JUCE_MAC && defined (MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8 | |||||
if (dataCopy.getSize() != 0) | |||||
CTFontManagerUnregisterGraphicsFont (fontRef, nullptr); | |||||
#endif | |||||
CGFontRelease (fontRef); | |||||
} | |||||
if (ctFontRef != nullptr) | |||||
CFRelease (ctFontRef); | |||||
} | |||||
float getAscent() const override { return ascent; } | float getAscent() const override { return ascent; } | ||||
float getDescent() const override { return 1.0f - ascent; } | float getDescent() const override { return 1.0f - ascent; } | ||||
@@ -719,25 +733,6 @@ private: | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSXTypeface) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSXTypeface) | ||||
}; | }; | ||||
OSXTypeface::~OSXTypeface() | |||||
{ | |||||
if (attributedStringAtts != nullptr) | |||||
CFRelease (attributedStringAtts); | |||||
if (fontRef != nullptr) | |||||
{ | |||||
#if JUCE_MAC && defined (MAC_OS_X_VERSION_10_8) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_8 | |||||
if (dataCopy.getSize() != 0) | |||||
CTFontManagerUnregisterGraphicsFont (fontRef, nullptr); | |||||
#endif | |||||
CGFontRelease (fontRef); | |||||
} | |||||
if (ctFontRef != nullptr) | |||||
CFRelease (ctFontRef); | |||||
} | |||||
CTFontRef getCTFontFromTypeface (const Font& f) | CTFontRef getCTFontFromTypeface (const Font& f) | ||||
{ | { | ||||
if (auto* tf = dynamic_cast<OSXTypeface*> (f.getTypeface())) | if (auto* tf = dynamic_cast<OSXTypeface*> (f.getTypeface())) | ||||
@@ -56,7 +56,10 @@ namespace TabbedComponentHelpers | |||||
//============================================================================== | //============================================================================== | ||||
struct TabbedComponent::ButtonBar : public TabbedButtonBar | struct TabbedComponent::ButtonBar : public TabbedButtonBar | ||||
{ | { | ||||
ButtonBar (TabbedComponent& tabComp, TabbedButtonBar::Orientation o); | |||||
ButtonBar (TabbedComponent& tabComp, TabbedButtonBar::Orientation o) | |||||
: TabbedButtonBar (o), owner (tabComp) | |||||
{ | |||||
} | |||||
void currentTabChanged (int newCurrentTabIndex, const String& newTabName) | void currentTabChanged (int newCurrentTabIndex, const String& newTabName) | ||||
{ | { | ||||
@@ -83,13 +86,6 @@ struct TabbedComponent::ButtonBar : public TabbedButtonBar | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonBar) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonBar) | ||||
}; | }; | ||||
// The following implementation is outside of the class definition to avoid spurious | |||||
// warning messages when dynamically loading libraries at runtime on macOS | |||||
TabbedComponent::ButtonBar::ButtonBar (TabbedComponent& tabComp, TabbedButtonBar::Orientation o) | |||||
: TabbedButtonBar (o), owner (tabComp) | |||||
{ | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
TabbedComponent::TabbedComponent (TabbedButtonBar::Orientation orientation) | TabbedComponent::TabbedComponent (TabbedButtonBar::Orientation orientation) | ||||
{ | { | ||||
@@ -55,7 +55,10 @@ struct HeaderItemComponent : public PopupMenu::CustomComponent | |||||
setName (name); | setName (name); | ||||
} | } | ||||
void paint (Graphics& g) override; | |||||
void paint (Graphics& g) override | |||||
{ | |||||
getLookAndFeel().drawPopupMenuSectionHeader (g, getLocalBounds(), getName()); | |||||
} | |||||
void getIdealSize (int& idealWidth, int& idealHeight) override | void getIdealSize (int& idealWidth, int& idealHeight) override | ||||
{ | { | ||||
@@ -94,7 +97,13 @@ struct ItemComponent : public Component | |||||
addMouseListener (&parent, false); | addMouseListener (&parent, false); | ||||
} | } | ||||
~ItemComponent() override; | |||||
~ItemComponent() override | |||||
{ | |||||
if (customComp != nullptr) | |||||
setItem (*customComp, nullptr); | |||||
removeChildComponent (customComp.get()); | |||||
} | |||||
void getIdealSize (int& idealWidth, int& idealHeight, const int standardItemHeight) | void getIdealSize (int& idealWidth, int& idealHeight, const int standardItemHeight) | ||||
{ | { | ||||
@@ -264,7 +273,13 @@ struct MenuWindow : public Component | |||||
getMouseState (Desktop::getInstance().getMainMouseSource()); // forces creation of a mouse source watcher for the main mouse | getMouseState (Desktop::getInstance().getMainMouseSource()); // forces creation of a mouse source watcher for the main mouse | ||||
} | } | ||||
~MenuWindow() override; | |||||
~MenuWindow() override | |||||
{ | |||||
getActiveWindows().removeFirstMatchingValue (this); | |||||
Desktop::getInstance().removeGlobalMouseListener (this); | |||||
activeSubMenu.reset(); | |||||
items.clear(); | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
void paint (Graphics& g) override | void paint (Graphics& g) override | ||||
@@ -998,7 +1013,14 @@ public: | |||||
startTimerHz (20); | startTimerHz (20); | ||||
} | } | ||||
void handleMouseEvent (const MouseEvent& e); | |||||
void handleMouseEvent (const MouseEvent& e) | |||||
{ | |||||
if (! window.windowIsStillValid()) | |||||
return; | |||||
startTimerHz (20); | |||||
handleMousePosition (e.getScreenPosition()); | |||||
} | |||||
void timerCallback() override | void timerCallback() override | ||||
{ | { | ||||
@@ -1228,7 +1250,11 @@ struct NormalComponentWrapper : public PopupMenu::CustomComponent | |||||
addAndMakeVisible (comp); | addAndMakeVisible (comp); | ||||
} | } | ||||
void getIdealSize (int& idealWidth, int& idealHeight) override; | |||||
void getIdealSize (int& idealWidth, int& idealHeight) override | |||||
{ | |||||
idealWidth = width; | |||||
idealHeight = height; | |||||
} | |||||
void resized() override | void resized() override | ||||
{ | { | ||||
@@ -1243,44 +1269,6 @@ struct NormalComponentWrapper : public PopupMenu::CustomComponent | |||||
}; | }; | ||||
// The following implementations are outside of the class definitions to avoid spurious | |||||
// warning messages when dynamically loading libraries at runtime on macOS | |||||
void PopupMenu::HelperClasses::HeaderItemComponent::paint (Graphics& g) | |||||
{ | |||||
getLookAndFeel().drawPopupMenuSectionHeader (g, getLocalBounds(), getName()); | |||||
} | |||||
PopupMenu::HelperClasses::ItemComponent::~ItemComponent() | |||||
{ | |||||
if (customComp != nullptr) | |||||
setItem (*customComp, nullptr); | |||||
removeChildComponent (customComp.get()); | |||||
} | |||||
PopupMenu::HelperClasses::MenuWindow::~MenuWindow() | |||||
{ | |||||
getActiveWindows().removeFirstMatchingValue (this); | |||||
Desktop::getInstance().removeGlobalMouseListener (this); | |||||
activeSubMenu.reset(); | |||||
items.clear(); | |||||
} | |||||
void PopupMenu::HelperClasses::MouseSourceState::handleMouseEvent (const MouseEvent& e) | |||||
{ | |||||
if (! window.windowIsStillValid()) | |||||
return; | |||||
startTimerHz (20); | |||||
handleMousePosition (e.getScreenPosition()); | |||||
} | |||||
void PopupMenu::HelperClasses::NormalComponentWrapper::getIdealSize (int& idealWidth, int& idealHeight) | |||||
{ | |||||
idealWidth = width; | |||||
idealHeight = height; | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
PopupMenu::PopupMenu (const PopupMenu& other) | PopupMenu::PopupMenu (const PopupMenu& other) | ||||
: items (other.items), | : items (other.items), | ||||