| @@ -38425,45 +38425,6 @@ static Array <int> modalReturnValues; | |||||
| static const int customCommandMessage = 0x7fff0001; | static const int customCommandMessage = 0x7fff0001; | ||||
| static const int exitModalStateMessage = 0x7fff0002; | 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 unboundedMouseOffsetX = 0; | ||||
| static int unboundedMouseOffsetY = 0; | static int unboundedMouseOffsetY = 0; | ||||
| static bool isUnboundedMouseModeOn = false; | static bool isUnboundedMouseModeOn = false; | ||||
| @@ -40616,75 +40577,72 @@ void Component::internalMouseEnter (int x, int y, int64 time) | |||||
| return; | return; | ||||
| } | } | ||||
| if (! flags.mouseInsideFlag) | |||||
| if (isValidComponent() && ! flags.mouseInsideFlag) | |||||
| { | { | ||||
| flags.mouseInsideFlag = true; | flags.mouseInsideFlag = true; | ||||
| flags.mouseOverFlag = true; | flags.mouseOverFlag = true; | ||||
| flags.draggingFlag = false; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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 | class InternalDragRepeater : public Timer | ||||
| { | { | ||||
| public: | public: | ||||
| InternalDragRepeater() | |||||
| {} | |||||
| ~InternalDragRepeater() | |||||
| {} | |||||
| InternalDragRepeater() {} | |||||
| ~InternalDragRepeater() {} | |||||
| void timerCallback() | void timerCallback() | ||||
| { | { | ||||
| @@ -40801,6 +40756,10 @@ public: | |||||
| } | } | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| private: | |||||
| InternalDragRepeater (const InternalDragRepeater&); | |||||
| InternalDragRepeater& operator= (const InternalDragRepeater&); | |||||
| }; | }; | ||||
| static InternalDragRepeater* dragRepeater = 0; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| @@ -40840,22 +40805,22 @@ void Component::internalMouseDown (const int x, const int y) | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| Time (time), | |||||
| x, y, | x, y, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| countMouseClicks(), | |||||
| desktop.getLastMouseDownTime(), | |||||
| desktop.getNumberOfMultipleClicks(), | |||||
| false); | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| return; | return; | ||||
| @@ -40893,26 +40858,26 @@ void Component::internalMouseDown (const int x, const int y) | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| desktop.getLastMouseDownTime(), | |||||
| x, y, | x, y, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| countMouseClicks(), | |||||
| desktop.getLastMouseDownTime(), | |||||
| desktop.getNumberOfMultipleClicks(), | |||||
| false); | false); | ||||
| mouseDown (me); | mouseDown (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -40953,49 +40918,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int | |||||
| { | { | ||||
| if (isValidComponent() && flags.draggingFlag) | if (isValidComponent() && flags.draggingFlag) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| flags.draggingFlag = false; | flags.draggingFlag = false; | ||||
| deleteAndZero (dragRepeater); | deleteAndZero (dragRepeater); | ||||
| x += unboundedMouseOffsetX; | x += unboundedMouseOffsetX; | ||||
| y += unboundedMouseOffsetY; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| if (flags.repaintOnMouseActivityFlag) | if (flags.repaintOnMouseActivityFlag) | ||||
| repaint(); | repaint(); | ||||
| int mdx = juce_recentMouseDownX[0]; | |||||
| int mdy = juce_recentMouseDownY[0]; | |||||
| int mdx, mdy; | |||||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||||
| globalPositionToRelative (mdx, mdy); | globalPositionToRelative (mdx, mdy); | ||||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| oldModifiers, | oldModifiers, | ||||
| this, | this, | ||||
| Time (time), | Time (time), | ||||
| mdx, mdy, | 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); | mouseUp (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -41040,14 +41010,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int | |||||
| mouseDoubleClick (me); | mouseDoubleClick (me); | ||||
| int i; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| for (i = numListeners; --i >= 0;) | for (i = numListeners; --i >= 0;) | ||||
| @@ -41091,50 +41061,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time) | |||||
| { | { | ||||
| if (isValidComponent() && flags.draggingFlag) | if (isValidComponent() && flags.draggingFlag) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| flags.mouseOverFlag = reallyContains (x, y, false); | flags.mouseOverFlag = reallyContains (x, y, false); | ||||
| x += unboundedMouseOffsetX; | x += unboundedMouseOffsetX; | ||||
| y += unboundedMouseOffsetY; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| int mdx = juce_recentMouseDownX[0]; | |||||
| int mdy = juce_recentMouseDownY[0]; | |||||
| int mdx, mdy; | |||||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||||
| globalPositionToRelative (mdx, mdy); | globalPositionToRelative (mdx, mdy); | ||||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (time), | Time (time), | ||||
| mdx, mdy, | 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); | mouseDrag (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -41219,6 +41189,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (isValidComponent()) | if (isValidComponent()) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| @@ -41230,7 +41202,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| { | { | ||||
| // allow blocked mouse-events to go to global listeners.. | // allow blocked mouse-events to go to global listeners.. | ||||
| Desktop::getInstance().sendMouseMove(); | |||||
| desktop.sendMouseMove(); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -41244,16 +41216,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | 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) | void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| const ComponentDeletionWatcher deletionChecker (this); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| const float wheelIncrementX = intAmountX * (1.0f / 256.0f); | const float wheelIncrementX = intAmountX * (1.0f / 256.0f); | ||||
| @@ -41312,14 +41285,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, | |||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| { | { | ||||
| // allow blocked mouse-events to go to global listeners.. | // 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -41329,14 +41302,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, | |||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -41921,16 +41894,16 @@ END_JUCE_NAMESPACE | |||||
| BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
| extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords, | |||||
| const bool clipToWorkArea); | |||||
| static Desktop* juce_desktopInstance = 0; | static Desktop* juce_desktopInstance = 0; | ||||
| Desktop::Desktop() throw() | Desktop::Desktop() throw() | ||||
| : lastMouseX (0), | |||||
| lastMouseY (0), | |||||
| : lastFakeMouseMoveX (0), | |||||
| lastFakeMouseMoveY (0), | |||||
| mouseClickCounter (0), | |||||
| mouseMovedSignificantlySincePressed (false), | |||||
| kioskModeComponent (0) | kioskModeComponent (0) | ||||
| { | { | ||||
| zerostruct (mouseDowns); | |||||
| refreshMonitorSizes(); | refreshMonitorSizes(); | ||||
| } | } | ||||
| @@ -41952,6 +41925,9 @@ Desktop& JUCE_CALLTYPE Desktop::getInstance() throw() | |||||
| return *juce_desktopInstance; | return *juce_desktopInstance; | ||||
| } | } | ||||
| extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords, | |||||
| const bool clipToWorkArea); | |||||
| void Desktop::refreshMonitorSizes() throw() | void Desktop::refreshMonitorSizes() throw() | ||||
| { | { | ||||
| const Array <Rectangle> oldClipped (monitorCoordsClipped); | 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() | 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() | 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() | void Desktop::addGlobalMouseListener (MouseListener* const listener) throw() | ||||
| @@ -42154,7 +42185,7 @@ void Desktop::timerCallback() | |||||
| int x, y; | int x, y; | ||||
| getMousePosition (x, y); | getMousePosition (x, y); | ||||
| if (lastMouseX != x || lastMouseY != y) | |||||
| if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y) | |||||
| sendMouseMove(); | sendMouseMove(); | ||||
| } | } | ||||
| @@ -42166,8 +42197,8 @@ void Desktop::sendMouseMove() | |||||
| int x, y; | int x, y; | ||||
| getMousePosition (x, y); | getMousePosition (x, y); | ||||
| lastMouseX = x; | |||||
| lastMouseY = y; | |||||
| lastFakeMouseMoveX = x; | |||||
| lastFakeMouseMoveY = y; | |||||
| Component* const target = findComponentAt (x, y); | Component* const target = findComponentAt (x, y); | ||||
| @@ -42208,7 +42239,7 @@ void Desktop::resetTimer() throw() | |||||
| else | else | ||||
| startTimer (100); | startTimer (100); | ||||
| getMousePosition (lastMouseX, lastMouseY); | |||||
| getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY); | |||||
| } | } | ||||
| extern void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool allowMenusAndBars); | extern void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool allowMenusAndBars); | ||||
| @@ -60346,6 +60377,17 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw() | |||||
| return ModifierKeys (currentModifierFlags); | 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_JUCE_NAMESPACE | ||||
| /********* End of inlined file: juce_ModifierKeys.cpp *********/ | /********* End of inlined file: juce_ModifierKeys.cpp *********/ | ||||
| @@ -76101,18 +76143,7 @@ BEGIN_JUCE_NAMESPACE | |||||
| //#define JUCE_ENABLE_REPAINT_DEBUGGING 1 | //#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 const int fakeMouseMoveMessage = 0x7fff00ff; | ||||
| static VoidArray heavyweightPeers; | static VoidArray heavyweightPeers; | ||||
| ComponentPeer::ComponentPeer (Component* const component_, | 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) | void ComponentPeer::handleMouseDown (int x, int y, const int64 time) | ||||
| { | { | ||||
| ++juce_MouseClickCounter; | |||||
| Desktop::getInstance().incrementMouseClickCounter(); | |||||
| updateCurrentModifiers(); | 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); | Component::componentUnderMouse = component->getComponentAt (x, y); | ||||
| if (Component::componentUnderMouse != 0) | 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->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) | if (Component::componentUnderMouse != 0) | ||||
| { | { | ||||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | ||||
| Component::componentUnderMouse->internalMouseDrag (x, y, time); | Component::componentUnderMouse->internalMouseDrag (x, y, time); | ||||
| } | } | ||||
| } | } | ||||
| @@ -76315,18 +76316,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i | |||||
| { | { | ||||
| updateCurrentModifiers(); | 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); | const ComponentDeletionWatcher deletionChecker (component); | ||||
| Component* c = component->getComponentAt (x, y); | Component* c = component->getComponentAt (x, y); | ||||
| @@ -17,7 +17,7 @@ | |||||
| #define __JUCE_STANDARDHEADER_JUCEHEADER__ | #define __JUCE_STANDARDHEADER_JUCEHEADER__ | ||||
| #define JUCE_MAJOR_VERSION 1 | #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)) | #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; } | inline bool testFlags (const int flagsToTest) const throw() { return (flags & flagsToTest) != 0; } | ||||
| int getNumMouseButtonsDown() const throw(); | |||||
| static const ModifierKeys getCurrentModifiers() throw(); | static const ModifierKeys getCurrentModifiers() throw(); | ||||
| static const ModifierKeys getCurrentModifiersRealtime() throw(); | static const ModifierKeys getCurrentModifiersRealtime() throw(); | ||||
| @@ -12215,7 +12217,7 @@ private: | |||||
| void internalMouseEnter (int x, int y, const int64 time); | void internalMouseEnter (int x, int y, const int64 time); | ||||
| void internalMouseExit (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 internalMouseUp (const int oldModifiers, int x, int y, const int64 time); | ||||
| void internalMouseDrag (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); | void internalMouseMove (int x, int y, const int64 time); | ||||
| @@ -12683,7 +12685,24 @@ private: | |||||
| ~Desktop() throw(); | ~Desktop() throw(); | ||||
| Array <Rectangle> monitorCoordsClipped, monitorCoordsUnclipped; | 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; | Component* kioskModeComponent; | ||||
| Rectangle kioskComponentOriginalBounds; | Rectangle kioskComponentOriginalBounds; | ||||
| @@ -32,7 +32,7 @@ | |||||
| See also SystemStats::getJUCEVersion() for a string version. | See also SystemStats::getJUCEVersion() for a string version. | ||||
| */ | */ | ||||
| #define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
| #define JUCE_MINOR_VERSION 50 | |||||
| #define JUCE_MINOR_VERSION 51 | |||||
| /** Current Juce version number. | /** Current Juce version number. | ||||
| @@ -53,45 +53,6 @@ static const int customCommandMessage = 0x7fff0001; | |||||
| static const int exitModalStateMessage = 0x7fff0002; | 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 unboundedMouseOffsetX = 0; | ||||
| static int unboundedMouseOffsetY = 0; | static int unboundedMouseOffsetY = 0; | ||||
| static bool isUnboundedMouseModeOn = false; | static bool isUnboundedMouseModeOn = false; | ||||
| @@ -2281,75 +2242,72 @@ void Component::internalMouseEnter (int x, int y, int64 time) | |||||
| return; | return; | ||||
| } | } | ||||
| if (! flags.mouseInsideFlag) | |||||
| if (isValidComponent() && ! flags.mouseInsideFlag) | |||||
| { | { | ||||
| flags.mouseInsideFlag = true; | flags.mouseInsideFlag = true; | ||||
| flags.mouseOverFlag = true; | flags.mouseOverFlag = true; | ||||
| flags.draggingFlag = false; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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 | class InternalDragRepeater : public Timer | ||||
| { | { | ||||
| public: | public: | ||||
| InternalDragRepeater() | |||||
| {} | |||||
| ~InternalDragRepeater() | |||||
| {} | |||||
| InternalDragRepeater() {} | |||||
| ~InternalDragRepeater() {} | |||||
| void timerCallback() | void timerCallback() | ||||
| { | { | ||||
| @@ -2467,6 +2422,10 @@ public: | |||||
| } | } | ||||
| juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
| private: | |||||
| InternalDragRepeater (const InternalDragRepeater&); | |||||
| InternalDragRepeater& operator= (const InternalDragRepeater&); | |||||
| }; | }; | ||||
| static InternalDragRepeater* dragRepeater = 0; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| @@ -2507,22 +2472,22 @@ void Component::internalMouseDown (const int x, const int y) | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| Time (time), | |||||
| x, y, | x, y, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| countMouseClicks(), | |||||
| desktop.getLastMouseDownTime(), | |||||
| desktop.getNumberOfMultipleClicks(), | |||||
| false); | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| return; | return; | ||||
| @@ -2560,26 +2525,26 @@ void Component::internalMouseDown (const int x, const int y) | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| desktop.getLastMouseDownTime(), | |||||
| x, y, | x, y, | ||||
| Time (juce_recentMouseDownTimes[0]), | |||||
| countMouseClicks(), | |||||
| desktop.getLastMouseDownTime(), | |||||
| desktop.getNumberOfMultipleClicks(), | |||||
| false); | false); | ||||
| mouseDown (me); | mouseDown (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -2621,49 +2586,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int | |||||
| { | { | ||||
| if (isValidComponent() && flags.draggingFlag) | if (isValidComponent() && flags.draggingFlag) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| flags.draggingFlag = false; | flags.draggingFlag = false; | ||||
| deleteAndZero (dragRepeater); | deleteAndZero (dragRepeater); | ||||
| x += unboundedMouseOffsetX; | x += unboundedMouseOffsetX; | ||||
| y += unboundedMouseOffsetY; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| if (flags.repaintOnMouseActivityFlag) | if (flags.repaintOnMouseActivityFlag) | ||||
| repaint(); | repaint(); | ||||
| int mdx = juce_recentMouseDownX[0]; | |||||
| int mdy = juce_recentMouseDownY[0]; | |||||
| int mdx, mdy; | |||||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||||
| globalPositionToRelative (mdx, mdy); | globalPositionToRelative (mdx, mdy); | ||||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| oldModifiers, | oldModifiers, | ||||
| this, | this, | ||||
| Time (time), | Time (time), | ||||
| mdx, mdy, | 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); | mouseUp (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -2708,14 +2678,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int | |||||
| mouseDoubleClick (me); | mouseDoubleClick (me); | ||||
| int i; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| for (i = numListeners; --i >= 0;) | for (i = numListeners; --i >= 0;) | ||||
| @@ -2759,50 +2729,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time) | |||||
| { | { | ||||
| if (isValidComponent() && flags.draggingFlag) | if (isValidComponent() && flags.draggingFlag) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| flags.mouseOverFlag = reallyContains (x, y, false); | flags.mouseOverFlag = reallyContains (x, y, false); | ||||
| x += unboundedMouseOffsetX; | x += unboundedMouseOffsetX; | ||||
| y += unboundedMouseOffsetY; | 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); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| int mdx = juce_recentMouseDownX[0]; | |||||
| int mdy = juce_recentMouseDownY[0]; | |||||
| int mdx, mdy; | |||||
| Desktop::getLastMouseDownPosition (mdx, mdy); | |||||
| globalPositionToRelative (mdx, mdy); | globalPositionToRelative (mdx, mdy); | ||||
| const Time lastMouseDownTime (desktop.getLastMouseDownTime()); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| Time (time), | Time (time), | ||||
| mdx, mdy, | 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); | mouseDrag (me); | ||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -2887,6 +2857,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (isValidComponent()) | if (isValidComponent()) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| const MouseEvent me (x, y, | const MouseEvent me (x, y, | ||||
| ModifierKeys::getCurrentModifiers(), | ModifierKeys::getCurrentModifiers(), | ||||
| this, | this, | ||||
| @@ -2898,7 +2870,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| { | { | ||||
| // allow blocked mouse-events to go to global listeners.. | // allow blocked mouse-events to go to global listeners.. | ||||
| Desktop::getInstance().sendMouseMove(); | |||||
| desktop.sendMouseMove(); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -2912,16 +2884,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time) | |||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | 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) | void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time) | ||||
| { | { | ||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| const ComponentDeletionWatcher deletionChecker (this); | const ComponentDeletionWatcher deletionChecker (this); | ||||
| const float wheelIncrementX = intAmountX * (1.0f / 256.0f); | const float wheelIncrementX = intAmountX * (1.0f / 256.0f); | ||||
| @@ -2980,14 +2953,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, | |||||
| if (isCurrentlyBlockedByAnotherModalComponent()) | if (isCurrentlyBlockedByAnotherModalComponent()) | ||||
| { | { | ||||
| // allow blocked mouse-events to go to global listeners.. | // 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -2997,14 +2970,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY, | |||||
| if (deletionChecker.hasBeenDeleted()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | 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()) | if (deletionChecker.hasBeenDeleted()) | ||||
| return; | return; | ||||
| i = jmin (i, Desktop::getInstance().mouseListeners.size()); | |||||
| i = jmin (i, desktop.mouseListeners.size()); | |||||
| } | } | ||||
| if (mouseListeners_ != 0) | if (mouseListeners_ != 0) | ||||
| @@ -1953,7 +1953,7 @@ private: | |||||
| //============================================================================== | //============================================================================== | ||||
| void internalMouseEnter (int x, int y, const int64 time); | void internalMouseEnter (int x, int y, const int64 time); | ||||
| void internalMouseExit (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 internalMouseUp (const int oldModifiers, int x, int y, const int64 time); | ||||
| void internalMouseDrag (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); | void internalMouseMove (int x, int y, const int64 time); | ||||
| @@ -32,18 +32,17 @@ BEGIN_JUCE_NAMESPACE | |||||
| #include "juce_ComponentDeletionWatcher.h" | #include "juce_ComponentDeletionWatcher.h" | ||||
| #include "../graphics/geometry/juce_RectangleList.h" | #include "../graphics/geometry/juce_RectangleList.h" | ||||
| extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords, | |||||
| const bool clipToWorkArea); | |||||
| //============================================================================== | //============================================================================== | ||||
| static Desktop* juce_desktopInstance = 0; | static Desktop* juce_desktopInstance = 0; | ||||
| Desktop::Desktop() throw() | Desktop::Desktop() throw() | ||||
| : lastMouseX (0), | |||||
| lastMouseY (0), | |||||
| : lastFakeMouseMoveX (0), | |||||
| lastFakeMouseMoveY (0), | |||||
| mouseClickCounter (0), | |||||
| mouseMovedSignificantlySincePressed (false), | |||||
| kioskModeComponent (0) | kioskModeComponent (0) | ||||
| { | { | ||||
| zerostruct (mouseDowns); | |||||
| refreshMonitorSizes(); | 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() | void Desktop::refreshMonitorSizes() throw() | ||||
| { | { | ||||
| const Array <Rectangle> oldClipped (monitorCoordsClipped); | 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() | 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() | 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; | int x, y; | ||||
| getMousePosition (x, y); | getMousePosition (x, y); | ||||
| if (lastMouseX != x || lastMouseY != y) | |||||
| if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y) | |||||
| sendMouseMove(); | sendMouseMove(); | ||||
| } | } | ||||
| @@ -286,8 +343,8 @@ void Desktop::sendMouseMove() | |||||
| int x, y; | int x, y; | ||||
| getMousePosition (x, y); | getMousePosition (x, y); | ||||
| lastMouseX = x; | |||||
| lastMouseY = y; | |||||
| lastFakeMouseMoveX = x; | |||||
| lastFakeMouseMoveY = y; | |||||
| Component* const target = findComponentAt (x, y); | Component* const target = findComponentAt (x, y); | ||||
| @@ -328,7 +385,7 @@ void Desktop::resetTimer() throw() | |||||
| else | else | ||||
| startTimer (100); | startTimer (100); | ||||
| getMousePosition (lastMouseX, lastMouseY); | |||||
| getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -248,7 +248,24 @@ private: | |||||
| ~Desktop() throw(); | ~Desktop() throw(); | ||||
| Array <Rectangle> monitorCoordsClipped, monitorCoordsUnclipped; | 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; | Component* kioskModeComponent; | ||||
| Rectangle kioskComponentOriginalBounds; | Rectangle kioskComponentOriginalBounds; | ||||
| @@ -54,4 +54,16 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw() | |||||
| return ModifierKeys (currentModifierFlags); | 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_JUCE_NAMESPACE | ||||
| @@ -159,6 +159,9 @@ public: | |||||
| /** Tests a combination of flags and returns true if any of them are set. */ | /** 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; } | 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 | /** Creates a ModifierKeys object to represent the last-known state of the | ||||
| keyboard and mouse buttons. | 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 const int fakeMouseMoveMessage = 0x7fff00ff; | ||||
| static VoidArray heavyweightPeers; | 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) | void ComponentPeer::handleMouseDown (int x, int y, const int64 time) | ||||
| { | { | ||||
| ++juce_MouseClickCounter; | |||||
| Desktop::getInstance().incrementMouseClickCounter(); | |||||
| updateCurrentModifiers(); | 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); | Component::componentUnderMouse = component->getComponentAt (x, y); | ||||
| if (Component::componentUnderMouse != 0) | 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->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) | if (Component::componentUnderMouse != 0) | ||||
| { | { | ||||
| component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y); | ||||
| Component::componentUnderMouse->internalMouseDrag (x, y, time); | Component::componentUnderMouse->internalMouseDrag (x, y, time); | ||||
| } | } | ||||
| } | } | ||||
| @@ -259,18 +218,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i | |||||
| { | { | ||||
| updateCurrentModifiers(); | 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); | const ComponentDeletionWatcher deletionChecker (component); | ||||
| Component* c = component->getComponentAt (x, y); | Component* c = component->getComponentAt (x, y); | ||||