| @@ -38425,45 +38425,6 @@ static Array <int> 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 <Rectangle>& 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 <Rectangle>& monitorCoords, | |||
| const bool clipToWorkArea); | |||
| void Desktop::refreshMonitorSizes() throw() | |||
| { | |||
| const Array <Rectangle> 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); | |||
| @@ -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 <Rectangle> 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; | |||
| @@ -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. | |||
| @@ -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) | |||
| @@ -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); | |||
| @@ -32,18 +32,17 @@ BEGIN_JUCE_NAMESPACE | |||
| #include "juce_ComponentDeletionWatcher.h" | |||
| #include "../graphics/geometry/juce_RectangleList.h" | |||
| extern void juce_updateMultiMonitorInfo (Array <Rectangle>& 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 <Rectangle>& monitorCoords, | |||
| const bool clipToWorkArea); | |||
| void Desktop::refreshMonitorSizes() throw() | |||
| { | |||
| const Array <Rectangle> 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); | |||
| } | |||
| //============================================================================== | |||
| @@ -248,7 +248,24 @@ private: | |||
| ~Desktop() throw(); | |||
| Array <Rectangle> 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; | |||
| @@ -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 | |||
| @@ -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. | |||
| @@ -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); | |||