diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 57e8305d80..68f9d71cac 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -38425,45 +38425,6 @@ static Array modalReturnValues; static const int customCommandMessage = 0x7fff0001; static const int exitModalStateMessage = 0x7fff0002; -// these are also used by ComponentPeer -int64 juce_recentMouseDownTimes [4] = { 0, 0, 0, 0 }; -int juce_recentMouseDownX [4] = { 0, 0, 0, 0 }; -int juce_recentMouseDownY [4] = { 0, 0, 0, 0 }; -Component* juce_recentMouseDownComponent [4] = { 0, 0, 0, 0 }; -int juce_LastMousePosX = 0; -int juce_LastMousePosY = 0; -int juce_MouseClickCounter = 0; -bool juce_MouseHasMovedSignificantlySincePressed = false; - -static int countMouseClicks() throw() -{ - int numClicks = 0; - - if (juce_recentMouseDownTimes[0] != 0) - { - if (! juce_MouseHasMovedSignificantlySincePressed) - ++numClicks; - - for (int i = 1; i < numElementsInArray (juce_recentMouseDownTimes); ++i) - { - if (juce_recentMouseDownTimes[0] - juce_recentMouseDownTimes [i] - < (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1))) - && abs (juce_recentMouseDownX[0] - juce_recentMouseDownX[i]) < 8 - && abs (juce_recentMouseDownY[0] - juce_recentMouseDownY[i]) < 8 - && juce_recentMouseDownComponent[0] == juce_recentMouseDownComponent [i]) - { - ++numClicks; - } - else - { - break; - } - } - } - - return numClicks; -} - static int unboundedMouseOffsetX = 0; static int unboundedMouseOffsetY = 0; static bool isUnboundedMouseModeOn = false; @@ -40616,75 +40577,72 @@ void Component::internalMouseEnter (int x, int y, int64 time) return; } - if (! flags.mouseInsideFlag) + if (isValidComponent() && ! flags.mouseInsideFlag) { flags.mouseInsideFlag = true; flags.mouseOverFlag = true; flags.draggingFlag = false; - if (isValidComponent()) - { - const ComponentDeletionWatcher deletionChecker (this); + const ComponentDeletionWatcher deletionChecker (this); - if (flags.repaintOnMouseActivityFlag) - repaint(); + if (flags.repaintOnMouseActivityFlag) + repaint(); - const MouseEvent me (x, y, - ModifierKeys::getCurrentModifiers(), - this, - Time (time), - x, y, - Time (time), - 0, false); + const MouseEvent me (x, y, + ModifierKeys::getCurrentModifiers(), + this, + Time (time), + x, y, + Time (time), + 0, false); - mouseEnter (me); + mouseEnter (me); + + if (deletionChecker.hasBeenDeleted()) + return; + + Desktop::getInstance().resetTimer(); + + for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + { + ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + i = jmin (i, Desktop::getInstance().mouseListeners.size()); + } - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + if (mouseListeners_ != 0) + { + for (int i = mouseListeners_->size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me); + ((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, mouseListeners_->size()); } + } - if (mouseListeners_ != 0) - { - for (int i = mouseListeners_->size(); --i >= 0;) - { - ((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me); - - if (deletionChecker.hasBeenDeleted()) - return; - - i = jmin (i, mouseListeners_->size()); - } - } + const Component* p = parentComponent_; - const Component* p = parentComponent_; + while (p != 0) + { + const ComponentDeletionWatcher parentDeletionChecker (p); - while (p != 0) + for (int i = p->numDeepMouseListeners; --i >= 0;) { - const ComponentDeletionWatcher parentDeletionChecker (p); - - for (int i = p->numDeepMouseListeners; --i >= 0;) - { - ((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me); - - if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted()) - return; + ((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me); - i = jmin (i, p->numDeepMouseListeners); - } + if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted()) + return; - p = p->parentComponent_; + i = jmin (i, p->numDeepMouseListeners); } + + p = p->parentComponent_; } } @@ -40776,11 +40734,8 @@ void Component::internalMouseExit (int x, int y, int64 time) class InternalDragRepeater : public Timer { public: - InternalDragRepeater() - {} - - ~InternalDragRepeater() - {} + InternalDragRepeater() {} + ~InternalDragRepeater() {} void timerCallback() { @@ -40801,6 +40756,10 @@ public: } juce_UseDebuggingNewOperator + +private: + InternalDragRepeater (const InternalDragRepeater&); + InternalDragRepeater& operator= (const InternalDragRepeater&); }; static InternalDragRepeater* dragRepeater = 0; @@ -40821,8 +40780,14 @@ void Component::beginDragAutoRepeat (const int interval) } } -void Component::internalMouseDown (const int x, const int y) +void Component::internalMouseDown (const int x, const int y, const int64 time) { + Desktop& desktop = Desktop::getInstance(); + + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDown (gx, gy, time, this); + const ComponentDeletionWatcher deletionChecker (this); if (isCurrentlyBlockedByAnotherModalComponent()) @@ -40840,22 +40805,22 @@ void Component::internalMouseDown (const int x, const int y) const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, - Time (juce_recentMouseDownTimes[0]), + Time (time), x, y, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), + desktop.getLastMouseDownTime(), + desktop.getNumberOfMultipleClicks(), false); - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } return; @@ -40893,26 +40858,26 @@ void Component::internalMouseDown (const int x, const int y) const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, - Time (juce_recentMouseDownTimes[0]), + desktop.getLastMouseDownTime(), x, y, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), + desktop.getLastMouseDownTime(), + desktop.getNumberOfMultipleClicks(), false); mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -40953,49 +40918,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int { if (isValidComponent() && flags.draggingFlag) { + Desktop& desktop = Desktop::getInstance(); + flags.draggingFlag = false; deleteAndZero (dragRepeater); x += unboundedMouseOffsetX; y += unboundedMouseOffsetY; - juce_LastMousePosX = x; - juce_LastMousePosY = y; - relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY); + + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDrag (gx, gy); const ComponentDeletionWatcher deletionChecker (this); if (flags.repaintOnMouseActivityFlag) repaint(); - int mdx = juce_recentMouseDownX[0]; - int mdy = juce_recentMouseDownY[0]; + int mdx, mdy; + Desktop::getLastMouseDownPosition (mdx, mdy); globalPositionToRelative (mdx, mdy); + const Time lastMouseDownTime (desktop.getLastMouseDownTime()); + const MouseEvent me (x, y, oldModifiers, this, Time (time), mdx, mdy, - Time (juce_recentMouseDownTimes [0]), - countMouseClicks(), - juce_MouseHasMovedSignificantlySincePressed - || juce_recentMouseDownTimes[0] + 300 < time); + lastMouseDownTime, + desktop.getNumberOfMultipleClicks(), + desktop.mouseMovedSignificantlySincePressed + || time > lastMouseDownTime.toMilliseconds() + 300); mouseUp (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseUp (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseUp (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -41040,14 +41010,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int mouseDoubleClick (me); int i; - for (i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDoubleClick (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDoubleClick (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } for (i = numListeners; --i >= 0;) @@ -41091,50 +41061,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time) { if (isValidComponent() && flags.draggingFlag) { + Desktop& desktop = Desktop::getInstance(); + flags.mouseOverFlag = reallyContains (x, y, false); x += unboundedMouseOffsetX; y += unboundedMouseOffsetY; - juce_LastMousePosX = x; - juce_LastMousePosY = y; - relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY); - juce_MouseHasMovedSignificantlySincePressed - = juce_MouseHasMovedSignificantlySincePressed - || abs (juce_recentMouseDownX[0] - juce_LastMousePosX) >= 4 - || abs (juce_recentMouseDownY[0] - juce_LastMousePosY) >= 4; + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDrag (gx, gy); const ComponentDeletionWatcher deletionChecker (this); - int mdx = juce_recentMouseDownX[0]; - int mdy = juce_recentMouseDownY[0]; + int mdx, mdy; + Desktop::getLastMouseDownPosition (mdx, mdy); globalPositionToRelative (mdx, mdy); + const Time lastMouseDownTime (desktop.getLastMouseDownTime()); + const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, Time (time), mdx, mdy, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), - juce_MouseHasMovedSignificantlySincePressed - || juce_recentMouseDownTimes[0] + 300 < time); + lastMouseDownTime, + desktop.getNumberOfMultipleClicks(), + desktop.mouseMovedSignificantlySincePressed + || time > lastMouseDownTime.toMilliseconds() + 300); mouseDrag (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDrag (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDrag (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -41219,6 +41189,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (isValidComponent()) { + Desktop& desktop = Desktop::getInstance(); + const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, @@ -41230,7 +41202,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (isCurrentlyBlockedByAnotherModalComponent()) { // allow blocked mouse-events to go to global listeners.. - Desktop::getInstance().sendMouseMove(); + desktop.sendMouseMove(); } else { @@ -41244,16 +41216,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseMove (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseMove (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -41293,6 +41265,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time) { + Desktop& desktop = Desktop::getInstance(); const ComponentDeletionWatcher deletionChecker (this); const float wheelIncrementX = intAmountX * (1.0f / 256.0f); @@ -41312,14 +41285,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, if (isCurrentlyBlockedByAnotherModalComponent()) { // allow blocked mouse-events to go to global listeners.. - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); + ((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } } else @@ -41329,14 +41302,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, if (deletionChecker.hasBeenDeleted()) return; - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); + ((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -41921,16 +41894,16 @@ END_JUCE_NAMESPACE BEGIN_JUCE_NAMESPACE -extern void juce_updateMultiMonitorInfo (Array & monitorCoords, - const bool clipToWorkArea); - static Desktop* juce_desktopInstance = 0; Desktop::Desktop() throw() - : lastMouseX (0), - lastMouseY (0), + : lastFakeMouseMoveX (0), + lastFakeMouseMoveY (0), + mouseClickCounter (0), + mouseMovedSignificantlySincePressed (false), kioskModeComponent (0) { + zerostruct (mouseDowns); refreshMonitorSizes(); } @@ -41952,6 +41925,9 @@ Desktop& JUCE_CALLTYPE Desktop::getInstance() throw() return *juce_desktopInstance; } +extern void juce_updateMultiMonitorInfo (Array & monitorCoords, + const bool clipToWorkArea); + void Desktop::refreshMonitorSizes() throw() { const Array oldClipped (monitorCoordsClipped); @@ -42089,20 +42065,75 @@ void Desktop::componentBroughtToFront (Component* const c) throw() } } -// from Component.cpp -extern int juce_recentMouseDownX [4]; -extern int juce_recentMouseDownY [4]; -extern int juce_MouseClickCounter; - void Desktop::getLastMouseDownPosition (int& x, int& y) throw() { - x = juce_recentMouseDownX [0]; - y = juce_recentMouseDownY [0]; + const Desktop& d = getInstance(); + x = d.mouseDowns[0].x; + y = d.mouseDowns[0].y; } int Desktop::getMouseButtonClickCounter() throw() { - return juce_MouseClickCounter; + return getInstance().mouseClickCounter; +} + +void Desktop::incrementMouseClickCounter() throw() +{ + ++mouseClickCounter; +} + +const Time Desktop::getLastMouseDownTime() const throw() +{ + return Time (mouseDowns[0].time); +} + +void Desktop::registerMouseDown (int x, int y, int64 time, Component* component) throw() +{ + for (int i = numElementsInArray (mouseDowns); --i > 0;) + mouseDowns[i] = mouseDowns[i - 1]; + + mouseDowns[0].x = x; + mouseDowns[0].y = y; + mouseDowns[0].time = time; + mouseDowns[0].component = component; + mouseMovedSignificantlySincePressed = false; +} + +void Desktop::registerMouseDrag (int x, int y) throw() +{ + mouseMovedSignificantlySincePressed + = mouseMovedSignificantlySincePressed + || abs (mouseDowns[0].x - x) >= 4 + || abs (mouseDowns[0].y - y) >= 4; +} + +int Desktop::getNumberOfMultipleClicks() const throw() +{ + int numClicks = 0; + + if (mouseDowns[0].time != 0) + { + if (! mouseMovedSignificantlySincePressed) + ++numClicks; + + for (int i = 1; i < numElementsInArray (mouseDowns); ++i) + { + if (mouseDowns[0].time - mouseDowns[i].time + < (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1))) + && abs (mouseDowns[0].x - mouseDowns[i].x) < 8 + && abs (mouseDowns[0].y - mouseDowns[i].y) < 8 + && mouseDowns[0].component == mouseDowns[i].component) + { + ++numClicks; + } + else + { + break; + } + } + } + + return numClicks; } void Desktop::addGlobalMouseListener (MouseListener* const listener) throw() @@ -42154,7 +42185,7 @@ void Desktop::timerCallback() int x, y; getMousePosition (x, y); - if (lastMouseX != x || lastMouseY != y) + if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y) sendMouseMove(); } @@ -42166,8 +42197,8 @@ void Desktop::sendMouseMove() int x, y; getMousePosition (x, y); - lastMouseX = x; - lastMouseY = y; + lastFakeMouseMoveX = x; + lastFakeMouseMoveY = y; Component* const target = findComponentAt (x, y); @@ -42208,7 +42239,7 @@ void Desktop::resetTimer() throw() else startTimer (100); - getMousePosition (lastMouseX, lastMouseY); + getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY); } extern void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool allowMenusAndBars); @@ -60346,6 +60377,17 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw() return ModifierKeys (currentModifierFlags); } +int ModifierKeys::getNumMouseButtonsDown() const throw() +{ + int num = 0; + + if (isLeftButtonDown()) ++num; + if (isRightButtonDown()) ++num; + if (isMiddleButtonDown()) ++num; + + return num; +} + END_JUCE_NAMESPACE /********* End of inlined file: juce_ModifierKeys.cpp *********/ @@ -76101,18 +76143,7 @@ BEGIN_JUCE_NAMESPACE //#define JUCE_ENABLE_REPAINT_DEBUGGING 1 -// these are over in juce_component.cpp -extern int64 juce_recentMouseDownTimes[4]; -extern int juce_recentMouseDownX [4]; -extern int juce_recentMouseDownY [4]; -extern Component* juce_recentMouseDownComponent [4]; -extern int juce_LastMousePosX; -extern int juce_LastMousePosY; -extern int juce_MouseClickCounter; -extern bool juce_MouseHasMovedSignificantlySincePressed; - static const int fakeMouseMoveMessage = 0x7fff00ff; - static VoidArray heavyweightPeers; ComponentPeer::ComponentPeer (Component* const component_, @@ -76255,46 +76286,17 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time) void ComponentPeer::handleMouseDown (int x, int y, const int64 time) { - ++juce_MouseClickCounter; - + Desktop::getInstance().incrementMouseClickCounter(); updateCurrentModifiers(); - int numMouseButtonsDown = 0; - - if (ModifierKeys::getCurrentModifiers().isLeftButtonDown()) - ++numMouseButtonsDown; - - if (ModifierKeys::getCurrentModifiers().isRightButtonDown()) - ++numMouseButtonsDown; - - if (ModifierKeys::getCurrentModifiers().isMiddleButtonDown()) - ++numMouseButtonsDown; - - if (numMouseButtonsDown == 1) + if (ModifierKeys::getCurrentModifiers().getNumMouseButtonsDown() == 1) { Component::componentUnderMouse = component->getComponentAt (x, y); if (Component::componentUnderMouse != 0) { - // can't set these in the mouseDownInt() method, because it's re-entrant, so do it here.. - - for (int i = numElementsInArray (juce_recentMouseDownTimes); --i > 0;) - { - juce_recentMouseDownTimes [i] = juce_recentMouseDownTimes [i - 1]; - juce_recentMouseDownX [i] = juce_recentMouseDownX [i - 1]; - juce_recentMouseDownY [i] = juce_recentMouseDownY [i - 1]; - juce_recentMouseDownComponent [i] = juce_recentMouseDownComponent [i - 1]; - } - - juce_recentMouseDownTimes[0] = time; - juce_recentMouseDownX[0] = x; - juce_recentMouseDownY[0] = y; - juce_recentMouseDownComponent[0] = Component::componentUnderMouse; - relativePositionToGlobal (juce_recentMouseDownX[0], juce_recentMouseDownY[0]); - juce_MouseHasMovedSignificantlySincePressed = false; - component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); - Component::componentUnderMouse->internalMouseDown (x, y); + Component::componentUnderMouse->internalMouseDown (x, y, time); } } } @@ -76306,7 +76308,6 @@ void ComponentPeer::handleMouseDrag (int x, int y, const int64 time) if (Component::componentUnderMouse != 0) { component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); - Component::componentUnderMouse->internalMouseDrag (x, y, time); } } @@ -76315,18 +76316,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i { updateCurrentModifiers(); - int numMouseButtonsDown = 0; - - if ((oldModifiers & ModifierKeys::leftButtonModifier) != 0) - ++numMouseButtonsDown; - - if ((oldModifiers & ModifierKeys::rightButtonModifier) != 0) - ++numMouseButtonsDown; - - if ((oldModifiers & ModifierKeys::middleButtonModifier) != 0) - ++numMouseButtonsDown; - - if (numMouseButtonsDown == 1) + if (ModifierKeys (oldModifiers).getNumMouseButtonsDown() == 1) { const ComponentDeletionWatcher deletionChecker (component); Component* c = component->getComponentAt (x, y); diff --git a/juce_amalgamated.h b/juce_amalgamated.h index d4149d04c2..7a03a2d5df 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -17,7 +17,7 @@ #define __JUCE_STANDARDHEADER_JUCEHEADER__ #define JUCE_MAJOR_VERSION 1 -#define JUCE_MINOR_VERSION 50 +#define JUCE_MINOR_VERSION 51 #define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8)) @@ -8951,6 +8951,8 @@ public: inline bool testFlags (const int flagsToTest) const throw() { return (flags & flagsToTest) != 0; } + int getNumMouseButtonsDown() const throw(); + static const ModifierKeys getCurrentModifiers() throw(); static const ModifierKeys getCurrentModifiersRealtime() throw(); @@ -12215,7 +12217,7 @@ private: void internalMouseEnter (int x, int y, const int64 time); void internalMouseExit (int x, int y, const int64 time); - void internalMouseDown (int x, int y); + void internalMouseDown (int x, int y, const int64 time); void internalMouseUp (const int oldModifiers, int x, int y, const int64 time); void internalMouseDrag (int x, int y, const int64 time); void internalMouseMove (int x, int y, const int64 time); @@ -12683,7 +12685,24 @@ private: ~Desktop() throw(); Array monitorCoordsClipped, monitorCoordsUnclipped; - int lastMouseX, lastMouseY; + + int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter; + bool mouseMovedSignificantlySincePressed; + + struct RecentMouseDown + { + int x, y; + int64 time; + Component* component; + }; + + RecentMouseDown mouseDowns[4]; + + void incrementMouseClickCounter() throw(); + void registerMouseDown (int x, int y, int64 time, Component* component) throw(); + void registerMouseDrag (int x, int y) throw(); + const Time getLastMouseDownTime() const throw(); + int getNumberOfMultipleClicks() const throw(); Component* kioskModeComponent; Rectangle kioskComponentOriginalBounds; diff --git a/src/core/juce_StandardHeader.h b/src/core/juce_StandardHeader.h index 9a0854511a..e639e55d10 100644 --- a/src/core/juce_StandardHeader.h +++ b/src/core/juce_StandardHeader.h @@ -32,7 +32,7 @@ See also SystemStats::getJUCEVersion() for a string version. */ #define JUCE_MAJOR_VERSION 1 -#define JUCE_MINOR_VERSION 50 +#define JUCE_MINOR_VERSION 51 /** Current Juce version number. diff --git a/src/gui/components/juce_Component.cpp b/src/gui/components/juce_Component.cpp index c11d3cfccb..2d7afefab0 100644 --- a/src/gui/components/juce_Component.cpp +++ b/src/gui/components/juce_Component.cpp @@ -53,45 +53,6 @@ static const int customCommandMessage = 0x7fff0001; static const int exitModalStateMessage = 0x7fff0002; //============================================================================== -// these are also used by ComponentPeer -int64 juce_recentMouseDownTimes [4] = { 0, 0, 0, 0 }; -int juce_recentMouseDownX [4] = { 0, 0, 0, 0 }; -int juce_recentMouseDownY [4] = { 0, 0, 0, 0 }; -Component* juce_recentMouseDownComponent [4] = { 0, 0, 0, 0 }; -int juce_LastMousePosX = 0; -int juce_LastMousePosY = 0; -int juce_MouseClickCounter = 0; -bool juce_MouseHasMovedSignificantlySincePressed = false; - -static int countMouseClicks() throw() -{ - int numClicks = 0; - - if (juce_recentMouseDownTimes[0] != 0) - { - if (! juce_MouseHasMovedSignificantlySincePressed) - ++numClicks; - - for (int i = 1; i < numElementsInArray (juce_recentMouseDownTimes); ++i) - { - if (juce_recentMouseDownTimes[0] - juce_recentMouseDownTimes [i] - < (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1))) - && abs (juce_recentMouseDownX[0] - juce_recentMouseDownX[i]) < 8 - && abs (juce_recentMouseDownY[0] - juce_recentMouseDownY[i]) < 8 - && juce_recentMouseDownComponent[0] == juce_recentMouseDownComponent [i]) - { - ++numClicks; - } - else - { - break; - } - } - } - - return numClicks; -} - static int unboundedMouseOffsetX = 0; static int unboundedMouseOffsetY = 0; static bool isUnboundedMouseModeOn = false; @@ -2281,75 +2242,72 @@ void Component::internalMouseEnter (int x, int y, int64 time) return; } - if (! flags.mouseInsideFlag) + if (isValidComponent() && ! flags.mouseInsideFlag) { flags.mouseInsideFlag = true; flags.mouseOverFlag = true; flags.draggingFlag = false; - if (isValidComponent()) - { - const ComponentDeletionWatcher deletionChecker (this); + const ComponentDeletionWatcher deletionChecker (this); - if (flags.repaintOnMouseActivityFlag) - repaint(); + if (flags.repaintOnMouseActivityFlag) + repaint(); - const MouseEvent me (x, y, - ModifierKeys::getCurrentModifiers(), - this, - Time (time), - x, y, - Time (time), - 0, false); + const MouseEvent me (x, y, + ModifierKeys::getCurrentModifiers(), + this, + Time (time), + x, y, + Time (time), + 0, false); - mouseEnter (me); + mouseEnter (me); + + if (deletionChecker.hasBeenDeleted()) + return; + + Desktop::getInstance().resetTimer(); + + for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + { + ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + i = jmin (i, Desktop::getInstance().mouseListeners.size()); + } - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + if (mouseListeners_ != 0) + { + for (int i = mouseListeners_->size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me); + ((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, mouseListeners_->size()); } + } - if (mouseListeners_ != 0) - { - for (int i = mouseListeners_->size(); --i >= 0;) - { - ((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me); - - if (deletionChecker.hasBeenDeleted()) - return; - - i = jmin (i, mouseListeners_->size()); - } - } + const Component* p = parentComponent_; - const Component* p = parentComponent_; + while (p != 0) + { + const ComponentDeletionWatcher parentDeletionChecker (p); - while (p != 0) + for (int i = p->numDeepMouseListeners; --i >= 0;) { - const ComponentDeletionWatcher parentDeletionChecker (p); + ((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me); - for (int i = p->numDeepMouseListeners; --i >= 0;) - { - ((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me); - - if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted()) - return; - - i = jmin (i, p->numDeepMouseListeners); - } + if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted()) + return; - p = p->parentComponent_; + i = jmin (i, p->numDeepMouseListeners); } + + p = p->parentComponent_; } } @@ -2442,11 +2400,8 @@ void Component::internalMouseExit (int x, int y, int64 time) class InternalDragRepeater : public Timer { public: - InternalDragRepeater() - {} - - ~InternalDragRepeater() - {} + InternalDragRepeater() {} + ~InternalDragRepeater() {} void timerCallback() { @@ -2467,6 +2422,10 @@ public: } juce_UseDebuggingNewOperator + +private: + InternalDragRepeater (const InternalDragRepeater&); + InternalDragRepeater& operator= (const InternalDragRepeater&); }; static InternalDragRepeater* dragRepeater = 0; @@ -2488,8 +2447,14 @@ void Component::beginDragAutoRepeat (const int interval) } //============================================================================== -void Component::internalMouseDown (const int x, const int y) +void Component::internalMouseDown (const int x, const int y, const int64 time) { + Desktop& desktop = Desktop::getInstance(); + + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDown (gx, gy, time, this); + const ComponentDeletionWatcher deletionChecker (this); if (isCurrentlyBlockedByAnotherModalComponent()) @@ -2507,22 +2472,22 @@ void Component::internalMouseDown (const int x, const int y) const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, - Time (juce_recentMouseDownTimes[0]), + Time (time), x, y, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), + desktop.getLastMouseDownTime(), + desktop.getNumberOfMultipleClicks(), false); - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } return; @@ -2560,26 +2525,26 @@ void Component::internalMouseDown (const int x, const int y) const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, - Time (juce_recentMouseDownTimes[0]), + desktop.getLastMouseDownTime(), x, y, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), + desktop.getLastMouseDownTime(), + desktop.getNumberOfMultipleClicks(), false); mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDown (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -2621,49 +2586,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int { if (isValidComponent() && flags.draggingFlag) { + Desktop& desktop = Desktop::getInstance(); + flags.draggingFlag = false; deleteAndZero (dragRepeater); x += unboundedMouseOffsetX; y += unboundedMouseOffsetY; - juce_LastMousePosX = x; - juce_LastMousePosY = y; - relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY); + + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDrag (gx, gy); const ComponentDeletionWatcher deletionChecker (this); if (flags.repaintOnMouseActivityFlag) repaint(); - int mdx = juce_recentMouseDownX[0]; - int mdy = juce_recentMouseDownY[0]; + int mdx, mdy; + Desktop::getLastMouseDownPosition (mdx, mdy); globalPositionToRelative (mdx, mdy); + const Time lastMouseDownTime (desktop.getLastMouseDownTime()); + const MouseEvent me (x, y, oldModifiers, this, Time (time), mdx, mdy, - Time (juce_recentMouseDownTimes [0]), - countMouseClicks(), - juce_MouseHasMovedSignificantlySincePressed - || juce_recentMouseDownTimes[0] + 300 < time); + lastMouseDownTime, + desktop.getNumberOfMultipleClicks(), + desktop.mouseMovedSignificantlySincePressed + || time > lastMouseDownTime.toMilliseconds() + 300); mouseUp (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseUp (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseUp (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -2708,14 +2678,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int mouseDoubleClick (me); int i; - for (i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDoubleClick (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDoubleClick (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } for (i = numListeners; --i >= 0;) @@ -2759,50 +2729,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time) { if (isValidComponent() && flags.draggingFlag) { + Desktop& desktop = Desktop::getInstance(); + flags.mouseOverFlag = reallyContains (x, y, false); x += unboundedMouseOffsetX; y += unboundedMouseOffsetY; - juce_LastMousePosX = x; - juce_LastMousePosY = y; - relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY); - - juce_MouseHasMovedSignificantlySincePressed - = juce_MouseHasMovedSignificantlySincePressed - || abs (juce_recentMouseDownX[0] - juce_LastMousePosX) >= 4 - || abs (juce_recentMouseDownY[0] - juce_LastMousePosY) >= 4; - + + int gx = x, gy = y; + relativePositionToGlobal (gx, gy); + desktop.registerMouseDrag (gx, gy); + const ComponentDeletionWatcher deletionChecker (this); - int mdx = juce_recentMouseDownX[0]; - int mdy = juce_recentMouseDownY[0]; + int mdx, mdy; + Desktop::getLastMouseDownPosition (mdx, mdy); globalPositionToRelative (mdx, mdy); + const Time lastMouseDownTime (desktop.getLastMouseDownTime()); + const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, Time (time), mdx, mdy, - Time (juce_recentMouseDownTimes[0]), - countMouseClicks(), - juce_MouseHasMovedSignificantlySincePressed - || juce_recentMouseDownTimes[0] + 300 < time); + lastMouseDownTime, + desktop.getNumberOfMultipleClicks(), + desktop.mouseMovedSignificantlySincePressed + || time > lastMouseDownTime.toMilliseconds() + 300); mouseDrag (me); if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDrag (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseDrag (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -2887,6 +2857,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (isValidComponent()) { + Desktop& desktop = Desktop::getInstance(); + const MouseEvent me (x, y, ModifierKeys::getCurrentModifiers(), this, @@ -2898,7 +2870,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (isCurrentlyBlockedByAnotherModalComponent()) { // allow blocked mouse-events to go to global listeners.. - Desktop::getInstance().sendMouseMove(); + desktop.sendMouseMove(); } else { @@ -2912,16 +2884,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) if (deletionChecker.hasBeenDeleted()) return; - Desktop::getInstance().resetTimer(); + desktop.resetTimer(); - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseMove (me); + ((MouseListener*) desktop.mouseListeners[i])->mouseMove (me); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) @@ -2961,6 +2933,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time) { + Desktop& desktop = Desktop::getInstance(); const ComponentDeletionWatcher deletionChecker (this); const float wheelIncrementX = intAmountX * (1.0f / 256.0f); @@ -2980,14 +2953,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, if (isCurrentlyBlockedByAnotherModalComponent()) { // allow blocked mouse-events to go to global listeners.. - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); + ((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } } else @@ -2997,14 +2970,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, if (deletionChecker.hasBeenDeleted()) return; - for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;) + for (int i = desktop.mouseListeners.size(); --i >= 0;) { - ((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); + ((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY); if (deletionChecker.hasBeenDeleted()) return; - i = jmin (i, Desktop::getInstance().mouseListeners.size()); + i = jmin (i, desktop.mouseListeners.size()); } if (mouseListeners_ != 0) diff --git a/src/gui/components/juce_Component.h b/src/gui/components/juce_Component.h index 37a9e055f8..848b49a1a0 100644 --- a/src/gui/components/juce_Component.h +++ b/src/gui/components/juce_Component.h @@ -1953,7 +1953,7 @@ private: //============================================================================== void internalMouseEnter (int x, int y, const int64 time); void internalMouseExit (int x, int y, const int64 time); - void internalMouseDown (int x, int y); + void internalMouseDown (int x, int y, const int64 time); void internalMouseUp (const int oldModifiers, int x, int y, const int64 time); void internalMouseDrag (int x, int y, const int64 time); void internalMouseMove (int x, int y, const int64 time); diff --git a/src/gui/components/juce_Desktop.cpp b/src/gui/components/juce_Desktop.cpp index 43e1983c72..fbb74253c9 100644 --- a/src/gui/components/juce_Desktop.cpp +++ b/src/gui/components/juce_Desktop.cpp @@ -32,18 +32,17 @@ BEGIN_JUCE_NAMESPACE #include "juce_ComponentDeletionWatcher.h" #include "../graphics/geometry/juce_RectangleList.h" -extern void juce_updateMultiMonitorInfo (Array & monitorCoords, - const bool clipToWorkArea); - - //============================================================================== static Desktop* juce_desktopInstance = 0; Desktop::Desktop() throw() - : lastMouseX (0), - lastMouseY (0), + : lastFakeMouseMoveX (0), + lastFakeMouseMoveY (0), + mouseClickCounter (0), + mouseMovedSignificantlySincePressed (false), kioskModeComponent (0) { + zerostruct (mouseDowns); refreshMonitorSizes(); } @@ -66,6 +65,9 @@ Desktop& JUCE_CALLTYPE Desktop::getInstance() throw() } //============================================================================== +extern void juce_updateMultiMonitorInfo (Array & monitorCoords, + const bool clipToWorkArea); + void Desktop::refreshMonitorSizes() throw() { const Array oldClipped (monitorCoordsClipped); @@ -206,20 +208,75 @@ void Desktop::componentBroughtToFront (Component* const c) throw() } //============================================================================== -// from Component.cpp -extern int juce_recentMouseDownX [4]; -extern int juce_recentMouseDownY [4]; -extern int juce_MouseClickCounter; - void Desktop::getLastMouseDownPosition (int& x, int& y) throw() { - x = juce_recentMouseDownX [0]; - y = juce_recentMouseDownY [0]; + const Desktop& d = getInstance(); + x = d.mouseDowns[0].x; + y = d.mouseDowns[0].y; } int Desktop::getMouseButtonClickCounter() throw() { - return juce_MouseClickCounter; + return getInstance().mouseClickCounter; +} + +void Desktop::incrementMouseClickCounter() throw() +{ + ++mouseClickCounter; +} + +const Time Desktop::getLastMouseDownTime() const throw() +{ + return Time (mouseDowns[0].time); +} + +void Desktop::registerMouseDown (int x, int y, int64 time, Component* component) throw() +{ + for (int i = numElementsInArray (mouseDowns); --i > 0;) + mouseDowns[i] = mouseDowns[i - 1]; + + mouseDowns[0].x = x; + mouseDowns[0].y = y; + mouseDowns[0].time = time; + mouseDowns[0].component = component; + mouseMovedSignificantlySincePressed = false; +} + +void Desktop::registerMouseDrag (int x, int y) throw() +{ + mouseMovedSignificantlySincePressed + = mouseMovedSignificantlySincePressed + || abs (mouseDowns[0].x - x) >= 4 + || abs (mouseDowns[0].y - y) >= 4; +} + +int Desktop::getNumberOfMultipleClicks() const throw() +{ + int numClicks = 0; + + if (mouseDowns[0].time != 0) + { + if (! mouseMovedSignificantlySincePressed) + ++numClicks; + + for (int i = 1; i < numElementsInArray (mouseDowns); ++i) + { + if (mouseDowns[0].time - mouseDowns[i].time + < (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1))) + && abs (mouseDowns[0].x - mouseDowns[i].x) < 8 + && abs (mouseDowns[0].y - mouseDowns[i].y) < 8 + && mouseDowns[0].component == mouseDowns[i].component) + { + ++numClicks; + } + else + { + break; + } + } + } + + return numClicks; } //============================================================================== @@ -274,7 +331,7 @@ void Desktop::timerCallback() int x, y; getMousePosition (x, y); - if (lastMouseX != x || lastMouseY != y) + if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y) sendMouseMove(); } @@ -286,8 +343,8 @@ void Desktop::sendMouseMove() int x, y; getMousePosition (x, y); - lastMouseX = x; - lastMouseY = y; + lastFakeMouseMoveX = x; + lastFakeMouseMoveY = y; Component* const target = findComponentAt (x, y); @@ -328,7 +385,7 @@ void Desktop::resetTimer() throw() else startTimer (100); - getMousePosition (lastMouseX, lastMouseY); + getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY); } //============================================================================== diff --git a/src/gui/components/juce_Desktop.h b/src/gui/components/juce_Desktop.h index b39c480201..a31d46f699 100644 --- a/src/gui/components/juce_Desktop.h +++ b/src/gui/components/juce_Desktop.h @@ -248,7 +248,24 @@ private: ~Desktop() throw(); Array monitorCoordsClipped, monitorCoordsUnclipped; - int lastMouseX, lastMouseY; + + int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter; + bool mouseMovedSignificantlySincePressed; + + struct RecentMouseDown + { + int x, y; + int64 time; + Component* component; + }; + + RecentMouseDown mouseDowns[4]; + + void incrementMouseClickCounter() throw(); + void registerMouseDown (int x, int y, int64 time, Component* component) throw(); + void registerMouseDrag (int x, int y) throw(); + const Time getLastMouseDownTime() const throw(); + int getNumberOfMultipleClicks() const throw(); Component* kioskModeComponent; Rectangle kioskComponentOriginalBounds; diff --git a/src/gui/components/keyboard/juce_ModifierKeys.cpp b/src/gui/components/keyboard/juce_ModifierKeys.cpp index 8d302c3550..5407e23a75 100644 --- a/src/gui/components/keyboard/juce_ModifierKeys.cpp +++ b/src/gui/components/keyboard/juce_ModifierKeys.cpp @@ -54,4 +54,16 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw() return ModifierKeys (currentModifierFlags); } +int ModifierKeys::getNumMouseButtonsDown() const throw() +{ + int num = 0; + + if (isLeftButtonDown()) ++num; + if (isRightButtonDown()) ++num; + if (isMiddleButtonDown()) ++num; + + return num; +} + + END_JUCE_NAMESPACE diff --git a/src/gui/components/keyboard/juce_ModifierKeys.h b/src/gui/components/keyboard/juce_ModifierKeys.h index 929b286b43..d21ce80197 100644 --- a/src/gui/components/keyboard/juce_ModifierKeys.h +++ b/src/gui/components/keyboard/juce_ModifierKeys.h @@ -159,6 +159,9 @@ public: /** Tests a combination of flags and returns true if any of them are set. */ inline bool testFlags (const int flagsToTest) const throw() { return (flags & flagsToTest) != 0; } + /** Returns the total number of mouse buttons that are down. */ + int getNumMouseButtonsDown() const throw(); + //============================================================================== /** Creates a ModifierKeys object to represent the last-known state of the keyboard and mouse buttons. diff --git a/src/gui/components/windows/juce_ComponentPeer.cpp b/src/gui/components/windows/juce_ComponentPeer.cpp index 77589a7435..e615fed18b 100644 --- a/src/gui/components/windows/juce_ComponentPeer.cpp +++ b/src/gui/components/windows/juce_ComponentPeer.cpp @@ -41,18 +41,7 @@ BEGIN_JUCE_NAMESPACE //============================================================================== -// these are over in juce_component.cpp -extern int64 juce_recentMouseDownTimes[4]; -extern int juce_recentMouseDownX [4]; -extern int juce_recentMouseDownY [4]; -extern Component* juce_recentMouseDownComponent [4]; -extern int juce_LastMousePosX; -extern int juce_LastMousePosY; -extern int juce_MouseClickCounter; -extern bool juce_MouseHasMovedSignificantlySincePressed; - static const int fakeMouseMoveMessage = 0x7fff00ff; - static VoidArray heavyweightPeers; @@ -199,46 +188,17 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time) void ComponentPeer::handleMouseDown (int x, int y, const int64 time) { - ++juce_MouseClickCounter; - + Desktop::getInstance().incrementMouseClickCounter(); updateCurrentModifiers(); - int numMouseButtonsDown = 0; - - if (ModifierKeys::getCurrentModifiers().isLeftButtonDown()) - ++numMouseButtonsDown; - - if (ModifierKeys::getCurrentModifiers().isRightButtonDown()) - ++numMouseButtonsDown; - - if (ModifierKeys::getCurrentModifiers().isMiddleButtonDown()) - ++numMouseButtonsDown; - - if (numMouseButtonsDown == 1) + if (ModifierKeys::getCurrentModifiers().getNumMouseButtonsDown() == 1) { Component::componentUnderMouse = component->getComponentAt (x, y); if (Component::componentUnderMouse != 0) { - // can't set these in the mouseDownInt() method, because it's re-entrant, so do it here.. - - for (int i = numElementsInArray (juce_recentMouseDownTimes); --i > 0;) - { - juce_recentMouseDownTimes [i] = juce_recentMouseDownTimes [i - 1]; - juce_recentMouseDownX [i] = juce_recentMouseDownX [i - 1]; - juce_recentMouseDownY [i] = juce_recentMouseDownY [i - 1]; - juce_recentMouseDownComponent [i] = juce_recentMouseDownComponent [i - 1]; - } - - juce_recentMouseDownTimes[0] = time; - juce_recentMouseDownX[0] = x; - juce_recentMouseDownY[0] = y; - juce_recentMouseDownComponent[0] = Component::componentUnderMouse; - relativePositionToGlobal (juce_recentMouseDownX[0], juce_recentMouseDownY[0]); - juce_MouseHasMovedSignificantlySincePressed = false; - component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); - Component::componentUnderMouse->internalMouseDown (x, y); + Component::componentUnderMouse->internalMouseDown (x, y, time); } } } @@ -250,7 +210,6 @@ void ComponentPeer::handleMouseDrag (int x, int y, const int64 time) if (Component::componentUnderMouse != 0) { component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); - Component::componentUnderMouse->internalMouseDrag (x, y, time); } } @@ -259,18 +218,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i { updateCurrentModifiers(); - int numMouseButtonsDown = 0; - - if ((oldModifiers & ModifierKeys::leftButtonModifier) != 0) - ++numMouseButtonsDown; - - if ((oldModifiers & ModifierKeys::rightButtonModifier) != 0) - ++numMouseButtonsDown; - - if ((oldModifiers & ModifierKeys::middleButtonModifier) != 0) - ++numMouseButtonsDown; - - if (numMouseButtonsDown == 1) + if (ModifierKeys (oldModifiers).getNumMouseButtonsDown() == 1) { const ComponentDeletionWatcher deletionChecker (component); Component* c = component->getComponentAt (x, y);