@@ -41477,7 +41477,7 @@ public: | |||||
&& comp.hitTest (localPoint.getX(), localPoint.getY()); | && comp.hitTest (localPoint.getX(), localPoint.getY()); | ||||
} | } | ||||
static const Point<int> convertFromParentSpace (const Component& comp, const Point<int>& pointInParentSpace) | |||||
static Point<int> convertFromParentSpace (const Component& comp, const Point<int>& pointInParentSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return pointInParentSpace - comp.getPosition(); | return pointInParentSpace - comp.getPosition(); | ||||
@@ -41485,7 +41485,7 @@ public: | |||||
return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); | return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); | ||||
} | } | ||||
static const Rectangle<int> convertFromParentSpace (const Component& comp, const Rectangle<int>& areaInParentSpace) | |||||
static Rectangle<int> convertFromParentSpace (const Component& comp, const Rectangle<int>& areaInParentSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return areaInParentSpace - comp.getPosition(); | return areaInParentSpace - comp.getPosition(); | ||||
@@ -41493,7 +41493,7 @@ public: | |||||
return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); | return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); | ||||
} | } | ||||
static const Point<int> convertToParentSpace (const Component& comp, const Point<int>& pointInLocalSpace) | |||||
static Point<int> convertToParentSpace (const Component& comp, const Point<int>& pointInLocalSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return pointInLocalSpace + comp.getPosition(); | return pointInLocalSpace + comp.getPosition(); | ||||
@@ -41501,7 +41501,7 @@ public: | |||||
return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); | return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); | ||||
} | } | ||||
static const Rectangle<int> convertToParentSpace (const Component& comp, const Rectangle<int>& areaInLocalSpace) | |||||
static Rectangle<int> convertToParentSpace (const Component& comp, const Rectangle<int>& areaInLocalSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return areaInLocalSpace + comp.getPosition(); | return areaInLocalSpace + comp.getPosition(); | ||||
@@ -41510,7 +41510,7 @@ public: | |||||
} | } | ||||
template <typename Type> | template <typename Type> | ||||
static const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) | |||||
static Type convertFromDistantParentSpace (const Component* parent, const Component& target, const Type& coordInParent) | |||||
{ | { | ||||
const Component* const directParent = target.getParentComponent(); | const Component* const directParent = target.getParentComponent(); | ||||
jassert (directParent != nullptr); | jassert (directParent != nullptr); | ||||
@@ -41522,7 +41522,7 @@ public: | |||||
} | } | ||||
template <typename Type> | template <typename Type> | ||||
static const Type convertCoordinate (const Component* target, const Component* source, Type p) | |||||
static Type convertCoordinate (const Component* target, const Component* source, Type p) | |||||
{ | { | ||||
while (source != nullptr) | while (source != nullptr) | ||||
{ | { | ||||
@@ -43528,66 +43528,41 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||||
return; | return; | ||||
} | } | ||||
if (! flags.mouseInsideFlag) | |||||
{ | |||||
flags.mouseInsideFlag = true; | |||||
flags.mouseOverFlag = true; | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
BailOutChecker checker (this); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseEnter (me); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseEnter (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseEnter, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); | |||||
} | } | ||||
void Component::internalMouseExit (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseExit (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
{ | { | ||||
BailOutChecker checker (this); | |||||
if (flags.mouseDownFlag) | |||||
{ | |||||
internalMouseUp (source, relativePos, time, source.getCurrentModifiers().getRawFlags()); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
} | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.mouseInsideFlag || flags.mouseOverFlag) | |||||
{ | |||||
flags.mouseInsideFlag = false; | |||||
flags.mouseOverFlag = false; | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseExit (me); | |||||
mouseExit (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseExit, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); | |||||
} | } | ||||
void Component::internalMouseDown (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseDown (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
@@ -43612,8 +43587,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
this, this, time, relativePos, time, | this, this, time, relativePos, time, | ||||
source.getNumberOfMultipleClicks(), false); | source.getNumberOfMultipleClicks(), false); | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -43643,9 +43617,6 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
return; | return; | ||||
} | } | ||||
flags.mouseDownFlag = true; | |||||
flags.mouseOverFlag = true; | |||||
if (flags.repaintOnMouseActivityFlag) | if (flags.repaintOnMouseActivityFlag) | ||||
repaint(); | repaint(); | ||||
@@ -43657,84 +43628,70 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); | MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); | ||||
} | } | ||||
void Component::internalMouseUp (MouseInputSource& source, const Point<int>& relativePos, const Time& time, const ModifierKeys& oldModifiers) | void Component::internalMouseUp (MouseInputSource& source, const Point<int>& relativePos, const Time& time, const ModifierKeys& oldModifiers) | ||||
{ | { | ||||
if (flags.mouseDownFlag) | |||||
{ | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
const MouseEvent me (source, relativePos, | |||||
oldModifiers, this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
const MouseEvent me (source, relativePos, | |||||
oldModifiers, this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
mouseUp (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
mouseUp (me); | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseUp, me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); | |||||
// check for double-click | |||||
if (me.getNumberOfClicks() >= 2) | |||||
{ | |||||
mouseDoubleClick (me); | |||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
// check for double-click | |||||
if (me.getNumberOfClicks() >= 2) | |||||
{ | |||||
mouseDoubleClick (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); | |||||
} | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); | |||||
} | } | ||||
} | } | ||||
void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
{ | { | ||||
if (flags.mouseDownFlag) | |||||
{ | |||||
flags.mouseOverFlag = reallyContains (relativePos, false); | |||||
BailOutChecker checker (this); | |||||
BailOutChecker checker (this); | |||||
const MouseEvent me (source, relativePos, | |||||
source.getCurrentModifiers(), this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
const MouseEvent me (source, relativePos, | |||||
source.getCurrentModifiers(), this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
mouseDrag (me); | |||||
mouseDrag (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseDrag, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); | |||||
} | } | ||||
void Component::internalMouseMove (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseMove (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
@@ -43752,15 +43709,12 @@ void Component::internalMouseMove (MouseInputSource& source, const Point<int>& r | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
flags.mouseOverFlag = true; | |||||
mouseMove (me); | mouseMove (me); | ||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseMove, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); | MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); | ||||
} | } | ||||
@@ -44138,27 +44092,47 @@ void Component::giveAwayFocus (const bool sendFocusLossEvent) | |||||
bool Component::isMouseOver (const bool includeChildren) const | bool Component::isMouseOver (const bool includeChildren) const | ||||
{ | { | ||||
if (flags.mouseOverFlag) | |||||
return true; | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
if (includeChildren) | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | { | ||||
Desktop& desktop = Desktop::getInstance(); | |||||
const MouseInputSource* const mi = desktop.getMouseSource(i); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | |||||
Component* const c = desktop.getMouseSource(i)->getComponentUnderMouse(); | |||||
Component* const c = mi->getComponentUnderMouse(); | |||||
if (isParentOf (c) && c->flags.mouseOverFlag) // (mouseOverFlag checked in case it's being dragged outside the comp) | |||||
return true; | |||||
} | |||||
if ((c == this || (includeChildren && isParentOf (c))) | |||||
&& c->reallyContains (c->getLocalPoint (nullptr, mi->getScreenPosition()), false)) | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
bool Component::isMouseButtonDown() const | |||||
{ | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | |||||
const MouseInputSource* const mi = desktop.getMouseSource(i); | |||||
if (mi->isDragging() && mi->getComponentUnderMouse() == this) | |||||
return true; | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
bool Component::isMouseButtonDown() const noexcept { return flags.mouseDownFlag; } | |||||
bool Component::isMouseOverOrDragging() const noexcept { return flags.mouseOverFlag || flags.mouseDownFlag; } | |||||
bool Component::isMouseOverOrDragging() const | |||||
{ | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
if (desktop.getMouseSource(i)->getComponentUnderMouse() == this) | |||||
return true; | |||||
return false; | |||||
} | |||||
bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() noexcept | bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() noexcept | ||||
{ | { | ||||
@@ -44566,6 +44540,22 @@ void Desktop::handleAsyncUpdate() | |||||
focusListeners.call (&FocusChangeListener::globalFocusChanged, currentFocus); | focusListeners.call (&FocusChangeListener::globalFocusChanged, currentFocus); | ||||
} | } | ||||
void Desktop::resetTimer() | |||||
{ | |||||
if (mouseListeners.size() == 0) | |||||
stopTimer(); | |||||
else | |||||
startTimer (100); | |||||
lastFakeMouseMove = getMousePosition(); | |||||
} | |||||
ListenerList <MouseListener>& Desktop::getMouseListeners() | |||||
{ | |||||
resetTimer(); | |||||
return mouseListeners; | |||||
} | |||||
void Desktop::addGlobalMouseListener (MouseListener* const listener) | void Desktop::addGlobalMouseListener (MouseListener* const listener) | ||||
{ | { | ||||
mouseListeners.add (listener); | mouseListeners.add (listener); | ||||
@@ -44611,16 +44601,6 @@ void Desktop::sendMouseMove() | |||||
} | } | ||||
} | } | ||||
void Desktop::resetTimer() | |||||
{ | |||||
if (mouseListeners.size() == 0) | |||||
stopTimer(); | |||||
else | |||||
startTimer (100); | |||||
lastFakeMouseMove = getMousePosition(); | |||||
} | |||||
void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) | void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) | ||||
{ | { | ||||
if (kioskModeComponent != componentToUse) | if (kioskModeComponent != componentToUse) | ||||
@@ -63082,7 +63062,7 @@ ModifierKeys& ModifierKeys::operator= (const ModifierKeys& other) noexcept | |||||
ModifierKeys ModifierKeys::currentModifiers; | ModifierKeys ModifierKeys::currentModifiers; | ||||
const ModifierKeys ModifierKeys::getCurrentModifiers() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiers() noexcept | |||||
{ | { | ||||
return currentModifiers; | return currentModifiers; | ||||
} | } | ||||
@@ -73580,7 +73560,7 @@ public: | |||||
return static_cast <Component*> (componentUnderMouse); | return static_cast <Component*> (componentUnderMouse); | ||||
} | } | ||||
const ModifierKeys getCurrentModifiers() const | |||||
ModifierKeys getCurrentModifiers() const | |||||
{ | { | ||||
return ModifierKeys::getCurrentModifiers().withoutMouseButtons().withFlags (buttonState.getRawFlags()); | return ModifierKeys::getCurrentModifiers().withoutMouseButtons().withFlags (buttonState.getRawFlags()); | ||||
} | } | ||||
@@ -73610,7 +73590,7 @@ public: | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const Point<int> getScreenPosition() const | |||||
Point<int> getScreenPosition() const | |||||
{ | { | ||||
// This needs to return the live position if possible, but it mustn't update the lastScreenPos | // This needs to return the live position if possible, but it mustn't update the lastScreenPos | ||||
// value, because that can cause continuity problems. | // value, because that can cause continuity problems. | ||||
@@ -73716,8 +73696,12 @@ public: | |||||
if (current != nullptr) | if (current != nullptr) | ||||
{ | { | ||||
WeakReference<Component> safeOldComp (current); | |||||
setButtons (screenPos, time, ModifierKeys()); | setButtons (screenPos, time, ModifierKeys()); | ||||
sendMouseExit (current, screenPos, time); | |||||
if (safeOldComp != nullptr) | |||||
sendMouseExit (current, screenPos, time); | |||||
buttonState = originalButtonState; | buttonState = originalButtonState; | ||||
} | } | ||||
@@ -74019,8 +74003,8 @@ bool MouseInputSource::canHover() const { return isMouse(); } | |||||
bool MouseInputSource::hasMouseWheel() const { return isMouse(); } | bool MouseInputSource::hasMouseWheel() const { return isMouse(); } | ||||
int MouseInputSource::getIndex() const { return pimpl->index; } | int MouseInputSource::getIndex() const { return pimpl->index; } | ||||
bool MouseInputSource::isDragging() const { return pimpl->isDragging(); } | bool MouseInputSource::isDragging() const { return pimpl->isDragging(); } | ||||
const Point<int> MouseInputSource::getScreenPosition() const { return pimpl->getScreenPosition(); } | |||||
const ModifierKeys MouseInputSource::getCurrentModifiers() const { return pimpl->getCurrentModifiers(); } | |||||
Point<int> MouseInputSource::getScreenPosition() const { return pimpl->getScreenPosition(); } | |||||
ModifierKeys MouseInputSource::getCurrentModifiers() const { return pimpl->getCurrentModifiers(); } | |||||
Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } | Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } | ||||
void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); } | void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); } | ||||
int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); } | int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); } | ||||
@@ -93447,7 +93431,7 @@ void GlyphArrangement::stretchRangeOfGlyphs (int startIndex, int num, | |||||
} | } | ||||
} | } | ||||
const Rectangle<float> GlyphArrangement::getBoundingBox (int startIndex, int num, const bool includeWhitespace) const | |||||
Rectangle<float> GlyphArrangement::getBoundingBox (int startIndex, int num, const bool includeWhitespace) const | |||||
{ | { | ||||
jassert (startIndex >= 0); | jassert (startIndex >= 0); | ||||
@@ -108537,6 +108521,21 @@ public: | |||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, | bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, | ||||
int64 startSampleInFile, int numSamples) | int64 startSampleInFile, int numSamples) | ||||
{ | { | ||||
jassert (destSamples != nullptr); | |||||
const int64 samplesAvailable = lengthInSamples - startSampleInFile; | |||||
if (samplesAvailable < numSamples) | |||||
{ | |||||
for (int i = numDestChannels; --i >= 0;) | |||||
if (destSamples[i] != nullptr) | |||||
zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * numSamples); | |||||
numSamples = (int) samplesAvailable; | |||||
} | |||||
if (numSamples <= 0) | |||||
return true; | |||||
OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); | OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); | ||||
if (status != noErr) | if (status != noErr) | ||||
return false; | return false; | ||||
@@ -251296,7 +251295,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = Win32ComponentPeer::currentModifiers; | currentModifiers = Win32ComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
Win32ComponentPeer::updateKeyModifiers(); | Win32ComponentPeer::updateKeyModifiers(); | ||||
@@ -251499,7 +251498,7 @@ void Desktop::createMouseInputSources() | |||||
mouseSources.add (new MouseInputSource (0, true)); | mouseSources.add (new MouseInputSource (0, true)); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
POINT mousePos; | POINT mousePos; | ||||
GetCursorPos (&mousePos); | GetCursorPos (&mousePos); | ||||
@@ -268009,7 +268008,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = LinuxComponentPeer::currentModifiers; | currentModifiers = LinuxComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
Window root, child; | Window root, child; | ||||
int x, y, winx, winy; | int x, y, winx, winy; | ||||
@@ -268184,7 +268183,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
&& (matchedDepth == desiredDepth); | && (matchedDepth == desiredDepth); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
Window root, child; | Window root, child; | ||||
int x, y, winx, winy; | int x, y, winx, winy; | ||||
@@ -271048,6 +271047,16 @@ namespace | |||||
{ | { | ||||
return [NSString stringWithUTF8String: s.toUTF8()]; | return [NSString stringWithUTF8String: s.toUTF8()]; | ||||
} | } | ||||
NSString* nsStringLiteral (const char* const s) noexcept | |||||
{ | |||||
return [NSString stringWithUTF8String: s]; | |||||
} | |||||
NSString* nsEmptyString() noexcept | |||||
{ | |||||
return [NSString string]; | |||||
} | |||||
} | } | ||||
#endif // __JUCE_OSX_OBJCHELPERS_JUCEHEADER__ | #endif // __JUCE_OSX_OBJCHELPERS_JUCEHEADER__ | ||||
@@ -271795,7 +271804,7 @@ private: | |||||
if (req == nil) | if (req == nil) | ||||
return nil; | return nil; | ||||
[req setHTTPMethod: isPost ? @"POST" : @"GET"]; | |||||
[req setHTTPMethod: nsStringLiteral (isPost ? "POST" : "GET")]; | |||||
//[req setCachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; | //[req setCachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; | ||||
StringArray headerLines; | StringArray headerLines; | ||||
@@ -273219,7 +273228,7 @@ String File::getVersion() const | |||||
if (info != nil) | if (info != nil) | ||||
{ | { | ||||
NSString* name = [info valueForKey: @"CFBundleShortVersionString"]; | |||||
NSString* name = [info valueForKey: nsStringLiteral ("CFBundleShortVersionString")]; | |||||
if (name != nil) | if (name != nil) | ||||
result = nsStringToJuce (name); | result = nsStringToJuce (name); | ||||
@@ -273260,7 +273269,7 @@ bool File::moveToTrash() const | |||||
return [[NSWorkspace sharedWorkspace] | return [[NSWorkspace sharedWorkspace] | ||||
performFileOperation: NSWorkspaceRecycleOperation | performFileOperation: NSWorkspaceRecycleOperation | ||||
source: [p stringByDeletingLastPathComponent] | source: [p stringByDeletingLastPathComponent] | ||||
destination: @"" | |||||
destination: nsEmptyString() | |||||
files: [NSArray arrayWithObject: [p lastPathComponent]] | files: [NSArray arrayWithObject: [p lastPathComponent]] | ||||
tag: nil ]; | tag: nil ]; | ||||
#endif | #endif | ||||
@@ -273383,7 +273392,7 @@ void File::revealToUser() const | |||||
{ | { | ||||
#if ! JUCE_IOS | #if ! JUCE_IOS | ||||
if (exists()) | if (exists()) | ||||
[[NSWorkspace sharedWorkspace] selectFile: juceStringToNS (getFullPathName()) inFileViewerRootedAtPath: @""]; | |||||
[[NSWorkspace sharedWorkspace] selectFile: juceStringToNS (getFullPathName()) inFileViewerRootedAtPath: nsEmptyString()]; | |||||
else if (getParentDirectory().exists()) | else if (getParentDirectory().exists()) | ||||
getParentDirectory().revealToUser(); | getParentDirectory().revealToUser(); | ||||
#endif | #endif | ||||
@@ -274467,13 +274476,13 @@ void Font::getPlatformDefaultFontNames (String& defaultSans, String& defaultSeri | |||||
namespace | namespace | ||||
{ | { | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<int> convertToRectInt (const RectType& r) | |||||
Rectangle<int> convertToRectInt (const RectType& r) | |||||
{ | { | ||||
return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | ||||
} | } | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<float> convertToRectFloat (const RectType& r) | |||||
Rectangle<float> convertToRectFloat (const RectType& r) | |||||
{ | { | ||||
return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | ||||
} | } | ||||
@@ -275618,7 +275627,7 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode) | |||||
ModifierKeys UIViewComponentPeer::currentModifiers; | ModifierKeys UIViewComponentPeer::currentModifiers; | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return UIViewComponentPeer::currentModifiers; | return UIViewComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -276558,7 +276567,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
return true; | return true; | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
return juce_lastMousePos; | return juce_lastMousePos; | ||||
} | } | ||||
@@ -277422,7 +277431,7 @@ END_JUCE_NAMESPACE | |||||
(void) request; | (void) request; | ||||
(void) frame; | (void) frame; | ||||
NSURL* url = [actionInformation valueForKey: @"WebActionOriginalURLKey"]; | |||||
NSURL* url = [actionInformation valueForKey: nsStringLiteral ("WebActionOriginalURLKey")]; | |||||
if (ownerComponent->pageAboutToLoad (nsStringToJuce ([url absoluteString]))) | if (ownerComponent->pageAboutToLoad (nsStringToJuce ([url absoluteString]))) | ||||
[listener use]; | [listener use]; | ||||
@@ -277440,8 +277449,8 @@ public: | |||||
WebBrowserComponentInternal (WebBrowserComponent* owner) | WebBrowserComponentInternal (WebBrowserComponent* owner) | ||||
{ | { | ||||
webView = [[WebView alloc] initWithFrame: NSMakeRect (0, 0, 100.0f, 100.0f) | webView = [[WebView alloc] initWithFrame: NSMakeRect (0, 0, 100.0f, 100.0f) | ||||
frameName: @"" | |||||
groupName: @""]; | |||||
frameName: nsEmptyString() | |||||
groupName: nsEmptyString()]; | |||||
setView (webView); | setView (webView); | ||||
clickListener = [[DownloadClickDetector alloc] initWithWebBrowserOwner: owner]; | clickListener = [[DownloadClickDetector alloc] initWithWebBrowserOwner: owner]; | ||||
@@ -277466,7 +277475,7 @@ public: | |||||
if (postData != nullptr && postData->getSize() > 0) | if (postData != nullptr && postData->getSize() > 0) | ||||
{ | { | ||||
[r setHTTPMethod: @"POST"]; | |||||
[r setHTTPMethod: nsStringLiteral ("POST")]; | |||||
[r setHTTPBody: [NSData dataWithBytes: postData->getData() | [r setHTTPBody: [NSData dataWithBytes: postData->getData() | ||||
length: postData->getSize()]]; | length: postData->getSize()]]; | ||||
} | } | ||||
@@ -279051,7 +279060,7 @@ using namespace JUCE_NAMESPACE; | |||||
- (void) broadcastMessageCallback: (NSNotification*) n | - (void) broadcastMessageCallback: (NSNotification*) n | ||||
{ | { | ||||
NSDictionary* dict = (NSDictionary*) [n userInfo]; | NSDictionary* dict = (NSDictionary*) [n userInfo]; | ||||
const String messageString (nsStringToJuce ((NSString*) [dict valueForKey: @"message"])); | |||||
const String messageString (nsStringToJuce ((NSString*) [dict valueForKey: nsStringLiteral ("message")])); | |||||
MessageManager::getInstance()->deliverBroadcastMessage (messageString); | MessageManager::getInstance()->deliverBroadcastMessage (messageString); | ||||
} | } | ||||
@@ -279170,7 +279179,7 @@ bool MessageManager::postMessageToSystemQueue (Message* message) | |||||
void MessageManager::broadcastMessage (const String& message) | void MessageManager::broadcastMessage (const String& message) | ||||
{ | { | ||||
NSDictionary* info = [NSDictionary dictionaryWithObject: juceStringToNS (message) | NSDictionary* info = [NSDictionary dictionaryWithObject: juceStringToNS (message) | ||||
forKey: @"message"]; | |||||
forKey: nsStringLiteral ("message")]; | |||||
[[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegateRedirector::getBroacastEventName() | [[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegateRedirector::getBroacastEventName() | ||||
object: nil | object: nil | ||||
@@ -279973,13 +279982,13 @@ void Font::getPlatformDefaultFontNames (String& defaultSans, String& defaultSeri | |||||
namespace | namespace | ||||
{ | { | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<int> convertToRectInt (const RectType& r) | |||||
Rectangle<int> convertToRectInt (const RectType& r) | |||||
{ | { | ||||
return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | ||||
} | } | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<float> convertToRectFloat (const RectType& r) | |||||
Rectangle<float> convertToRectFloat (const RectType& r) | |||||
{ | { | ||||
return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | ||||
} | } | ||||
@@ -281736,7 +281745,7 @@ void NSViewComponentPeer::updateKeysDown (NSEvent* ev, bool isKeyDown) | |||||
} | } | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return NSViewComponentPeer::currentModifiers; | return NSViewComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -282369,7 +282378,7 @@ BOOL NSViewComponentPeer::sendDragCallback (const int type, id <NSDraggingInfo> | |||||
NSPasteboard* pasteBoard = [sender draggingPasteboard]; | NSPasteboard* pasteBoard = [sender draggingPasteboard]; | ||||
StringArray files; | StringArray files; | ||||
NSString* iTunesPasteboardType = @"CorePasteboardFlavorType 0x6974756E"; // 'itun' | |||||
NSString* iTunesPasteboardType = nsStringLiteral ("CorePasteboardFlavorType 0x6974756E"); // 'itun' | |||||
if (bestType == NSFilesPromisePboardType | if (bestType == NSFilesPromisePboardType | ||||
&& [[pasteBoard types] containsObject: iTunesPasteboardType]) | && [[pasteBoard types] containsObject: iTunesPasteboardType]) | ||||
@@ -282379,13 +282388,13 @@ BOOL NSViewComponentPeer::sendDragCallback (const int type, id <NSDraggingInfo> | |||||
if ([list isKindOfClass: [NSDictionary class]]) | if ([list isKindOfClass: [NSDictionary class]]) | ||||
{ | { | ||||
NSDictionary* iTunesDictionary = (NSDictionary*) list; | NSDictionary* iTunesDictionary = (NSDictionary*) list; | ||||
NSArray* tracks = [iTunesDictionary valueForKey: @"Tracks"]; | |||||
NSArray* tracks = [iTunesDictionary valueForKey: nsStringLiteral ("Tracks")]; | |||||
NSEnumerator* enumerator = [tracks objectEnumerator]; | NSEnumerator* enumerator = [tracks objectEnumerator]; | ||||
NSDictionary* track; | NSDictionary* track; | ||||
while ((track = [enumerator nextObject]) != nil) | while ((track = [enumerator nextObject]) != nil) | ||||
{ | { | ||||
NSURL* url = [NSURL URLWithString: [track valueForKey: @"Location"]]; | |||||
NSURL* url = [NSURL URLWithString: [track valueForKey: nsStringLiteral ("Location")]]; | |||||
if ([url isFileURL]) | if ([url isFileURL]) | ||||
files.add (nsStringToJuce ([url path])); | files.add (nsStringToJuce ([url path])); | ||||
@@ -282769,7 +282778,7 @@ void JUCE_CALLTYPE NativeMessageBox::showMessageBox (AlertWindow::AlertIconType | |||||
const String& title, const String& message, | const String& title, const String& message, | ||||
Component* associatedComponent) | Component* associatedComponent) | ||||
{ | { | ||||
OSXMessageBox box (iconType, title, message, @"OK", nil, nil, 0, false); | |||||
OSXMessageBox box (iconType, title, message, nsStringLiteral ("OK"), nil, nil, 0, false); | |||||
(void) box.getResult(); | (void) box.getResult(); | ||||
} | } | ||||
@@ -282777,7 +282786,7 @@ void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (AlertWindow::AlertIcon | |||||
const String& title, const String& message, | const String& title, const String& message, | ||||
Component* associatedComponent) | Component* associatedComponent) | ||||
{ | { | ||||
new OSXMessageBox (iconType, title, message, @"OK", nil, nil, 0, true); | |||||
new OSXMessageBox (iconType, title, message, nsStringLiteral ("OK"), nil, nil, 0, true); | |||||
} | } | ||||
bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (AlertWindow::AlertIconType iconType, | bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (AlertWindow::AlertIconType iconType, | ||||
@@ -282786,7 +282795,9 @@ bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (AlertWindow::AlertIconType | |||||
ModalComponentManager::Callback* callback) | ModalComponentManager::Callback* callback) | ||||
{ | { | ||||
ScopedPointer<OSXMessageBox> mb (new OSXMessageBox (iconType, title, message, | ScopedPointer<OSXMessageBox> mb (new OSXMessageBox (iconType, title, message, | ||||
@"OK", @"Cancel", nil, callback, callback != nullptr)); | |||||
nsStringLiteral ("OK"), | |||||
nsStringLiteral ("Cancel"), | |||||
nil, callback, callback != nullptr)); | |||||
if (callback == nullptr) | if (callback == nullptr) | ||||
return mb->getResult() == 1; | return mb->getResult() == 1; | ||||
@@ -282800,7 +282811,10 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
ModalComponentManager::Callback* callback) | ModalComponentManager::Callback* callback) | ||||
{ | { | ||||
ScopedPointer<OSXMessageBox> mb (new OSXMessageBox (iconType, title, message, | ScopedPointer<OSXMessageBox> mb (new OSXMessageBox (iconType, title, message, | ||||
@"Yes", @"Cancel", @"No", callback, callback != nullptr)); | |||||
nsStringLiteral ("Yes"), | |||||
nsStringLiteral ("Cancel"), | |||||
nsStringLiteral ("No"), | |||||
callback, callback != nullptr)); | |||||
if (callback == nullptr) | if (callback == nullptr) | ||||
return mb->getResult(); | return mb->getResult(); | ||||
@@ -282874,7 +282888,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
return true; | return true; | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
JUCE_AUTORELEASEPOOL | JUCE_AUTORELEASEPOOL | ||||
const NSPoint p ([NSEvent mouseLocation]); | const NSPoint p ([NSEvent mouseLocation]); | ||||
@@ -283226,7 +283240,7 @@ public: | |||||
componentPeerChanged(); | componentPeerChanged(); | ||||
} | } | ||||
const Rectangle<int> getViewBounds() const | |||||
Rectangle<int> getViewBounds() const | |||||
{ | { | ||||
NSRect r = [view frame]; | NSRect r = [view frame]; | ||||
return Rectangle<int> (0, 0, (int) r.size.width, (int) r.size.height); | return Rectangle<int> (0, 0, (int) r.size.width, (int) r.size.height); | ||||
@@ -284122,7 +284136,7 @@ public: | |||||
{ | { | ||||
NSMenuItem* item = [parent addItemWithTitle: juceStringToNS (name) | NSMenuItem* item = [parent addItemWithTitle: juceStringToNS (name) | ||||
action: nil | action: nil | ||||
keyEquivalent: @""]; | |||||
keyEquivalent: nsEmptyString()]; | |||||
[item setTag: tag]; | [item setTag: tag]; | ||||
NSMenu* sub = createMenu (child, name, menuId, tag); | NSMenu* sub = createMenu (child, name, menuId, tag); | ||||
@@ -284226,7 +284240,7 @@ public: | |||||
NSString* text = juceStringToNS (iter.itemName.upToFirstOccurrenceOf ("<end>", false, true)); | NSString* text = juceStringToNS (iter.itemName.upToFirstOccurrenceOf ("<end>", false, true)); | ||||
if (text == nil) | if (text == nil) | ||||
text = @""; | |||||
text = nsEmptyString(); | |||||
if (iter.isSeparator) | if (iter.isSeparator) | ||||
{ | { | ||||
@@ -284236,7 +284250,7 @@ public: | |||||
{ | { | ||||
NSMenuItem* item = [menuToAddTo addItemWithTitle: text | NSMenuItem* item = [menuToAddTo addItemWithTitle: text | ||||
action: nil | action: nil | ||||
keyEquivalent: @""]; | |||||
keyEquivalent: nsEmptyString()]; | |||||
[item setEnabled: false]; | [item setEnabled: false]; | ||||
} | } | ||||
@@ -284244,7 +284258,7 @@ public: | |||||
{ | { | ||||
NSMenuItem* item = [menuToAddTo addItemWithTitle: text | NSMenuItem* item = [menuToAddTo addItemWithTitle: text | ||||
action: nil | action: nil | ||||
keyEquivalent: @""]; | |||||
keyEquivalent: nsEmptyString()]; | |||||
[item setTag: iter.itemId]; | [item setTag: iter.itemId]; | ||||
[item setEnabled: iter.isEnabled]; | [item setEnabled: iter.isEnabled]; | ||||
@@ -284258,7 +284272,7 @@ public: | |||||
{ | { | ||||
NSMenuItem* item = [menuToAddTo addItemWithTitle: text | NSMenuItem* item = [menuToAddTo addItemWithTitle: text | ||||
action: @selector (menuItemInvoked:) | action: @selector (menuItemInvoked:) | ||||
keyEquivalent: @""]; | |||||
keyEquivalent: nsEmptyString()]; | |||||
[item setTag: iter.itemId]; | [item setTag: iter.itemId]; | ||||
[item setEnabled: iter.isEnabled]; | [item setEnabled: iter.isEnabled]; | ||||
@@ -284341,7 +284355,7 @@ private: | |||||
static void flashMenuBar (NSMenu* menu) | static void flashMenuBar (NSMenu* menu) | ||||
{ | { | ||||
if ([[menu title] isEqualToString: @"Apple"]) | |||||
if ([[menu title] isEqualToString: nsStringLiteral ("Apple")]) | |||||
return; | return; | ||||
[menu retain]; | [menu retain]; | ||||
@@ -284349,7 +284363,7 @@ private: | |||||
const unichar f35Key = NSF35FunctionKey; | const unichar f35Key = NSF35FunctionKey; | ||||
NSString* f35String = [NSString stringWithCharacters: &f35Key length: 1]; | NSString* f35String = [NSString stringWithCharacters: &f35Key length: 1]; | ||||
NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: @"x" | |||||
NSMenuItem* item = [[NSMenuItem alloc] initWithTitle: nsStringLiteral ("x") | |||||
action: nil | action: nil | ||||
keyEquivalent: f35String]; | keyEquivalent: f35String]; | ||||
[item setTarget: nil]; | [item setTarget: nil]; | ||||
@@ -284504,11 +284518,11 @@ namespace MainMenuHelpers | |||||
NSMenuItem* item; | NSMenuItem* item; | ||||
// Services... | // Services... | ||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (@"Services", nil) | |||||
action: nil keyEquivalent: @""]; | |||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (nsStringLiteral ("Services"), nil) | |||||
action: nil keyEquivalent: nsEmptyString()]; | |||||
[menu addItem: item]; | [menu addItem: item]; | ||||
[item release]; | [item release]; | ||||
NSMenu* servicesMenu = [[NSMenu alloc] initWithTitle: @"Services"]; | |||||
NSMenu* servicesMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Services")]; | |||||
[menu setSubmenu: servicesMenu forItem: item]; | [menu setSubmenu: servicesMenu forItem: item]; | ||||
[NSApp setServicesMenu: servicesMenu]; | [NSApp setServicesMenu: servicesMenu]; | ||||
[servicesMenu release]; | [servicesMenu release]; | ||||
@@ -284516,20 +284530,20 @@ namespace MainMenuHelpers | |||||
// Hide + Show stuff... | // Hide + Show stuff... | ||||
item = [[NSMenuItem alloc] initWithTitle: juceStringToNS ("Hide " + appName) | item = [[NSMenuItem alloc] initWithTitle: juceStringToNS ("Hide " + appName) | ||||
action: @selector (hide:) keyEquivalent: @"h"]; | |||||
action: @selector (hide:) keyEquivalent: nsStringLiteral ("h")]; | |||||
[item setTarget: NSApp]; | [item setTarget: NSApp]; | ||||
[menu addItem: item]; | [menu addItem: item]; | ||||
[item release]; | [item release]; | ||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (@"Hide Others", nil) | |||||
action: @selector (hideOtherApplications:) keyEquivalent: @"h"]; | |||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (nsStringLiteral ("Hide Others"), nil) | |||||
action: @selector (hideOtherApplications:) keyEquivalent: nsStringLiteral ("h")]; | |||||
[item setKeyEquivalentModifierMask: NSCommandKeyMask | NSAlternateKeyMask]; | [item setKeyEquivalentModifierMask: NSCommandKeyMask | NSAlternateKeyMask]; | ||||
[item setTarget: NSApp]; | [item setTarget: NSApp]; | ||||
[menu addItem: item]; | [menu addItem: item]; | ||||
[item release]; | [item release]; | ||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (@"Show All", nil) | |||||
action: @selector (unhideAllApplications:) keyEquivalent: @""]; | |||||
item = [[NSMenuItem alloc] initWithTitle: NSLocalizedString (nsStringLiteral ("Show All"), nil) | |||||
action: @selector (unhideAllApplications:) keyEquivalent: nsEmptyString()]; | |||||
[item setTarget: NSApp]; | [item setTarget: NSApp]; | ||||
[menu addItem: item]; | [menu addItem: item]; | ||||
[item release]; | [item release]; | ||||
@@ -284538,7 +284552,7 @@ namespace MainMenuHelpers | |||||
// Quit item.... | // Quit item.... | ||||
item = [[NSMenuItem alloc] initWithTitle: juceStringToNS ("Quit " + appName) | item = [[NSMenuItem alloc] initWithTitle: juceStringToNS ("Quit " + appName) | ||||
action: @selector (terminate:) keyEquivalent: @"q"]; | |||||
action: @selector (terminate:) keyEquivalent: nsStringLiteral ("q")]; | |||||
[item setTarget: NSApp]; | [item setTarget: NSApp]; | ||||
[menu addItem: item]; | [menu addItem: item]; | ||||
@@ -284557,10 +284571,10 @@ namespace MainMenuHelpers | |||||
{ | { | ||||
JUCE_AUTORELEASEPOOL | JUCE_AUTORELEASEPOOL | ||||
NSMenu* mainMenu = [[NSMenu alloc] initWithTitle: @"MainMenu"]; | |||||
NSMenuItem* item = [mainMenu addItemWithTitle: @"Apple" action: nil keyEquivalent: @""]; | |||||
NSMenu* mainMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("MainMenu")]; | |||||
NSMenuItem* item = [mainMenu addItemWithTitle: nsStringLiteral ("Apple") action: nil keyEquivalent: nsEmptyString()]; | |||||
NSMenu* appMenu = [[NSMenu alloc] initWithTitle: @"Apple"]; | |||||
NSMenu* appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")]; | |||||
[NSApp performSelector: @selector (setAppleMenu:) withObject: appMenu]; | [NSApp performSelector: @selector (setAppleMenu:) withObject: appMenu]; | ||||
[mainMenu setSubmenu: appMenu forItem: item]; | [mainMenu setSubmenu: appMenu forItem: item]; | ||||
@@ -284874,7 +284888,7 @@ static QTMovie* openMovieFromStream (InputStream* movieStream, File& movieFile) | |||||
movie = [QTMovie movieWithDataReference: [QTDataReference dataReferenceWithReferenceToData: [NSData dataWithBytes: temp.getData() | movie = [QTMovie movieWithDataReference: [QTDataReference dataReferenceWithReferenceToData: [NSData dataWithBytes: temp.getData() | ||||
length: temp.getSize()] | length: temp.getSize()] | ||||
name: [NSString stringWithUTF8String: suffixesToTry[i]] | name: [NSString stringWithUTF8String: suffixesToTry[i]] | ||||
MIMEType: @""] | |||||
MIMEType: nsEmptyString()] | |||||
error: nil]; | error: nil]; | ||||
if (movie != 0) | if (movie != 0) | ||||
@@ -285937,7 +285951,7 @@ END_JUCE_NAMESPACE | |||||
(void) request; | (void) request; | ||||
(void) frame; | (void) frame; | ||||
NSURL* url = [actionInformation valueForKey: @"WebActionOriginalURLKey"]; | |||||
NSURL* url = [actionInformation valueForKey: nsStringLiteral ("WebActionOriginalURLKey")]; | |||||
if (ownerComponent->pageAboutToLoad (nsStringToJuce ([url absoluteString]))) | if (ownerComponent->pageAboutToLoad (nsStringToJuce ([url absoluteString]))) | ||||
[listener use]; | [listener use]; | ||||
@@ -285955,8 +285969,8 @@ public: | |||||
WebBrowserComponentInternal (WebBrowserComponent* owner) | WebBrowserComponentInternal (WebBrowserComponent* owner) | ||||
{ | { | ||||
webView = [[WebView alloc] initWithFrame: NSMakeRect (0, 0, 100.0f, 100.0f) | webView = [[WebView alloc] initWithFrame: NSMakeRect (0, 0, 100.0f, 100.0f) | ||||
frameName: @"" | |||||
groupName: @""]; | |||||
frameName: nsEmptyString() | |||||
groupName: nsEmptyString()]; | |||||
setView (webView); | setView (webView); | ||||
clickListener = [[DownloadClickDetector alloc] initWithWebBrowserOwner: owner]; | clickListener = [[DownloadClickDetector alloc] initWithWebBrowserOwner: owner]; | ||||
@@ -285981,7 +285995,7 @@ public: | |||||
if (postData != nullptr && postData->getSize() > 0) | if (postData != nullptr && postData->getSize() > 0) | ||||
{ | { | ||||
[r setHTTPMethod: @"POST"]; | |||||
[r setHTTPMethod: nsStringLiteral ("POST")]; | |||||
[r setHTTPBody: [NSData dataWithBytes: postData->getData() | [r setHTTPBody: [NSData dataWithBytes: postData->getData() | ||||
length: postData->getSize()]]; | length: postData->getSize()]]; | ||||
} | } | ||||
@@ -288217,7 +288231,7 @@ END_JUCE_NAMESPACE | |||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 | #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 | ||||
NSNumber* hosttime = (NSNumber*) [sampleBuffer attributeForKey: QTSampleBufferHostTimeAttribute]; | NSNumber* hosttime = (NSNumber*) [sampleBuffer attributeForKey: QTSampleBufferHostTimeAttribute]; | ||||
#else | #else | ||||
NSNumber* hosttime = (NSNumber*) [sampleBuffer attributeForKey: @"hostTime"]; | |||||
NSNumber* hosttime = (NSNumber*) [sampleBuffer attributeForKey: nsStringLiteral ("hostTime")]; | |||||
#endif | #endif | ||||
int64 presentationTime = (hosttime != nil) | int64 presentationTime = (hosttime != nil) | ||||
@@ -288314,10 +288328,10 @@ void CameraDevice::startRecordingToFile (const File& file, int quality) | |||||
if ([mediaType isEqualToString: QTMediaTypeVideo]) | if ([mediaType isEqualToString: QTMediaTypeVideo]) | ||||
options = [QTCompressionOptions compressionOptionsWithIdentifier: | options = [QTCompressionOptions compressionOptionsWithIdentifier: | ||||
quality >= 1 ? @"QTCompressionOptionsSD480SizeH264Video" | |||||
: @"QTCompressionOptions240SizeH264Video"]; | |||||
quality >= 1 ? nsStringLiteral ("QTCompressionOptionsSD480SizeH264Video")_ | |||||
nsStringLiteral ("QTCompressionOptions240SizeH264Video")]; | |||||
else if ([mediaType isEqualToString: QTMediaTypeSound]) | else if ([mediaType isEqualToString: QTMediaTypeSound]) | ||||
options = [QTCompressionOptions compressionOptionsWithIdentifier: @"QTCompressionOptionsHighQualityAACAudio"]; | |||||
options = [QTCompressionOptions compressionOptionsWithIdentifier: nsStringLiteral ("QTCompressionOptionsHighQualityAACAudio")]; | |||||
[d->fileOutput setCompressionOptions: options forConnection: connection]; | [d->fileOutput setCompressionOptions: options forConnection: connection]; | ||||
} | } | ||||
@@ -292296,7 +292310,7 @@ void Desktop::createMouseInputSources() | |||||
mouseSources.add (new MouseInputSource (i, false)); | mouseSources.add (new MouseInputSource (i, false)); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
return AndroidComponentPeer::lastMousePos; | return AndroidComponentPeer::lastMousePos; | ||||
} | } | ||||
@@ -292317,7 +292331,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = AndroidComponentPeer::currentModifiers; | currentModifiers = AndroidComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return AndroidComponentPeer::currentModifiers; | return AndroidComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -73,7 +73,7 @@ namespace JuceDummyNamespace {} | |||||
*/ | */ | ||||
#define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
#define JUCE_MINOR_VERSION 54 | #define JUCE_MINOR_VERSION 54 | ||||
#define JUCE_BUILDNUMBER 18 | |||||
#define JUCE_BUILDNUMBER 19 | |||||
/** Current Juce version number. | /** Current Juce version number. | ||||
@@ -23937,21 +23937,21 @@ public: | |||||
/** Middle mouse button flag. */ | /** Middle mouse button flag. */ | ||||
middleButtonModifier = 64, | middleButtonModifier = 64, | ||||
#if JUCE_MAC | |||||
#if JUCE_MAC | |||||
/** Command key flag - on windows this is the same as the CTRL key flag. */ | /** Command key flag - on windows this is the same as the CTRL key flag. */ | ||||
commandModifier = 8, | commandModifier = 8, | ||||
/** Popup menu flag - on windows this is the same as rightButtonModifier, on the | /** Popup menu flag - on windows this is the same as rightButtonModifier, on the | ||||
Mac it's the same as (rightButtonModifier | ctrlModifier). */ | Mac it's the same as (rightButtonModifier | ctrlModifier). */ | ||||
popupMenuClickModifier = rightButtonModifier | ctrlModifier, | popupMenuClickModifier = rightButtonModifier | ctrlModifier, | ||||
#else | |||||
#else | |||||
/** Command key flag - on windows this is the same as the CTRL key flag. */ | /** Command key flag - on windows this is the same as the CTRL key flag. */ | ||||
commandModifier = ctrlModifier, | commandModifier = ctrlModifier, | ||||
/** Popup menu flag - on windows this is the same as rightButtonModifier, on the | /** Popup menu flag - on windows this is the same as rightButtonModifier, on the | ||||
Mac it's the same as (rightButtonModifier | ctrlModifier). */ | Mac it's the same as (rightButtonModifier | ctrlModifier). */ | ||||
popupMenuClickModifier = rightButtonModifier, | popupMenuClickModifier = rightButtonModifier, | ||||
#endif | |||||
#endif | |||||
/** Represents a combination of all the shift, alt, ctrl and command key modifiers. */ | /** Represents a combination of all the shift, alt, ctrl and command key modifiers. */ | ||||
allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier, | allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier, | ||||
@@ -23961,10 +23961,10 @@ public: | |||||
}; | }; | ||||
/** Returns a copy of only the mouse-button flags */ | /** Returns a copy of only the mouse-button flags */ | ||||
const ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } | |||||
ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } | |||||
/** Returns a copy of only the non-mouse flags */ | /** Returns a copy of only the non-mouse flags */ | ||||
const ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } | |||||
ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } | |||||
bool operator== (const ModifierKeys& other) const noexcept { return flags == other.flags; } | bool operator== (const ModifierKeys& other) const noexcept { return flags == other.flags; } | ||||
bool operator!= (const ModifierKeys& other) const noexcept { return flags != other.flags; } | bool operator!= (const ModifierKeys& other) const noexcept { return flags != other.flags; } | ||||
@@ -23986,7 +23986,7 @@ public: | |||||
@see getCurrentModifiersRealtime | @see getCurrentModifiersRealtime | ||||
*/ | */ | ||||
static const ModifierKeys getCurrentModifiers() noexcept; | |||||
static ModifierKeys getCurrentModifiers() noexcept; | |||||
/** Creates a ModifierKeys object to represent the current state of the | /** Creates a ModifierKeys object to represent the current state of the | ||||
keyboard and mouse buttons. | keyboard and mouse buttons. | ||||
@@ -24002,7 +24002,7 @@ public: | |||||
update the value returned by getCurrentModifiers(), which could cause subtle changes | update the value returned by getCurrentModifiers(), which could cause subtle changes | ||||
in the behaviour of some components. | in the behaviour of some components. | ||||
*/ | */ | ||||
static const ModifierKeys getCurrentModifiersRealtime() noexcept; | |||||
static ModifierKeys getCurrentModifiersRealtime() noexcept; | |||||
private: | private: | ||||
@@ -26185,12 +26185,12 @@ public: | |||||
This is only relevent for floating-point rectangles, of course. | This is only relevent for floating-point rectangles, of course. | ||||
@see toFloat() | @see toFloat() | ||||
*/ | */ | ||||
const Rectangle<int> getSmallestIntegerContainer() const noexcept | |||||
Rectangle<int> getSmallestIntegerContainer() const noexcept | |||||
{ | { | ||||
const int x1 = (int) std::floor (static_cast<float> (x)); | const int x1 = (int) std::floor (static_cast<float> (x)); | ||||
const int y1 = (int) std::floor (static_cast<float> (y)); | const int y1 = (int) std::floor (static_cast<float> (y)); | ||||
const int x2 = (int) std::ceil (static_cast<float> (x + w)); | |||||
const int y2 = (int) std::ceil (static_cast<float> (y + h)); | |||||
const int x2 = (int) std::ceil (static_cast<float> (x + w)); | |||||
const int y2 = (int) std::ceil (static_cast<float> (y + h)); | |||||
return Rectangle<int> (x1, y1, x2 - x1, y2 - y1); | return Rectangle<int> (x1, y1, x2 - x1, y2 - y1); | ||||
} | } | ||||
@@ -26221,7 +26221,7 @@ public: | |||||
Obviously this is mainly useful for rectangles that use integer types. | Obviously this is mainly useful for rectangles that use integer types. | ||||
@see getSmallestIntegerContainer | @see getSmallestIntegerContainer | ||||
*/ | */ | ||||
const Rectangle<float> toFloat() const noexcept | |||||
Rectangle<float> toFloat() const noexcept | |||||
{ | { | ||||
return Rectangle<float> (static_cast<float> (x), static_cast<float> (y), | return Rectangle<float> (static_cast<float> (x), static_cast<float> (y), | ||||
static_cast<float> (w), static_cast<float> (h)); | static_cast<float> (w), static_cast<float> (h)); | ||||
@@ -32500,7 +32500,7 @@ public: | |||||
@see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging | @see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging | ||||
*/ | */ | ||||
bool isMouseButtonDown() const noexcept; | |||||
bool isMouseButtonDown() const; | |||||
/** True if the mouse is over this component, or if it's being dragged in this component. | /** True if the mouse is over this component, or if it's being dragged in this component. | ||||
@@ -32508,7 +32508,7 @@ public: | |||||
@see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere | @see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere | ||||
*/ | */ | ||||
bool isMouseOverOrDragging() const noexcept; | |||||
bool isMouseOverOrDragging() const; | |||||
/** Returns true if a mouse button is currently down. | /** Returns true if a mouse button is currently down. | ||||
@@ -32989,9 +32989,6 @@ private: | |||||
bool bufferToImageFlag : 1; | bool bufferToImageFlag : 1; | ||||
bool bringToFrontOnClickFlag : 1; | bool bringToFrontOnClickFlag : 1; | ||||
bool repaintOnMouseActivityFlag : 1; | bool repaintOnMouseActivityFlag : 1; | ||||
bool mouseDownFlag : 1; | |||||
bool mouseOverFlag : 1; | |||||
bool mouseInsideFlag : 1; | |||||
bool currentlyModalFlag : 1; | bool currentlyModalFlag : 1; | ||||
bool isDisabledFlag : 1; | bool isDisabledFlag : 1; | ||||
bool childCompFocusedFlag : 1; | bool childCompFocusedFlag : 1; | ||||
@@ -34462,6 +34459,7 @@ private: | |||||
void timerCallback(); | void timerCallback(); | ||||
void resetTimer(); | void resetTimer(); | ||||
ListenerList <MouseListener>& getMouseListeners(); | |||||
int getNumDisplayMonitors() const noexcept; | int getNumDisplayMonitors() const noexcept; | ||||
const Rectangle<int> getDisplayMonitorCoordinates (int index, bool clippedToWorkArea) const noexcept; | const Rectangle<int> getDisplayMonitorCoordinates (int index, bool clippedToWorkArea) const noexcept; | ||||
@@ -57762,7 +57760,7 @@ public: | |||||
/** Returns the y position of the bottom of the glyph. */ | /** Returns the y position of the bottom of the glyph. */ | ||||
float getBottom() const { return y + font.getDescent(); } | float getBottom() const { return y + font.getDescent(); } | ||||
/** Returns the bounds of the glyph. */ | /** Returns the bounds of the glyph. */ | ||||
const Rectangle<float> getBounds() const { return Rectangle<float> (x, getTop(), w, font.getHeight()); } | |||||
Rectangle<float> getBounds() const { return Rectangle<float> (x, getTop(), w, font.getHeight()); } | |||||
/** Shifts the glyph's position by a relative amount. */ | /** Shifts the glyph's position by a relative amount. */ | ||||
void moveBy (float deltaX, float deltaY); | void moveBy (float deltaX, float deltaY); | ||||
@@ -57941,7 +57939,7 @@ public: | |||||
@param includeWhitespace if true, the extent of any whitespace characters will also | @param includeWhitespace if true, the extent of any whitespace characters will also | ||||
be taken into account | be taken into account | ||||
*/ | */ | ||||
const Rectangle<float> getBoundingBox (int startIndex, int numGlyphs, bool includeWhitespace) const; | |||||
Rectangle<float> getBoundingBox (int startIndex, int numGlyphs, bool includeWhitespace) const; | |||||
/** Shifts a set of glyphs by a given amount. | /** Shifts a set of glyphs by a given amount. | ||||
@@ -62943,12 +62941,12 @@ public: | |||||
bool isDragging() const; | bool isDragging() const; | ||||
/** Returns the last-known screen position of this source. */ | /** Returns the last-known screen position of this source. */ | ||||
const Point<int> getScreenPosition() const; | |||||
Point<int> getScreenPosition() const; | |||||
/** Returns a set of modifiers that indicate which buttons are currently | /** Returns a set of modifiers that indicate which buttons are currently | ||||
held down on this device. | held down on this device. | ||||
*/ | */ | ||||
const ModifierKeys getCurrentModifiers() const; | |||||
ModifierKeys getCurrentModifiers() const; | |||||
/** Returns the component that was last known to be under this pointer. */ | /** Returns the component that was last known to be under this pointer. */ | ||||
Component* getComponentUnderMouse() const; | Component* getComponentUnderMouse() const; | ||||
@@ -63025,7 +63023,7 @@ private: | |||||
friend class MouseInputSourceInternal; | friend class MouseInputSourceInternal; | ||||
ScopedPointer<MouseInputSourceInternal> pimpl; | ScopedPointer<MouseInputSourceInternal> pimpl; | ||||
static const Point<int> getCurrentMousePosition(); | |||||
static Point<int> getCurrentMousePosition(); | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MouseInputSource); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MouseInputSource); | ||||
}; | }; | ||||
@@ -135,6 +135,21 @@ public: | |||||
bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, | bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, | ||||
int64 startSampleInFile, int numSamples) | int64 startSampleInFile, int numSamples) | ||||
{ | { | ||||
jassert (destSamples != nullptr); | |||||
const int64 samplesAvailable = lengthInSamples - startSampleInFile; | |||||
if (samplesAvailable < numSamples) | |||||
{ | |||||
for (int i = numDestChannels; --i >= 0;) | |||||
if (destSamples[i] != nullptr) | |||||
zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * numSamples); | |||||
numSamples = (int) samplesAvailable; | |||||
} | |||||
if (numSamples <= 0) | |||||
return true; | |||||
OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); | OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); | ||||
if (status != noErr) | if (status != noErr) | ||||
return false; | return false; | ||||
@@ -155,7 +155,7 @@ BEGIN_JUCE_NAMESPACE | |||||
extern void detachComponentFromWindowRef (Component* component, void* nsWindow); | extern void detachComponentFromWindowRef (Component* component, void* nsWindow); | ||||
extern void setNativeHostWindowSize (void* nsWindow, Component* editorComp, int newWidth, int newHeight, const PluginHostType& host); | extern void setNativeHostWindowSize (void* nsWindow, Component* editorComp, int newWidth, int newHeight, const PluginHostType& host); | ||||
extern void checkWindowVisibility (void* nsWindow, Component* component); | extern void checkWindowVisibility (void* nsWindow, Component* component); | ||||
extern void forwardCurrentKeyEventToHost (Component* component); | |||||
extern bool forwardCurrentKeyEventToHost (Component* component); | |||||
#endif | #endif | ||||
#if JUCE_LINUX | #if JUCE_LINUX | ||||
@@ -1275,12 +1275,11 @@ public: | |||||
} | } | ||||
#if JUCE_MAC | #if JUCE_MAC | ||||
bool keyPressed (const KeyPress& kp) | |||||
bool keyPressed (const KeyPress&) | |||||
{ | { | ||||
// If we have an unused keypress, move the key-focus to a host window | // If we have an unused keypress, move the key-focus to a host window | ||||
// and re-inject the event.. | // and re-inject the event.. | ||||
forwardCurrentKeyEventToHost (this); | |||||
return true; | |||||
return forwardCurrentKeyEventToHost (this); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -229,12 +229,15 @@ void checkWindowVisibility (void* nsWindow, Component* comp) | |||||
#endif | #endif | ||||
} | } | ||||
void forwardCurrentKeyEventToHost (Component* comp) | |||||
bool forwardCurrentKeyEventToHost (Component* comp) | |||||
{ | { | ||||
#if ! JUCE_64BIT | |||||
#if JUCE_64BIT | |||||
return false; | |||||
#else | |||||
NSWindow* win = [(NSView*) comp->getWindowHandle() window]; | NSWindow* win = [(NSView*) comp->getWindowHandle() window]; | ||||
[[win parentWindow] makeKeyWindow]; | [[win parentWindow] makeKeyWindow]; | ||||
[NSApp postEvent: [NSApp currentEvent] atStart: YES]; | [NSApp postEvent: [NSApp currentEvent] atStart: YES]; | ||||
return true; | |||||
#endif | #endif | ||||
} | } | ||||
@@ -33,7 +33,7 @@ | |||||
*/ | */ | ||||
#define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
#define JUCE_MINOR_VERSION 54 | #define JUCE_MINOR_VERSION 54 | ||||
#define JUCE_BUILDNUMBER 18 | |||||
#define JUCE_BUILDNUMBER 19 | |||||
/** Current Juce version number. | /** Current Juce version number. | ||||
@@ -236,7 +236,7 @@ public: | |||||
&& comp.hitTest (localPoint.getX(), localPoint.getY()); | && comp.hitTest (localPoint.getX(), localPoint.getY()); | ||||
} | } | ||||
static const Point<int> convertFromParentSpace (const Component& comp, const Point<int>& pointInParentSpace) | |||||
static Point<int> convertFromParentSpace (const Component& comp, const Point<int>& pointInParentSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return pointInParentSpace - comp.getPosition(); | return pointInParentSpace - comp.getPosition(); | ||||
@@ -244,7 +244,7 @@ public: | |||||
return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); | return pointInParentSpace.toFloat().transformedBy (comp.affineTransform->inverted()).toInt() - comp.getPosition(); | ||||
} | } | ||||
static const Rectangle<int> convertFromParentSpace (const Component& comp, const Rectangle<int>& areaInParentSpace) | |||||
static Rectangle<int> convertFromParentSpace (const Component& comp, const Rectangle<int>& areaInParentSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return areaInParentSpace - comp.getPosition(); | return areaInParentSpace - comp.getPosition(); | ||||
@@ -252,7 +252,7 @@ public: | |||||
return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); | return areaInParentSpace.toFloat().transformed (comp.affineTransform->inverted()).getSmallestIntegerContainer() - comp.getPosition(); | ||||
} | } | ||||
static const Point<int> convertToParentSpace (const Component& comp, const Point<int>& pointInLocalSpace) | |||||
static Point<int> convertToParentSpace (const Component& comp, const Point<int>& pointInLocalSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return pointInLocalSpace + comp.getPosition(); | return pointInLocalSpace + comp.getPosition(); | ||||
@@ -260,7 +260,7 @@ public: | |||||
return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); | return (pointInLocalSpace + comp.getPosition()).toFloat().transformedBy (*comp.affineTransform).toInt(); | ||||
} | } | ||||
static const Rectangle<int> convertToParentSpace (const Component& comp, const Rectangle<int>& areaInLocalSpace) | |||||
static Rectangle<int> convertToParentSpace (const Component& comp, const Rectangle<int>& areaInLocalSpace) | |||||
{ | { | ||||
if (comp.affineTransform == nullptr) | if (comp.affineTransform == nullptr) | ||||
return areaInLocalSpace + comp.getPosition(); | return areaInLocalSpace + comp.getPosition(); | ||||
@@ -269,7 +269,7 @@ public: | |||||
} | } | ||||
template <typename Type> | template <typename Type> | ||||
static const Type convertFromDistantParentSpace (const Component* parent, const Component& target, Type coordInParent) | |||||
static Type convertFromDistantParentSpace (const Component* parent, const Component& target, const Type& coordInParent) | |||||
{ | { | ||||
const Component* const directParent = target.getParentComponent(); | const Component* const directParent = target.getParentComponent(); | ||||
jassert (directParent != nullptr); | jassert (directParent != nullptr); | ||||
@@ -281,7 +281,7 @@ public: | |||||
} | } | ||||
template <typename Type> | template <typename Type> | ||||
static const Type convertCoordinate (const Component* target, const Component* source, Type p) | |||||
static Type convertCoordinate (const Component* target, const Component* source, Type p) | |||||
{ | { | ||||
while (source != nullptr) | while (source != nullptr) | ||||
{ | { | ||||
@@ -2326,66 +2326,41 @@ void Component::internalMouseEnter (MouseInputSource& source, const Point<int>& | |||||
return; | return; | ||||
} | } | ||||
if (! flags.mouseInsideFlag) | |||||
{ | |||||
flags.mouseInsideFlag = true; | |||||
flags.mouseOverFlag = true; | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
BailOutChecker checker (this); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseEnter (me); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseEnter (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseEnter, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseEnter, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); | |||||
} | } | ||||
void Component::internalMouseExit (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseExit (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
{ | { | ||||
BailOutChecker checker (this); | |||||
if (flags.mouseDownFlag) | |||||
{ | |||||
internalMouseUp (source, relativePos, time, source.getCurrentModifiers().getRawFlags()); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
} | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.mouseInsideFlag || flags.mouseOverFlag) | |||||
{ | |||||
flags.mouseInsideFlag = false; | |||||
flags.mouseOverFlag = false; | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), | |||||
this, this, time, relativePos, time, 0, false); | |||||
mouseExit (me); | |||||
mouseExit (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseExit, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseExit, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
@@ -2411,8 +2386,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
this, this, time, relativePos, time, | this, this, time, relativePos, time, | ||||
source.getNumberOfMultipleClicks(), false); | source.getNumberOfMultipleClicks(), false); | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -2442,9 +2416,6 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
return; | return; | ||||
} | } | ||||
flags.mouseDownFlag = true; | |||||
flags.mouseOverFlag = true; | |||||
if (flags.repaintOnMouseActivityFlag) | if (flags.repaintOnMouseActivityFlag) | ||||
repaint(); | repaint(); | ||||
@@ -2456,8 +2427,7 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDown, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); | MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); | ||||
} | } | ||||
@@ -2465,76 +2435,63 @@ void Component::internalMouseDown (MouseInputSource& source, const Point<int>& r | |||||
//============================================================================== | //============================================================================== | ||||
void Component::internalMouseUp (MouseInputSource& source, const Point<int>& relativePos, const Time& time, const ModifierKeys& oldModifiers) | void Component::internalMouseUp (MouseInputSource& source, const Point<int>& relativePos, const Time& time, const ModifierKeys& oldModifiers) | ||||
{ | { | ||||
if (flags.mouseDownFlag) | |||||
{ | |||||
flags.mouseDownFlag = false; | |||||
BailOutChecker checker (this); | |||||
BailOutChecker checker (this); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
if (flags.repaintOnMouseActivityFlag) | |||||
repaint(); | |||||
const MouseEvent me (source, relativePos, | |||||
oldModifiers, this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
const MouseEvent me (source, relativePos, | |||||
oldModifiers, this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
mouseUp (me); | |||||
mouseUp (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseUp, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseUp, me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); | |||||
// check for double-click | |||||
if (me.getNumberOfClicks() >= 2) | |||||
{ | |||||
mouseDoubleClick (me); | |||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
// check for double-click | |||||
if (me.getNumberOfClicks() >= 2) | |||||
{ | |||||
mouseDoubleClick (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); | |||||
} | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); | |||||
} | } | ||||
} | } | ||||
void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseDrag (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
{ | { | ||||
if (flags.mouseDownFlag) | |||||
{ | |||||
flags.mouseOverFlag = reallyContains (relativePos, false); | |||||
BailOutChecker checker (this); | |||||
BailOutChecker checker (this); | |||||
const MouseEvent me (source, relativePos, | |||||
source.getCurrentModifiers(), this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
const MouseEvent me (source, relativePos, | |||||
source.getCurrentModifiers(), this, this, time, | |||||
getLocalPoint (nullptr, source.getLastMouseDownPosition()), | |||||
source.getLastMouseDownTime(), | |||||
source.getNumberOfMultipleClicks(), | |||||
source.hasMouseMovedSignificantlySincePressed()); | |||||
mouseDrag (me); | |||||
mouseDrag (me); | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
if (checker.shouldBailOut()) | |||||
return; | |||||
Desktop& desktop = Desktop::getInstance(); | |||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); | |||||
Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseDrag, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); | |||||
} | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); | |||||
} | } | ||||
void Component::internalMouseMove (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | void Component::internalMouseMove (MouseInputSource& source, const Point<int>& relativePos, const Time& time) | ||||
@@ -2552,15 +2509,12 @@ void Component::internalMouseMove (MouseInputSource& source, const Point<int>& r | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
flags.mouseOverFlag = true; | |||||
mouseMove (me); | mouseMove (me); | ||||
if (checker.shouldBailOut()) | if (checker.shouldBailOut()) | ||||
return; | return; | ||||
desktop.resetTimer(); | |||||
desktop.mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); | |||||
desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseMove, me); | |||||
MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); | MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); | ||||
} | } | ||||
@@ -2941,27 +2895,47 @@ void Component::giveAwayFocus (const bool sendFocusLossEvent) | |||||
//============================================================================== | //============================================================================== | ||||
bool Component::isMouseOver (const bool includeChildren) const | bool Component::isMouseOver (const bool includeChildren) const | ||||
{ | { | ||||
if (flags.mouseOverFlag) | |||||
return true; | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
if (includeChildren) | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | { | ||||
Desktop& desktop = Desktop::getInstance(); | |||||
const MouseInputSource* const mi = desktop.getMouseSource(i); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | |||||
Component* const c = desktop.getMouseSource(i)->getComponentUnderMouse(); | |||||
Component* const c = mi->getComponentUnderMouse(); | |||||
if (isParentOf (c) && c->flags.mouseOverFlag) // (mouseOverFlag checked in case it's being dragged outside the comp) | |||||
return true; | |||||
} | |||||
if ((c == this || (includeChildren && isParentOf (c))) | |||||
&& c->reallyContains (c->getLocalPoint (nullptr, mi->getScreenPosition()), false)) | |||||
return true; | |||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
bool Component::isMouseButtonDown() const noexcept { return flags.mouseDownFlag; } | |||||
bool Component::isMouseOverOrDragging() const noexcept { return flags.mouseOverFlag || flags.mouseDownFlag; } | |||||
bool Component::isMouseButtonDown() const | |||||
{ | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
{ | |||||
const MouseInputSource* const mi = desktop.getMouseSource(i); | |||||
if (mi->isDragging() && mi->getComponentUnderMouse() == this) | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
bool Component::isMouseOverOrDragging() const | |||||
{ | |||||
const Desktop& desktop = Desktop::getInstance(); | |||||
for (int i = desktop.getNumMouseSources(); --i >= 0;) | |||||
if (desktop.getMouseSource(i)->getComponentUnderMouse() == this) | |||||
return true; | |||||
return false; | |||||
} | |||||
bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() noexcept | bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() noexcept | ||||
{ | { | ||||
@@ -1769,7 +1769,7 @@ public: | |||||
@see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging | @see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging | ||||
*/ | */ | ||||
bool isMouseButtonDown() const noexcept; | |||||
bool isMouseButtonDown() const; | |||||
/** True if the mouse is over this component, or if it's being dragged in this component. | /** True if the mouse is over this component, or if it's being dragged in this component. | ||||
@@ -1777,7 +1777,7 @@ public: | |||||
@see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere | @see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere | ||||
*/ | */ | ||||
bool isMouseOverOrDragging() const noexcept; | |||||
bool isMouseOverOrDragging() const; | |||||
/** Returns true if a mouse button is currently down. | /** Returns true if a mouse button is currently down. | ||||
@@ -2271,9 +2271,6 @@ private: | |||||
bool bufferToImageFlag : 1; | bool bufferToImageFlag : 1; | ||||
bool bringToFrontOnClickFlag : 1; | bool bringToFrontOnClickFlag : 1; | ||||
bool repaintOnMouseActivityFlag : 1; | bool repaintOnMouseActivityFlag : 1; | ||||
bool mouseDownFlag : 1; | |||||
bool mouseOverFlag : 1; | |||||
bool mouseInsideFlag : 1; | |||||
bool currentlyModalFlag : 1; | bool currentlyModalFlag : 1; | ||||
bool isDisabledFlag : 1; | bool isDisabledFlag : 1; | ||||
bool childCompFocusedFlag : 1; | bool childCompFocusedFlag : 1; | ||||
@@ -352,6 +352,22 @@ void Desktop::handleAsyncUpdate() | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
void Desktop::resetTimer() | |||||
{ | |||||
if (mouseListeners.size() == 0) | |||||
stopTimer(); | |||||
else | |||||
startTimer (100); | |||||
lastFakeMouseMove = getMousePosition(); | |||||
} | |||||
ListenerList <MouseListener>& Desktop::getMouseListeners() | |||||
{ | |||||
resetTimer(); | |||||
return mouseListeners; | |||||
} | |||||
void Desktop::addGlobalMouseListener (MouseListener* const listener) | void Desktop::addGlobalMouseListener (MouseListener* const listener) | ||||
{ | { | ||||
mouseListeners.add (listener); | mouseListeners.add (listener); | ||||
@@ -397,16 +413,6 @@ void Desktop::sendMouseMove() | |||||
} | } | ||||
} | } | ||||
void Desktop::resetTimer() | |||||
{ | |||||
if (mouseListeners.size() == 0) | |||||
stopTimer(); | |||||
else | |||||
startTimer (100); | |||||
lastFakeMouseMove = getMousePosition(); | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) | void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) | ||||
{ | { | ||||
@@ -392,6 +392,7 @@ private: | |||||
void timerCallback(); | void timerCallback(); | ||||
void resetTimer(); | void resetTimer(); | ||||
ListenerList <MouseListener>& getMouseListeners(); | |||||
int getNumDisplayMonitors() const noexcept; | int getNumDisplayMonitors() const noexcept; | ||||
const Rectangle<int> getDisplayMonitorCoordinates (int index, bool clippedToWorkArea) const noexcept; | const Rectangle<int> getDisplayMonitorCoordinates (int index, bool clippedToWorkArea) const noexcept; | ||||
@@ -49,7 +49,7 @@ ModifierKeys& ModifierKeys::operator= (const ModifierKeys& other) noexcept | |||||
ModifierKeys ModifierKeys::currentModifiers; | ModifierKeys ModifierKeys::currentModifiers; | ||||
const ModifierKeys ModifierKeys::getCurrentModifiers() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiers() noexcept | |||||
{ | { | ||||
return currentModifiers; | return currentModifiers; | ||||
} | } | ||||
@@ -128,21 +128,21 @@ public: | |||||
/** Middle mouse button flag. */ | /** Middle mouse button flag. */ | ||||
middleButtonModifier = 64, | middleButtonModifier = 64, | ||||
#if JUCE_MAC | |||||
#if JUCE_MAC | |||||
/** Command key flag - on windows this is the same as the CTRL key flag. */ | /** Command key flag - on windows this is the same as the CTRL key flag. */ | ||||
commandModifier = 8, | commandModifier = 8, | ||||
/** Popup menu flag - on windows this is the same as rightButtonModifier, on the | /** Popup menu flag - on windows this is the same as rightButtonModifier, on the | ||||
Mac it's the same as (rightButtonModifier | ctrlModifier). */ | Mac it's the same as (rightButtonModifier | ctrlModifier). */ | ||||
popupMenuClickModifier = rightButtonModifier | ctrlModifier, | popupMenuClickModifier = rightButtonModifier | ctrlModifier, | ||||
#else | |||||
#else | |||||
/** Command key flag - on windows this is the same as the CTRL key flag. */ | /** Command key flag - on windows this is the same as the CTRL key flag. */ | ||||
commandModifier = ctrlModifier, | commandModifier = ctrlModifier, | ||||
/** Popup menu flag - on windows this is the same as rightButtonModifier, on the | /** Popup menu flag - on windows this is the same as rightButtonModifier, on the | ||||
Mac it's the same as (rightButtonModifier | ctrlModifier). */ | Mac it's the same as (rightButtonModifier | ctrlModifier). */ | ||||
popupMenuClickModifier = rightButtonModifier, | popupMenuClickModifier = rightButtonModifier, | ||||
#endif | |||||
#endif | |||||
/** Represents a combination of all the shift, alt, ctrl and command key modifiers. */ | /** Represents a combination of all the shift, alt, ctrl and command key modifiers. */ | ||||
allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier, | allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier, | ||||
@@ -153,10 +153,10 @@ public: | |||||
//============================================================================== | //============================================================================== | ||||
/** Returns a copy of only the mouse-button flags */ | /** Returns a copy of only the mouse-button flags */ | ||||
const ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } | |||||
ModifierKeys withOnlyMouseButtons() const noexcept { return ModifierKeys (flags & allMouseButtonModifiers); } | |||||
/** Returns a copy of only the non-mouse flags */ | /** Returns a copy of only the non-mouse flags */ | ||||
const ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } | |||||
ModifierKeys withoutMouseButtons() const noexcept { return ModifierKeys (flags & ~allMouseButtonModifiers); } | |||||
bool operator== (const ModifierKeys& other) const noexcept { return flags == other.flags; } | bool operator== (const ModifierKeys& other) const noexcept { return flags == other.flags; } | ||||
bool operator!= (const ModifierKeys& other) const noexcept { return flags != other.flags; } | bool operator!= (const ModifierKeys& other) const noexcept { return flags != other.flags; } | ||||
@@ -180,7 +180,7 @@ public: | |||||
@see getCurrentModifiersRealtime | @see getCurrentModifiersRealtime | ||||
*/ | */ | ||||
static const ModifierKeys getCurrentModifiers() noexcept; | |||||
static ModifierKeys getCurrentModifiers() noexcept; | |||||
/** Creates a ModifierKeys object to represent the current state of the | /** Creates a ModifierKeys object to represent the current state of the | ||||
keyboard and mouse buttons. | keyboard and mouse buttons. | ||||
@@ -196,7 +196,7 @@ public: | |||||
update the value returned by getCurrentModifiers(), which could cause subtle changes | update the value returned by getCurrentModifiers(), which could cause subtle changes | ||||
in the behaviour of some components. | in the behaviour of some components. | ||||
*/ | */ | ||||
static const ModifierKeys getCurrentModifiersRealtime() noexcept; | |||||
static ModifierKeys getCurrentModifiersRealtime() noexcept; | |||||
private: | private: | ||||
@@ -59,7 +59,7 @@ public: | |||||
return static_cast <Component*> (componentUnderMouse); | return static_cast <Component*> (componentUnderMouse); | ||||
} | } | ||||
const ModifierKeys getCurrentModifiers() const | |||||
ModifierKeys getCurrentModifiers() const | |||||
{ | { | ||||
return ModifierKeys::getCurrentModifiers().withoutMouseButtons().withFlags (buttonState.getRawFlags()); | return ModifierKeys::getCurrentModifiers().withoutMouseButtons().withFlags (buttonState.getRawFlags()); | ||||
} | } | ||||
@@ -89,7 +89,7 @@ public: | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
const Point<int> getScreenPosition() const | |||||
Point<int> getScreenPosition() const | |||||
{ | { | ||||
// This needs to return the live position if possible, but it mustn't update the lastScreenPos | // This needs to return the live position if possible, but it mustn't update the lastScreenPos | ||||
// value, because that can cause continuity problems. | // value, because that can cause continuity problems. | ||||
@@ -197,8 +197,12 @@ public: | |||||
if (current != nullptr) | if (current != nullptr) | ||||
{ | { | ||||
WeakReference<Component> safeOldComp (current); | |||||
setButtons (screenPos, time, ModifierKeys()); | setButtons (screenPos, time, ModifierKeys()); | ||||
sendMouseExit (current, screenPos, time); | |||||
if (safeOldComp != nullptr) | |||||
sendMouseExit (current, screenPos, time); | |||||
buttonState = originalButtonState; | buttonState = originalButtonState; | ||||
} | } | ||||
@@ -507,8 +511,8 @@ bool MouseInputSource::canHover() const { return | |||||
bool MouseInputSource::hasMouseWheel() const { return isMouse(); } | bool MouseInputSource::hasMouseWheel() const { return isMouse(); } | ||||
int MouseInputSource::getIndex() const { return pimpl->index; } | int MouseInputSource::getIndex() const { return pimpl->index; } | ||||
bool MouseInputSource::isDragging() const { return pimpl->isDragging(); } | bool MouseInputSource::isDragging() const { return pimpl->isDragging(); } | ||||
const Point<int> MouseInputSource::getScreenPosition() const { return pimpl->getScreenPosition(); } | |||||
const ModifierKeys MouseInputSource::getCurrentModifiers() const { return pimpl->getCurrentModifiers(); } | |||||
Point<int> MouseInputSource::getScreenPosition() const { return pimpl->getScreenPosition(); } | |||||
ModifierKeys MouseInputSource::getCurrentModifiers() const { return pimpl->getCurrentModifiers(); } | |||||
Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } | Component* MouseInputSource::getComponentUnderMouse() const { return pimpl->getComponentUnderMouse(); } | ||||
void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); } | void MouseInputSource::triggerFakeMove() const { pimpl->triggerFakeMove(); } | ||||
int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); } | int MouseInputSource::getNumberOfMultipleClicks() const noexcept { return pimpl->getNumberOfMultipleClicks(); } | ||||
@@ -97,12 +97,12 @@ public: | |||||
bool isDragging() const; | bool isDragging() const; | ||||
/** Returns the last-known screen position of this source. */ | /** Returns the last-known screen position of this source. */ | ||||
const Point<int> getScreenPosition() const; | |||||
Point<int> getScreenPosition() const; | |||||
/** Returns a set of modifiers that indicate which buttons are currently | /** Returns a set of modifiers that indicate which buttons are currently | ||||
held down on this device. | held down on this device. | ||||
*/ | */ | ||||
const ModifierKeys getCurrentModifiers() const; | |||||
ModifierKeys getCurrentModifiers() const; | |||||
/** Returns the component that was last known to be under this pointer. */ | /** Returns the component that was last known to be under this pointer. */ | ||||
Component* getComponentUnderMouse() const; | Component* getComponentUnderMouse() const; | ||||
@@ -180,7 +180,7 @@ private: | |||||
friend class MouseInputSourceInternal; | friend class MouseInputSourceInternal; | ||||
ScopedPointer<MouseInputSourceInternal> pimpl; | ScopedPointer<MouseInputSourceInternal> pimpl; | ||||
static const Point<int> getCurrentMousePosition(); | |||||
static Point<int> getCurrentMousePosition(); | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MouseInputSource); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MouseInputSource); | ||||
}; | }; | ||||
@@ -623,7 +623,7 @@ void GlyphArrangement::stretchRangeOfGlyphs (int startIndex, int num, | |||||
} | } | ||||
} | } | ||||
const Rectangle<float> GlyphArrangement::getBoundingBox (int startIndex, int num, const bool includeWhitespace) const | |||||
Rectangle<float> GlyphArrangement::getBoundingBox (int startIndex, int num, const bool includeWhitespace) const | |||||
{ | { | ||||
jassert (startIndex >= 0); | jassert (startIndex >= 0); | ||||
@@ -67,7 +67,7 @@ public: | |||||
/** Returns the y position of the bottom of the glyph. */ | /** Returns the y position of the bottom of the glyph. */ | ||||
float getBottom() const { return y + font.getDescent(); } | float getBottom() const { return y + font.getDescent(); } | ||||
/** Returns the bounds of the glyph. */ | /** Returns the bounds of the glyph. */ | ||||
const Rectangle<float> getBounds() const { return Rectangle<float> (x, getTop(), w, font.getHeight()); } | |||||
Rectangle<float> getBounds() const { return Rectangle<float> (x, getTop(), w, font.getHeight()); } | |||||
//============================================================================== | //============================================================================== | ||||
/** Shifts the glyph's position by a relative amount. */ | /** Shifts the glyph's position by a relative amount. */ | ||||
@@ -255,7 +255,7 @@ public: | |||||
@param includeWhitespace if true, the extent of any whitespace characters will also | @param includeWhitespace if true, the extent of any whitespace characters will also | ||||
be taken into account | be taken into account | ||||
*/ | */ | ||||
const Rectangle<float> getBoundingBox (int startIndex, int numGlyphs, bool includeWhitespace) const; | |||||
Rectangle<float> getBoundingBox (int startIndex, int numGlyphs, bool includeWhitespace) const; | |||||
/** Shifts a set of glyphs by a given amount. | /** Shifts a set of glyphs by a given amount. | ||||
@@ -620,12 +620,12 @@ public: | |||||
This is only relevent for floating-point rectangles, of course. | This is only relevent for floating-point rectangles, of course. | ||||
@see toFloat() | @see toFloat() | ||||
*/ | */ | ||||
const Rectangle<int> getSmallestIntegerContainer() const noexcept | |||||
Rectangle<int> getSmallestIntegerContainer() const noexcept | |||||
{ | { | ||||
const int x1 = (int) std::floor (static_cast<float> (x)); | const int x1 = (int) std::floor (static_cast<float> (x)); | ||||
const int y1 = (int) std::floor (static_cast<float> (y)); | const int y1 = (int) std::floor (static_cast<float> (y)); | ||||
const int x2 = (int) std::ceil (static_cast<float> (x + w)); | |||||
const int y2 = (int) std::ceil (static_cast<float> (y + h)); | |||||
const int x2 = (int) std::ceil (static_cast<float> (x + w)); | |||||
const int y2 = (int) std::ceil (static_cast<float> (y + h)); | |||||
return Rectangle<int> (x1, y1, x2 - x1, y2 - y1); | return Rectangle<int> (x1, y1, x2 - x1, y2 - y1); | ||||
} | } | ||||
@@ -656,7 +656,7 @@ public: | |||||
Obviously this is mainly useful for rectangles that use integer types. | Obviously this is mainly useful for rectangles that use integer types. | ||||
@see getSmallestIntegerContainer | @see getSmallestIntegerContainer | ||||
*/ | */ | ||||
const Rectangle<float> toFloat() const noexcept | |||||
Rectangle<float> toFloat() const noexcept | |||||
{ | { | ||||
return Rectangle<float> (static_cast<float> (x), static_cast<float> (y), | return Rectangle<float> (static_cast<float> (x), static_cast<float> (y), | ||||
static_cast<float> (w), static_cast<float> (h)); | static_cast<float> (w), static_cast<float> (h)); | ||||
@@ -578,7 +578,7 @@ void Desktop::createMouseInputSources() | |||||
mouseSources.add (new MouseInputSource (i, false)); | mouseSources.add (new MouseInputSource (i, false)); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
return AndroidComponentPeer::lastMousePos; | return AndroidComponentPeer::lastMousePos; | ||||
} | } | ||||
@@ -600,7 +600,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = AndroidComponentPeer::currentModifiers; | currentModifiers = AndroidComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return AndroidComponentPeer::currentModifiers; | return AndroidComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -2616,7 +2616,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = LinuxComponentPeer::currentModifiers; | currentModifiers = LinuxComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
Window root, child; | Window root, child; | ||||
int x, y, winx, winy; | int x, y, winx, winy; | ||||
@@ -2798,7 +2798,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
&& (matchedDepth == desiredDepth); | && (matchedDepth == desiredDepth); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
Window root, child; | Window root, child; | ||||
int x, y, winx, winy; | int x, y, winx, winy; | ||||
@@ -286,7 +286,7 @@ bool KeyPress::isKeyCurrentlyDown (const int keyCode) | |||||
ModifierKeys UIViewComponentPeer::currentModifiers; | ModifierKeys UIViewComponentPeer::currentModifiers; | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return UIViewComponentPeer::currentModifiers; | return UIViewComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -228,7 +228,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
return true; | return true; | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
return juce_lastMousePos; | return juce_lastMousePos; | ||||
} | } | ||||
@@ -32,13 +32,13 @@ | |||||
namespace | namespace | ||||
{ | { | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<int> convertToRectInt (const RectType& r) | |||||
Rectangle<int> convertToRectInt (const RectType& r) | |||||
{ | { | ||||
return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | return Rectangle<int> ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); | ||||
} | } | ||||
template <class RectType> | template <class RectType> | ||||
const Rectangle<float> convertToRectFloat (const RectType& r) | |||||
Rectangle<float> convertToRectFloat (const RectType& r) | |||||
{ | { | ||||
return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | return Rectangle<float> (r.origin.x, r.origin.y, r.size.width, r.size.height); | ||||
} | } | ||||
@@ -105,7 +105,7 @@ public: | |||||
componentPeerChanged(); | componentPeerChanged(); | ||||
} | } | ||||
const Rectangle<int> getViewBounds() const | |||||
Rectangle<int> getViewBounds() const | |||||
{ | { | ||||
NSRect r = [view frame]; | NSRect r = [view frame]; | ||||
return Rectangle<int> (0, 0, (int) r.size.width, (int) r.size.height); | return Rectangle<int> (0, 0, (int) r.size.width, (int) r.size.height); | ||||
@@ -905,7 +905,7 @@ void NSViewComponentPeer::updateKeysDown (NSEvent* ev, bool isKeyDown) | |||||
} | } | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
return NSViewComponentPeer::currentModifiers; | return NSViewComponentPeer::currentModifiers; | ||||
} | } | ||||
@@ -217,7 +217,7 @@ bool Desktop::canUseSemiTransparentWindows() noexcept | |||||
return true; | return true; | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
JUCE_AUTORELEASEPOOL | JUCE_AUTORELEASEPOOL | ||||
const NSPoint p ([NSEvent mouseLocation]); | const NSPoint p ([NSEvent mouseLocation]); | ||||
@@ -2575,7 +2575,7 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
currentModifiers = Win32ComponentPeer::currentModifiers; | currentModifiers = Win32ComponentPeer::currentModifiers; | ||||
} | } | ||||
const ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
ModifierKeys ModifierKeys::getCurrentModifiersRealtime() noexcept | |||||
{ | { | ||||
Win32ComponentPeer::updateKeyModifiers(); | Win32ComponentPeer::updateKeyModifiers(); | ||||
@@ -2785,7 +2785,7 @@ void Desktop::createMouseInputSources() | |||||
mouseSources.add (new MouseInputSource (0, true)); | mouseSources.add (new MouseInputSource (0, true)); | ||||
} | } | ||||
const Point<int> MouseInputSource::getCurrentMousePosition() | |||||
Point<int> MouseInputSource::getCurrentMousePosition() | |||||
{ | { | ||||
POINT mousePos; | POINT mousePos; | ||||
GetCursorPos (&mousePos); | GetCursorPos (&mousePos); | ||||