Browse Source

Code clean-ups.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
22ecd45505
10 changed files with 466 additions and 447 deletions
  1. +209
    -219
      juce_amalgamated.cpp
  2. +22
    -3
      juce_amalgamated.h
  3. +1
    -1
      src/core/juce_StandardHeader.h
  4. +121
    -148
      src/gui/components/juce_Component.cpp
  5. +1
    -1
      src/gui/components/juce_Component.h
  6. +75
    -18
      src/gui/components/juce_Desktop.cpp
  7. +18
    -1
      src/gui/components/juce_Desktop.h
  8. +12
    -0
      src/gui/components/keyboard/juce_ModifierKeys.cpp
  9. +3
    -0
      src/gui/components/keyboard/juce_ModifierKeys.h
  10. +4
    -56
      src/gui/components/windows/juce_ComponentPeer.cpp

+ 209
- 219
juce_amalgamated.cpp View File

@@ -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);


+ 22
- 3
juce_amalgamated.h View File

@@ -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;


+ 1
- 1
src/core/juce_StandardHeader.h View File

@@ -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.


+ 121
- 148
src/gui/components/juce_Component.cpp View File

@@ -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)


+ 1
- 1
src/gui/components/juce_Component.h View File

@@ -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);


+ 75
- 18
src/gui/components/juce_Desktop.cpp View File

@@ -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);
} }
//============================================================================== //==============================================================================


+ 18
- 1
src/gui/components/juce_Desktop.h View File

@@ -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;


+ 12
- 0
src/gui/components/keyboard/juce_ModifierKeys.cpp View File

@@ -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

+ 3
- 0
src/gui/components/keyboard/juce_ModifierKeys.h View File

@@ -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.


+ 4
- 56
src/gui/components/windows/juce_ComponentPeer.cpp View File

@@ -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);


Loading…
Cancel
Save