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 exitModalStateMessage = 0x7fff0002;

// these are also used by ComponentPeer
int64 juce_recentMouseDownTimes [4] = { 0, 0, 0, 0 };
int juce_recentMouseDownX [4] = { 0, 0, 0, 0 };
int juce_recentMouseDownY [4] = { 0, 0, 0, 0 };
Component* juce_recentMouseDownComponent [4] = { 0, 0, 0, 0 };
int juce_LastMousePosX = 0;
int juce_LastMousePosY = 0;
int juce_MouseClickCounter = 0;
bool juce_MouseHasMovedSignificantlySincePressed = false;

static int countMouseClicks() throw()
{
int numClicks = 0;

if (juce_recentMouseDownTimes[0] != 0)
{
if (! juce_MouseHasMovedSignificantlySincePressed)
++numClicks;

for (int i = 1; i < numElementsInArray (juce_recentMouseDownTimes); ++i)
{
if (juce_recentMouseDownTimes[0] - juce_recentMouseDownTimes [i]
< (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1)))
&& abs (juce_recentMouseDownX[0] - juce_recentMouseDownX[i]) < 8
&& abs (juce_recentMouseDownY[0] - juce_recentMouseDownY[i]) < 8
&& juce_recentMouseDownComponent[0] == juce_recentMouseDownComponent [i])
{
++numClicks;
}
else
{
break;
}
}
}

return numClicks;
}

static int unboundedMouseOffsetX = 0;
static int unboundedMouseOffsetY = 0;
static bool isUnboundedMouseModeOn = false;
@@ -40616,75 +40577,72 @@ void Component::internalMouseEnter (int x, int y, int64 time)
return;
}

if (! flags.mouseInsideFlag)
if (isValidComponent() && ! flags.mouseInsideFlag)
{
flags.mouseInsideFlag = true;
flags.mouseOverFlag = true;
flags.draggingFlag = false;

if (isValidComponent())
{
const ComponentDeletionWatcher deletionChecker (this);
const ComponentDeletionWatcher deletionChecker (this);

if (flags.repaintOnMouseActivityFlag)
repaint();
if (flags.repaintOnMouseActivityFlag)
repaint();

const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
x, y,
Time (time),
0, false);
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
x, y,
Time (time),
0, false);

mouseEnter (me);
mouseEnter (me);

if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me);

if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();
i = jmin (i, Desktop::getInstance().mouseListeners.size());
}

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
if (mouseListeners_ != 0)
{
for (int i = mouseListeners_->size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me);
((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, mouseListeners_->size());
}
}

if (mouseListeners_ != 0)
{
for (int i = mouseListeners_->size(); --i >= 0;)
{
((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, mouseListeners_->size());
}
}
const Component* p = parentComponent_;

const Component* p = parentComponent_;
while (p != 0)
{
const ComponentDeletionWatcher parentDeletionChecker (p);

while (p != 0)
for (int i = p->numDeepMouseListeners; --i >= 0;)
{
const ComponentDeletionWatcher parentDeletionChecker (p);

for (int i = p->numDeepMouseListeners; --i >= 0;)
{
((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me);

if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted())
return;
((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me);

i = jmin (i, p->numDeepMouseListeners);
}
if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted())
return;

p = p->parentComponent_;
i = jmin (i, p->numDeepMouseListeners);
}

p = p->parentComponent_;
}
}

@@ -40776,11 +40734,8 @@ void Component::internalMouseExit (int x, int y, int64 time)
class InternalDragRepeater : public Timer
{
public:
InternalDragRepeater()
{}

~InternalDragRepeater()
{}
InternalDragRepeater() {}
~InternalDragRepeater() {}

void timerCallback()
{
@@ -40801,6 +40756,10 @@ public:
}

juce_UseDebuggingNewOperator

private:
InternalDragRepeater (const InternalDragRepeater&);
InternalDragRepeater& operator= (const InternalDragRepeater&);
};

static InternalDragRepeater* dragRepeater = 0;
@@ -40821,8 +40780,14 @@ void Component::beginDragAutoRepeat (const int interval)
}
}

void Component::internalMouseDown (const int x, const int y)
void Component::internalMouseDown (const int x, const int y, const int64 time)
{
Desktop& desktop = Desktop::getInstance();

int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDown (gx, gy, time, this);

const ComponentDeletionWatcher deletionChecker (this);

if (isCurrentlyBlockedByAnotherModalComponent())
@@ -40840,22 +40805,22 @@ void Component::internalMouseDown (const int x, const int y)
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (juce_recentMouseDownTimes[0]),
Time (time),
x, y,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(),
false);

Desktop::getInstance().resetTimer();
desktop.resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDown (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

return;
@@ -40893,26 +40858,26 @@ void Component::internalMouseDown (const int x, const int y)
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (juce_recentMouseDownTimes[0]),
desktop.getLastMouseDownTime(),
x, y,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(),
false);
mouseDown (me);

if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();
desktop.resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDown (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

if (mouseListeners_ != 0)
@@ -40953,49 +40918,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int
{
if (isValidComponent() && flags.draggingFlag)
{
Desktop& desktop = Desktop::getInstance();

flags.draggingFlag = false;
deleteAndZero (dragRepeater);

x += unboundedMouseOffsetX;
y += unboundedMouseOffsetY;
juce_LastMousePosX = x;
juce_LastMousePosY = y;
relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY);

int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDrag (gx, gy);

const ComponentDeletionWatcher deletionChecker (this);

if (flags.repaintOnMouseActivityFlag)
repaint();

int mdx = juce_recentMouseDownX[0];
int mdy = juce_recentMouseDownY[0];
int mdx, mdy;
Desktop::getLastMouseDownPosition (mdx, mdy);
globalPositionToRelative (mdx, mdy);

const Time lastMouseDownTime (desktop.getLastMouseDownTime());

const MouseEvent me (x, y,
oldModifiers,
this,
Time (time),
mdx, mdy,
Time (juce_recentMouseDownTimes [0]),
countMouseClicks(),
juce_MouseHasMovedSignificantlySincePressed
|| juce_recentMouseDownTimes[0] + 300 < time);
lastMouseDownTime,
desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed
|| time > lastMouseDownTime.toMilliseconds() + 300);

mouseUp (me);

if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();
desktop.resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseUp (me);
((MouseListener*) desktop.mouseListeners[i])->mouseUp (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

if (mouseListeners_ != 0)
@@ -41040,14 +41010,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int
mouseDoubleClick (me);

int i;
for (i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDoubleClick (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDoubleClick (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

for (i = numListeners; --i >= 0;)
@@ -41091,50 +41061,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time)
{
if (isValidComponent() && flags.draggingFlag)
{
Desktop& desktop = Desktop::getInstance();

flags.mouseOverFlag = reallyContains (x, y, false);

x += unboundedMouseOffsetX;
y += unboundedMouseOffsetY;
juce_LastMousePosX = x;
juce_LastMousePosY = y;
relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY);

juce_MouseHasMovedSignificantlySincePressed
= juce_MouseHasMovedSignificantlySincePressed
|| abs (juce_recentMouseDownX[0] - juce_LastMousePosX) >= 4
|| abs (juce_recentMouseDownY[0] - juce_LastMousePosY) >= 4;
int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDrag (gx, gy);

const ComponentDeletionWatcher deletionChecker (this);

int mdx = juce_recentMouseDownX[0];
int mdy = juce_recentMouseDownY[0];
int mdx, mdy;
Desktop::getLastMouseDownPosition (mdx, mdy);
globalPositionToRelative (mdx, mdy);

const Time lastMouseDownTime (desktop.getLastMouseDownTime());

const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
mdx, mdy,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
juce_MouseHasMovedSignificantlySincePressed
|| juce_recentMouseDownTimes[0] + 300 < time);
lastMouseDownTime,
desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed
|| time > lastMouseDownTime.toMilliseconds() + 300);

mouseDrag (me);

if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();
desktop.resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDrag (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDrag (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

if (mouseListeners_ != 0)
@@ -41219,6 +41189,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)

if (isValidComponent())
{
Desktop& desktop = Desktop::getInstance();

const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
@@ -41230,7 +41202,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
Desktop::getInstance().sendMouseMove();
desktop.sendMouseMove();
}
else
{
@@ -41244,16 +41216,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
if (deletionChecker.hasBeenDeleted())
return;

Desktop::getInstance().resetTimer();
desktop.resetTimer();

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseMove (me);
((MouseListener*) desktop.mouseListeners[i])->mouseMove (me);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

if (mouseListeners_ != 0)
@@ -41293,6 +41265,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)

void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time)
{
Desktop& desktop = Desktop::getInstance();
const ComponentDeletionWatcher deletionChecker (this);

const float wheelIncrementX = intAmountX * (1.0f / 256.0f);
@@ -41312,14 +41285,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY,
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
}
else
@@ -41329,14 +41302,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY,
if (deletionChecker.hasBeenDeleted())
return;

for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);

if (deletionChecker.hasBeenDeleted())
return;

i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}

if (mouseListeners_ != 0)
@@ -41921,16 +41894,16 @@ END_JUCE_NAMESPACE

BEGIN_JUCE_NAMESPACE

extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords,
const bool clipToWorkArea);

static Desktop* juce_desktopInstance = 0;

Desktop::Desktop() throw()
: lastMouseX (0),
lastMouseY (0),
: lastFakeMouseMoveX (0),
lastFakeMouseMoveY (0),
mouseClickCounter (0),
mouseMovedSignificantlySincePressed (false),
kioskModeComponent (0)
{
zerostruct (mouseDowns);
refreshMonitorSizes();
}

@@ -41952,6 +41925,9 @@ Desktop& JUCE_CALLTYPE Desktop::getInstance() throw()
return *juce_desktopInstance;
}

extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords,
const bool clipToWorkArea);

void Desktop::refreshMonitorSizes() throw()
{
const Array <Rectangle> oldClipped (monitorCoordsClipped);
@@ -42089,20 +42065,75 @@ void Desktop::componentBroughtToFront (Component* const c) throw()
}
}

// from Component.cpp
extern int juce_recentMouseDownX [4];
extern int juce_recentMouseDownY [4];
extern int juce_MouseClickCounter;

void Desktop::getLastMouseDownPosition (int& x, int& y) throw()
{
x = juce_recentMouseDownX [0];
y = juce_recentMouseDownY [0];
const Desktop& d = getInstance();
x = d.mouseDowns[0].x;
y = d.mouseDowns[0].y;
}

int Desktop::getMouseButtonClickCounter() throw()
{
return juce_MouseClickCounter;
return getInstance().mouseClickCounter;
}

void Desktop::incrementMouseClickCounter() throw()
{
++mouseClickCounter;
}

const Time Desktop::getLastMouseDownTime() const throw()
{
return Time (mouseDowns[0].time);
}

void Desktop::registerMouseDown (int x, int y, int64 time, Component* component) throw()
{
for (int i = numElementsInArray (mouseDowns); --i > 0;)
mouseDowns[i] = mouseDowns[i - 1];

mouseDowns[0].x = x;
mouseDowns[0].y = y;
mouseDowns[0].time = time;
mouseDowns[0].component = component;
mouseMovedSignificantlySincePressed = false;
}

void Desktop::registerMouseDrag (int x, int y) throw()
{
mouseMovedSignificantlySincePressed
= mouseMovedSignificantlySincePressed
|| abs (mouseDowns[0].x - x) >= 4
|| abs (mouseDowns[0].y - y) >= 4;
}

int Desktop::getNumberOfMultipleClicks() const throw()
{
int numClicks = 0;

if (mouseDowns[0].time != 0)
{
if (! mouseMovedSignificantlySincePressed)
++numClicks;

for (int i = 1; i < numElementsInArray (mouseDowns); ++i)
{
if (mouseDowns[0].time - mouseDowns[i].time
< (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1)))
&& abs (mouseDowns[0].x - mouseDowns[i].x) < 8
&& abs (mouseDowns[0].y - mouseDowns[i].y) < 8
&& mouseDowns[0].component == mouseDowns[i].component)
{
++numClicks;
}
else
{
break;
}
}
}

return numClicks;
}

void Desktop::addGlobalMouseListener (MouseListener* const listener) throw()
@@ -42154,7 +42185,7 @@ void Desktop::timerCallback()
int x, y;
getMousePosition (x, y);

if (lastMouseX != x || lastMouseY != y)
if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y)
sendMouseMove();
}

@@ -42166,8 +42197,8 @@ void Desktop::sendMouseMove()

int x, y;
getMousePosition (x, y);
lastMouseX = x;
lastMouseY = y;
lastFakeMouseMoveX = x;
lastFakeMouseMoveY = y;

Component* const target = findComponentAt (x, y);

@@ -42208,7 +42239,7 @@ void Desktop::resetTimer() throw()
else
startTimer (100);

getMousePosition (lastMouseX, lastMouseY);
getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY);
}

extern void juce_setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool allowMenusAndBars);
@@ -60346,6 +60377,17 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw()
return ModifierKeys (currentModifierFlags);
}

int ModifierKeys::getNumMouseButtonsDown() const throw()
{
int num = 0;

if (isLeftButtonDown()) ++num;
if (isRightButtonDown()) ++num;
if (isMiddleButtonDown()) ++num;

return num;
}

END_JUCE_NAMESPACE
/********* End of inlined file: juce_ModifierKeys.cpp *********/

@@ -76101,18 +76143,7 @@ BEGIN_JUCE_NAMESPACE

//#define JUCE_ENABLE_REPAINT_DEBUGGING 1

// these are over in juce_component.cpp
extern int64 juce_recentMouseDownTimes[4];
extern int juce_recentMouseDownX [4];
extern int juce_recentMouseDownY [4];
extern Component* juce_recentMouseDownComponent [4];
extern int juce_LastMousePosX;
extern int juce_LastMousePosY;
extern int juce_MouseClickCounter;
extern bool juce_MouseHasMovedSignificantlySincePressed;

static const int fakeMouseMoveMessage = 0x7fff00ff;

static VoidArray heavyweightPeers;

ComponentPeer::ComponentPeer (Component* const component_,
@@ -76255,46 +76286,17 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time)

void ComponentPeer::handleMouseDown (int x, int y, const int64 time)
{
++juce_MouseClickCounter;

Desktop::getInstance().incrementMouseClickCounter();
updateCurrentModifiers();

int numMouseButtonsDown = 0;

if (ModifierKeys::getCurrentModifiers().isLeftButtonDown())
++numMouseButtonsDown;

if (ModifierKeys::getCurrentModifiers().isRightButtonDown())
++numMouseButtonsDown;

if (ModifierKeys::getCurrentModifiers().isMiddleButtonDown())
++numMouseButtonsDown;

if (numMouseButtonsDown == 1)
if (ModifierKeys::getCurrentModifiers().getNumMouseButtonsDown() == 1)
{
Component::componentUnderMouse = component->getComponentAt (x, y);

if (Component::componentUnderMouse != 0)
{
// can't set these in the mouseDownInt() method, because it's re-entrant, so do it here..

for (int i = numElementsInArray (juce_recentMouseDownTimes); --i > 0;)
{
juce_recentMouseDownTimes [i] = juce_recentMouseDownTimes [i - 1];
juce_recentMouseDownX [i] = juce_recentMouseDownX [i - 1];
juce_recentMouseDownY [i] = juce_recentMouseDownY [i - 1];
juce_recentMouseDownComponent [i] = juce_recentMouseDownComponent [i - 1];
}

juce_recentMouseDownTimes[0] = time;
juce_recentMouseDownX[0] = x;
juce_recentMouseDownY[0] = y;
juce_recentMouseDownComponent[0] = Component::componentUnderMouse;
relativePositionToGlobal (juce_recentMouseDownX[0], juce_recentMouseDownY[0]);
juce_MouseHasMovedSignificantlySincePressed = false;

component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
Component::componentUnderMouse->internalMouseDown (x, y);
Component::componentUnderMouse->internalMouseDown (x, y, time);
}
}
}
@@ -76306,7 +76308,6 @@ void ComponentPeer::handleMouseDrag (int x, int y, const int64 time)
if (Component::componentUnderMouse != 0)
{
component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);

Component::componentUnderMouse->internalMouseDrag (x, y, time);
}
}
@@ -76315,18 +76316,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i
{
updateCurrentModifiers();

int numMouseButtonsDown = 0;

if ((oldModifiers & ModifierKeys::leftButtonModifier) != 0)
++numMouseButtonsDown;

if ((oldModifiers & ModifierKeys::rightButtonModifier) != 0)
++numMouseButtonsDown;

if ((oldModifiers & ModifierKeys::middleButtonModifier) != 0)
++numMouseButtonsDown;

if (numMouseButtonsDown == 1)
if (ModifierKeys (oldModifiers).getNumMouseButtonsDown() == 1)
{
const ComponentDeletionWatcher deletionChecker (component);
Component* c = component->getComponentAt (x, y);


+ 22
- 3
juce_amalgamated.h View File

@@ -17,7 +17,7 @@
#define __JUCE_STANDARDHEADER_JUCEHEADER__

#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 50
#define JUCE_MINOR_VERSION 51

#define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8))

@@ -8951,6 +8951,8 @@ public:

inline bool testFlags (const int flagsToTest) const throw() { return (flags & flagsToTest) != 0; }

int getNumMouseButtonsDown() const throw();

static const ModifierKeys getCurrentModifiers() throw();

static const ModifierKeys getCurrentModifiersRealtime() throw();
@@ -12215,7 +12217,7 @@ private:

void internalMouseEnter (int x, int y, const int64 time);
void internalMouseExit (int x, int y, const int64 time);
void internalMouseDown (int x, int y);
void internalMouseDown (int x, int y, const int64 time);
void internalMouseUp (const int oldModifiers, int x, int y, const int64 time);
void internalMouseDrag (int x, int y, const int64 time);
void internalMouseMove (int x, int y, const int64 time);
@@ -12683,7 +12685,24 @@ private:
~Desktop() throw();

Array <Rectangle> monitorCoordsClipped, monitorCoordsUnclipped;
int lastMouseX, lastMouseY;

int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter;
bool mouseMovedSignificantlySincePressed;

struct RecentMouseDown
{
int x, y;
int64 time;
Component* component;
};

RecentMouseDown mouseDowns[4];

void incrementMouseClickCounter() throw();
void registerMouseDown (int x, int y, int64 time, Component* component) throw();
void registerMouseDrag (int x, int y) throw();
const Time getLastMouseDownTime() const throw();
int getNumberOfMultipleClicks() const throw();

Component* kioskModeComponent;
Rectangle kioskComponentOriginalBounds;


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

@@ -32,7 +32,7 @@
See also SystemStats::getJUCEVersion() for a string version.
*/
#define JUCE_MAJOR_VERSION 1
#define JUCE_MINOR_VERSION 50
#define JUCE_MINOR_VERSION 51
/** Current Juce version number.


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

@@ -53,45 +53,6 @@ static const int customCommandMessage = 0x7fff0001;
static const int exitModalStateMessage = 0x7fff0002;
//==============================================================================
// these are also used by ComponentPeer
int64 juce_recentMouseDownTimes [4] = { 0, 0, 0, 0 };
int juce_recentMouseDownX [4] = { 0, 0, 0, 0 };
int juce_recentMouseDownY [4] = { 0, 0, 0, 0 };
Component* juce_recentMouseDownComponent [4] = { 0, 0, 0, 0 };
int juce_LastMousePosX = 0;
int juce_LastMousePosY = 0;
int juce_MouseClickCounter = 0;
bool juce_MouseHasMovedSignificantlySincePressed = false;
static int countMouseClicks() throw()
{
int numClicks = 0;
if (juce_recentMouseDownTimes[0] != 0)
{
if (! juce_MouseHasMovedSignificantlySincePressed)
++numClicks;
for (int i = 1; i < numElementsInArray (juce_recentMouseDownTimes); ++i)
{
if (juce_recentMouseDownTimes[0] - juce_recentMouseDownTimes [i]
< (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1)))
&& abs (juce_recentMouseDownX[0] - juce_recentMouseDownX[i]) < 8
&& abs (juce_recentMouseDownY[0] - juce_recentMouseDownY[i]) < 8
&& juce_recentMouseDownComponent[0] == juce_recentMouseDownComponent [i])
{
++numClicks;
}
else
{
break;
}
}
}
return numClicks;
}
static int unboundedMouseOffsetX = 0;
static int unboundedMouseOffsetY = 0;
static bool isUnboundedMouseModeOn = false;
@@ -2281,75 +2242,72 @@ void Component::internalMouseEnter (int x, int y, int64 time)
return;
}
if (! flags.mouseInsideFlag)
if (isValidComponent() && ! flags.mouseInsideFlag)
{
flags.mouseInsideFlag = true;
flags.mouseOverFlag = true;
flags.draggingFlag = false;
if (isValidComponent())
{
const ComponentDeletionWatcher deletionChecker (this);
const ComponentDeletionWatcher deletionChecker (this);
if (flags.repaintOnMouseActivityFlag)
repaint();
if (flags.repaintOnMouseActivityFlag)
repaint();
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
x, y,
Time (time),
0, false);
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
x, y,
Time (time),
0, false);
mouseEnter (me);
mouseEnter (me);
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me);
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
i = jmin (i, Desktop::getInstance().mouseListeners.size());
}
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
if (mouseListeners_ != 0)
{
for (int i = mouseListeners_->size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseEnter (me);
((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, mouseListeners_->size());
}
}
if (mouseListeners_ != 0)
{
for (int i = mouseListeners_->size(); --i >= 0;)
{
((MouseListener*) mouseListeners_->getUnchecked(i))->mouseEnter (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, mouseListeners_->size());
}
}
const Component* p = parentComponent_;
const Component* p = parentComponent_;
while (p != 0)
{
const ComponentDeletionWatcher parentDeletionChecker (p);
while (p != 0)
for (int i = p->numDeepMouseListeners; --i >= 0;)
{
const ComponentDeletionWatcher parentDeletionChecker (p);
((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me);
for (int i = p->numDeepMouseListeners; --i >= 0;)
{
((MouseListener*) (p->mouseListeners_->getUnchecked(i)))->mouseEnter (me);
if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted())
return;
i = jmin (i, p->numDeepMouseListeners);
}
if (deletionChecker.hasBeenDeleted() || parentDeletionChecker.hasBeenDeleted())
return;
p = p->parentComponent_;
i = jmin (i, p->numDeepMouseListeners);
}
p = p->parentComponent_;
}
}
@@ -2442,11 +2400,8 @@ void Component::internalMouseExit (int x, int y, int64 time)
class InternalDragRepeater : public Timer
{
public:
InternalDragRepeater()
{}
~InternalDragRepeater()
{}
InternalDragRepeater() {}
~InternalDragRepeater() {}
void timerCallback()
{
@@ -2467,6 +2422,10 @@ public:
}
juce_UseDebuggingNewOperator
private:
InternalDragRepeater (const InternalDragRepeater&);
InternalDragRepeater& operator= (const InternalDragRepeater&);
};
static InternalDragRepeater* dragRepeater = 0;
@@ -2488,8 +2447,14 @@ void Component::beginDragAutoRepeat (const int interval)
}
//==============================================================================
void Component::internalMouseDown (const int x, const int y)
void Component::internalMouseDown (const int x, const int y, const int64 time)
{
Desktop& desktop = Desktop::getInstance();
int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDown (gx, gy, time, this);
const ComponentDeletionWatcher deletionChecker (this);
if (isCurrentlyBlockedByAnotherModalComponent())
@@ -2507,22 +2472,22 @@ void Component::internalMouseDown (const int x, const int y)
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (juce_recentMouseDownTimes[0]),
Time (time),
x, y,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(),
false);
Desktop::getInstance().resetTimer();
desktop.resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDown (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
return;
@@ -2560,26 +2525,26 @@ void Component::internalMouseDown (const int x, const int y)
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (juce_recentMouseDownTimes[0]),
desktop.getLastMouseDownTime(),
x, y,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
desktop.getLastMouseDownTime(),
desktop.getNumberOfMultipleClicks(),
false);
mouseDown (me);
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
desktop.resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDown (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDown (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
if (mouseListeners_ != 0)
@@ -2621,49 +2586,54 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int
{
if (isValidComponent() && flags.draggingFlag)
{
Desktop& desktop = Desktop::getInstance();
flags.draggingFlag = false;
deleteAndZero (dragRepeater);
x += unboundedMouseOffsetX;
y += unboundedMouseOffsetY;
juce_LastMousePosX = x;
juce_LastMousePosY = y;
relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY);
int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDrag (gx, gy);
const ComponentDeletionWatcher deletionChecker (this);
if (flags.repaintOnMouseActivityFlag)
repaint();
int mdx = juce_recentMouseDownX[0];
int mdy = juce_recentMouseDownY[0];
int mdx, mdy;
Desktop::getLastMouseDownPosition (mdx, mdy);
globalPositionToRelative (mdx, mdy);
const Time lastMouseDownTime (desktop.getLastMouseDownTime());
const MouseEvent me (x, y,
oldModifiers,
this,
Time (time),
mdx, mdy,
Time (juce_recentMouseDownTimes [0]),
countMouseClicks(),
juce_MouseHasMovedSignificantlySincePressed
|| juce_recentMouseDownTimes[0] + 300 < time);
lastMouseDownTime,
desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed
|| time > lastMouseDownTime.toMilliseconds() + 300);
mouseUp (me);
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
desktop.resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseUp (me);
((MouseListener*) desktop.mouseListeners[i])->mouseUp (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
if (mouseListeners_ != 0)
@@ -2708,14 +2678,14 @@ void Component::internalMouseUp (const int oldModifiers, int x, int y, const int
mouseDoubleClick (me);
int i;
for (i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDoubleClick (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDoubleClick (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
for (i = numListeners; --i >= 0;)
@@ -2759,50 +2729,50 @@ void Component::internalMouseDrag (int x, int y, const int64 time)
{
if (isValidComponent() && flags.draggingFlag)
{
Desktop& desktop = Desktop::getInstance();
flags.mouseOverFlag = reallyContains (x, y, false);
x += unboundedMouseOffsetX;
y += unboundedMouseOffsetY;
juce_LastMousePosX = x;
juce_LastMousePosY = y;
relativePositionToGlobal (juce_LastMousePosX, juce_LastMousePosY);
juce_MouseHasMovedSignificantlySincePressed
= juce_MouseHasMovedSignificantlySincePressed
|| abs (juce_recentMouseDownX[0] - juce_LastMousePosX) >= 4
|| abs (juce_recentMouseDownY[0] - juce_LastMousePosY) >= 4;
int gx = x, gy = y;
relativePositionToGlobal (gx, gy);
desktop.registerMouseDrag (gx, gy);
const ComponentDeletionWatcher deletionChecker (this);
int mdx = juce_recentMouseDownX[0];
int mdy = juce_recentMouseDownY[0];
int mdx, mdy;
Desktop::getLastMouseDownPosition (mdx, mdy);
globalPositionToRelative (mdx, mdy);
const Time lastMouseDownTime (desktop.getLastMouseDownTime());
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
Time (time),
mdx, mdy,
Time (juce_recentMouseDownTimes[0]),
countMouseClicks(),
juce_MouseHasMovedSignificantlySincePressed
|| juce_recentMouseDownTimes[0] + 300 < time);
lastMouseDownTime,
desktop.getNumberOfMultipleClicks(),
desktop.mouseMovedSignificantlySincePressed
|| time > lastMouseDownTime.toMilliseconds() + 300);
mouseDrag (me);
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
desktop.resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseDrag (me);
((MouseListener*) desktop.mouseListeners[i])->mouseDrag (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
if (mouseListeners_ != 0)
@@ -2887,6 +2857,8 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
if (isValidComponent())
{
Desktop& desktop = Desktop::getInstance();
const MouseEvent me (x, y,
ModifierKeys::getCurrentModifiers(),
this,
@@ -2898,7 +2870,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
Desktop::getInstance().sendMouseMove();
desktop.sendMouseMove();
}
else
{
@@ -2912,16 +2884,16 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
if (deletionChecker.hasBeenDeleted())
return;
Desktop::getInstance().resetTimer();
desktop.resetTimer();
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseMove (me);
((MouseListener*) desktop.mouseListeners[i])->mouseMove (me);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
if (mouseListeners_ != 0)
@@ -2961,6 +2933,7 @@ void Component::internalMouseMove (const int x, const int y, const int64 time)
void Component::internalMouseWheel (const int intAmountX, const int intAmountY, const int64 time)
{
Desktop& desktop = Desktop::getInstance();
const ComponentDeletionWatcher deletionChecker (this);
const float wheelIncrementX = intAmountX * (1.0f / 256.0f);
@@ -2980,14 +2953,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY,
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
}
else
@@ -2997,14 +2970,14 @@ void Component::internalMouseWheel (const int intAmountX, const int intAmountY,
if (deletionChecker.hasBeenDeleted())
return;
for (int i = Desktop::getInstance().mouseListeners.size(); --i >= 0;)
for (int i = desktop.mouseListeners.size(); --i >= 0;)
{
((MouseListener*) Desktop::getInstance().mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
((MouseListener*) desktop.mouseListeners[i])->mouseWheelMove (me, wheelIncrementX, wheelIncrementY);
if (deletionChecker.hasBeenDeleted())
return;
i = jmin (i, Desktop::getInstance().mouseListeners.size());
i = jmin (i, desktop.mouseListeners.size());
}
if (mouseListeners_ != 0)


+ 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 internalMouseExit (int x, int y, const int64 time);
void internalMouseDown (int x, int y);
void internalMouseDown (int x, int y, const int64 time);
void internalMouseUp (const int oldModifiers, int x, int y, const int64 time);
void internalMouseDrag (int x, int y, const int64 time);
void internalMouseMove (int x, int y, const int64 time);


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

@@ -32,18 +32,17 @@ BEGIN_JUCE_NAMESPACE
#include "juce_ComponentDeletionWatcher.h"
#include "../graphics/geometry/juce_RectangleList.h"
extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords,
const bool clipToWorkArea);
//==============================================================================
static Desktop* juce_desktopInstance = 0;
Desktop::Desktop() throw()
: lastMouseX (0),
lastMouseY (0),
: lastFakeMouseMoveX (0),
lastFakeMouseMoveY (0),
mouseClickCounter (0),
mouseMovedSignificantlySincePressed (false),
kioskModeComponent (0)
{
zerostruct (mouseDowns);
refreshMonitorSizes();
}
@@ -66,6 +65,9 @@ Desktop& JUCE_CALLTYPE Desktop::getInstance() throw()
}
//==============================================================================
extern void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords,
const bool clipToWorkArea);
void Desktop::refreshMonitorSizes() throw()
{
const Array <Rectangle> oldClipped (monitorCoordsClipped);
@@ -206,20 +208,75 @@ void Desktop::componentBroughtToFront (Component* const c) throw()
}
//==============================================================================
// from Component.cpp
extern int juce_recentMouseDownX [4];
extern int juce_recentMouseDownY [4];
extern int juce_MouseClickCounter;
void Desktop::getLastMouseDownPosition (int& x, int& y) throw()
{
x = juce_recentMouseDownX [0];
y = juce_recentMouseDownY [0];
const Desktop& d = getInstance();
x = d.mouseDowns[0].x;
y = d.mouseDowns[0].y;
}
int Desktop::getMouseButtonClickCounter() throw()
{
return juce_MouseClickCounter;
return getInstance().mouseClickCounter;
}
void Desktop::incrementMouseClickCounter() throw()
{
++mouseClickCounter;
}
const Time Desktop::getLastMouseDownTime() const throw()
{
return Time (mouseDowns[0].time);
}
void Desktop::registerMouseDown (int x, int y, int64 time, Component* component) throw()
{
for (int i = numElementsInArray (mouseDowns); --i > 0;)
mouseDowns[i] = mouseDowns[i - 1];
mouseDowns[0].x = x;
mouseDowns[0].y = y;
mouseDowns[0].time = time;
mouseDowns[0].component = component;
mouseMovedSignificantlySincePressed = false;
}
void Desktop::registerMouseDrag (int x, int y) throw()
{
mouseMovedSignificantlySincePressed
= mouseMovedSignificantlySincePressed
|| abs (mouseDowns[0].x - x) >= 4
|| abs (mouseDowns[0].y - y) >= 4;
}
int Desktop::getNumberOfMultipleClicks() const throw()
{
int numClicks = 0;
if (mouseDowns[0].time != 0)
{
if (! mouseMovedSignificantlySincePressed)
++numClicks;
for (int i = 1; i < numElementsInArray (mouseDowns); ++i)
{
if (mouseDowns[0].time - mouseDowns[i].time
< (int) (MouseEvent::getDoubleClickTimeout() * (1.0 + 0.25 * (i - 1)))
&& abs (mouseDowns[0].x - mouseDowns[i].x) < 8
&& abs (mouseDowns[0].y - mouseDowns[i].y) < 8
&& mouseDowns[0].component == mouseDowns[i].component)
{
++numClicks;
}
else
{
break;
}
}
}
return numClicks;
}
//==============================================================================
@@ -274,7 +331,7 @@ void Desktop::timerCallback()
int x, y;
getMousePosition (x, y);
if (lastMouseX != x || lastMouseY != y)
if (lastFakeMouseMoveX != x || lastFakeMouseMoveY != y)
sendMouseMove();
}
@@ -286,8 +343,8 @@ void Desktop::sendMouseMove()
int x, y;
getMousePosition (x, y);
lastMouseX = x;
lastMouseY = y;
lastFakeMouseMoveX = x;
lastFakeMouseMoveY = y;
Component* const target = findComponentAt (x, y);
@@ -328,7 +385,7 @@ void Desktop::resetTimer() throw()
else
startTimer (100);
getMousePosition (lastMouseX, lastMouseY);
getMousePosition (lastFakeMouseMoveX, lastFakeMouseMoveY);
}
//==============================================================================


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

@@ -248,7 +248,24 @@ private:
~Desktop() throw();
Array <Rectangle> monitorCoordsClipped, monitorCoordsUnclipped;
int lastMouseX, lastMouseY;
int lastFakeMouseMoveX, lastFakeMouseMoveY, mouseClickCounter;
bool mouseMovedSignificantlySincePressed;
struct RecentMouseDown
{
int x, y;
int64 time;
Component* component;
};
RecentMouseDown mouseDowns[4];
void incrementMouseClickCounter() throw();
void registerMouseDown (int x, int y, int64 time, Component* component) throw();
void registerMouseDrag (int x, int y) throw();
const Time getLastMouseDownTime() const throw();
int getNumberOfMultipleClicks() const throw();
Component* kioskModeComponent;
Rectangle kioskComponentOriginalBounds;


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

@@ -54,4 +54,16 @@ const ModifierKeys ModifierKeys::getCurrentModifiers() throw()
return ModifierKeys (currentModifierFlags);
}
int ModifierKeys::getNumMouseButtonsDown() const throw()
{
int num = 0;
if (isLeftButtonDown()) ++num;
if (isRightButtonDown()) ++num;
if (isMiddleButtonDown()) ++num;
return num;
}
END_JUCE_NAMESPACE

+ 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. */
inline bool testFlags (const int flagsToTest) const throw() { return (flags & flagsToTest) != 0; }
/** Returns the total number of mouse buttons that are down. */
int getNumMouseButtonsDown() const throw();
//==============================================================================
/** Creates a ModifierKeys object to represent the last-known state of the
keyboard and mouse buttons.


+ 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 VoidArray heavyweightPeers;
@@ -199,46 +188,17 @@ void ComponentPeer::handleMouseMove (int x, int y, const int64 time)
void ComponentPeer::handleMouseDown (int x, int y, const int64 time)
{
++juce_MouseClickCounter;
Desktop::getInstance().incrementMouseClickCounter();
updateCurrentModifiers();
int numMouseButtonsDown = 0;
if (ModifierKeys::getCurrentModifiers().isLeftButtonDown())
++numMouseButtonsDown;
if (ModifierKeys::getCurrentModifiers().isRightButtonDown())
++numMouseButtonsDown;
if (ModifierKeys::getCurrentModifiers().isMiddleButtonDown())
++numMouseButtonsDown;
if (numMouseButtonsDown == 1)
if (ModifierKeys::getCurrentModifiers().getNumMouseButtonsDown() == 1)
{
Component::componentUnderMouse = component->getComponentAt (x, y);
if (Component::componentUnderMouse != 0)
{
// can't set these in the mouseDownInt() method, because it's re-entrant, so do it here..
for (int i = numElementsInArray (juce_recentMouseDownTimes); --i > 0;)
{
juce_recentMouseDownTimes [i] = juce_recentMouseDownTimes [i - 1];
juce_recentMouseDownX [i] = juce_recentMouseDownX [i - 1];
juce_recentMouseDownY [i] = juce_recentMouseDownY [i - 1];
juce_recentMouseDownComponent [i] = juce_recentMouseDownComponent [i - 1];
}
juce_recentMouseDownTimes[0] = time;
juce_recentMouseDownX[0] = x;
juce_recentMouseDownY[0] = y;
juce_recentMouseDownComponent[0] = Component::componentUnderMouse;
relativePositionToGlobal (juce_recentMouseDownX[0], juce_recentMouseDownY[0]);
juce_MouseHasMovedSignificantlySincePressed = false;
component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
Component::componentUnderMouse->internalMouseDown (x, y);
Component::componentUnderMouse->internalMouseDown (x, y, time);
}
}
}
@@ -250,7 +210,6 @@ void ComponentPeer::handleMouseDrag (int x, int y, const int64 time)
if (Component::componentUnderMouse != 0)
{
component->relativePositionToOtherComponent (Component::componentUnderMouse, x, y);
Component::componentUnderMouse->internalMouseDrag (x, y, time);
}
}
@@ -259,18 +218,7 @@ void ComponentPeer::handleMouseUp (const int oldModifiers, int x, int y, const i
{
updateCurrentModifiers();
int numMouseButtonsDown = 0;
if ((oldModifiers & ModifierKeys::leftButtonModifier) != 0)
++numMouseButtonsDown;
if ((oldModifiers & ModifierKeys::rightButtonModifier) != 0)
++numMouseButtonsDown;
if ((oldModifiers & ModifierKeys::middleButtonModifier) != 0)
++numMouseButtonsDown;
if (numMouseButtonsDown == 1)
if (ModifierKeys (oldModifiers).getNumMouseButtonsDown() == 1)
{
const ComponentDeletionWatcher deletionChecker (component);
Component* c = component->getComponentAt (x, y);


Loading…
Cancel
Save