Skip to content

Commit

Permalink
MouseInputSource: Eliminate superfluous drag events caused by pressur…
Browse files Browse the repository at this point in the history
…e change

The bug was triggered on Monterey where a pressure of 1 is reported
while a mouse button is being held down. This caused an extra drag
event being triggered between mouse down and up events, even if no
movement occurred.
  • Loading branch information
szarvas committed Feb 15, 2022
1 parent f6e6627 commit 101a886
Show file tree
Hide file tree
Showing 19 changed files with 416 additions and 208 deletions.
24 changes: 24 additions & 0 deletions BREAKING-CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,30 @@ JUCE breaking changes
develop
=======

Change
------
The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and
invalidTiltY members of MouseInputSource have been deprecated.

Possible Issues
---------------
Deprecation warnings will be seen when compiling code which uses these members
and eventually builds will fail when they are later removed from the API.

Workaround
----------
Use the equivalent defaultPressure, defaultOrientation, defaultRotation,
defaultTiltX and defaultTiltY members of MouseInputSource.

Rationale
---------
The deprecated members represent valid values and the isPressureValid() etc.
functions return true when using them. This could be a source of confusion and
may be inviting programming errors. The new names are in line with the ongoing
practice of using these values to provide a neutral default in the absence of
actual OS provided values.


Change
------
Plugin wrappers will no longer call processBlockBypassed() if the wrapped
Expand Down
6 changes: 3 additions & 3 deletions modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ class UnityPeer : public ComponentPeer,
{
ModifierKeys::currentModifiers = mods;

handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::invalidPressure,
juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());
handleMouseEvent (juce::MouseInputSource::mouse, position, mods, juce::MouseInputSource::defaultPressure,
juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis());
}

void forwardKeyPress (int code, String name, ModifierKeys mods)
Expand Down Expand Up @@ -199,7 +199,7 @@ class UnityPeer : public ComponentPeer,

if (! ms.getCurrentModifiers().isLeftButtonDown())
owner.handleMouseEvent (juce::MouseInputSource::mouse, owner.globalToLocal (pos.toFloat()), {},
juce::MouseInputSource::invalidPressure, juce::MouseInputSource::invalidOrientation, juce::Time::currentTimeMillis());
juce::MouseInputSource::defaultPressure, juce::MouseInputSource::defaultOrientation, juce::Time::currentTimeMillis());

lastMousePos = pos;
}
Expand Down
137 changes: 93 additions & 44 deletions modules/juce_gui_basics/components/juce_Component.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2382,10 +2382,16 @@ void Component::internalMouseEnter (MouseInputSource source, Point<float> relati

BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
const auto me = makeMouseEvent (source,
PointerState().withPosition (relativePos),
source.getCurrentModifiers(),
this,
this,
time,
relativePos,
time,
0,
false);
mouseEnter (me);

flags.cachedMouseInsideComponent = true;
Expand Down Expand Up @@ -2414,10 +2420,16 @@ void Component::internalMouseExit (MouseInputSource source, Point<float> relativ

BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
const auto me = makeMouseEvent (source,
PointerState().withPosition (relativePos),
source.getCurrentModifiers(),
this,
this,
time,
relativePos,
time,
0,
false);

mouseExit (me);

Expand All @@ -2429,8 +2441,7 @@ void Component::internalMouseExit (MouseInputSource source, Point<float> relativ
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseExit, me);
}

void Component::internalMouseDown (MouseInputSource source, Point<float> relativePos, Time time,
float pressure, float orientation, float rotation, float tiltX, float tiltY)
void Component::internalMouseDown (MouseInputSource source, const PointerState& relativePointerState, Time time)
{
auto& desktop = Desktop::getInstance();
BailOutChecker checker (this);
Expand All @@ -2448,9 +2459,16 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
if (isCurrentlyBlockedByAnotherModalComponent())
{
// allow blocked mouse-events to go to global listeners..
const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure,
orientation, rotation, tiltX, tiltY, this, this, time, relativePos,
time, source.getNumberOfMultipleClicks(), false);
const auto me = makeMouseEvent (source,
relativePointerState,
source.getCurrentModifiers(),
this,
this,
time,
relativePointerState.position,
time,
source.getNumberOfMultipleClicks(),
false);

desktop.getMouseListeners().callChecked (checker, [&] (MouseListener& l) { l.mouseDown (me); });
return;
Expand Down Expand Up @@ -2481,9 +2499,16 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
if (flags.repaintOnMouseActivityFlag)
repaint();

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), pressure,
orientation, rotation, tiltX, tiltY, this, this, time, relativePos,
time, source.getNumberOfMultipleClicks(), false);
const auto me = makeMouseEvent (source,
relativePointerState,
source.getCurrentModifiers(),
this,
this,
time,
relativePointerState.position,
time,
source.getNumberOfMultipleClicks(),
false);
mouseDown (me);

if (checker.shouldBailOut())
Expand All @@ -2494,8 +2519,7 @@ void Component::internalMouseDown (MouseInputSource source, Point<float> relativ
MouseListenerList::template sendMouseEvent<const MouseEvent&> (*this, checker, &MouseListener::mouseDown, me);
}

void Component::internalMouseUp (MouseInputSource source, Point<float> relativePos, Time time,
const ModifierKeys oldModifiers, float pressure, float orientation, float rotation, float tiltX, float tiltY)
void Component::internalMouseUp (MouseInputSource source, const PointerState& relativePointerState, Time time, const ModifierKeys oldModifiers)
{
if (flags.mouseDownWasBlocked && isCurrentlyBlockedByAnotherModalComponent())
return;
Expand All @@ -2505,12 +2529,16 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
if (flags.repaintOnMouseActivityFlag)
repaint();

const MouseEvent me (source, relativePos, oldModifiers, pressure, orientation,
rotation, tiltX, tiltY, this, this, time,
getLocalPoint (nullptr, source.getLastMouseDownPosition()),
source.getLastMouseDownTime(),
source.getNumberOfMultipleClicks(),
source.isLongPressOrDrag());
const auto me = makeMouseEvent (source,
relativePointerState,
oldModifiers,
this,
this,
time,
getLocalPoint (nullptr, source.getLastMouseDownPosition()),
source.getLastMouseDownTime(),
source.getNumberOfMultipleClicks(),
source.isLongPressOrDrag());
mouseUp (me);

if (checker.shouldBailOut())
Expand All @@ -2537,19 +2565,22 @@ void Component::internalMouseUp (MouseInputSource source, Point<float> relativeP
}
}

void Component::internalMouseDrag (MouseInputSource source, Point<float> relativePos, Time time,
float pressure, float orientation, float rotation, float tiltX, float tiltY)
void Component::internalMouseDrag (MouseInputSource source, const PointerState& relativePointerState, Time time)
{
if (! isCurrentlyBlockedByAnotherModalComponent())
{
BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(),
pressure, orientation, rotation, tiltX, tiltY, this, this, time,
getLocalPoint (nullptr, source.getLastMouseDownPosition()),
source.getLastMouseDownTime(),
source.getNumberOfMultipleClicks(),
source.isLongPressOrDrag());
const auto me = makeMouseEvent (source,
relativePointerState,
source.getCurrentModifiers(),
this,
this,
time,
getLocalPoint (nullptr, source.getLastMouseDownPosition()),
source.getLastMouseDownTime(),
source.getNumberOfMultipleClicks(),
source.isLongPressOrDrag());
mouseDrag (me);

if (checker.shouldBailOut())
Expand All @@ -2574,10 +2605,16 @@ void Component::internalMouseMove (MouseInputSource source, Point<float> relativ
{
BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
const auto me = makeMouseEvent (source,
PointerState().withPosition (relativePos),
source.getCurrentModifiers(),
this,
this,
time,
relativePos,
time,
0,
false);
mouseMove (me);

if (checker.shouldBailOut())
Expand All @@ -2595,10 +2632,16 @@ void Component::internalMouseWheel (MouseInputSource source, Point<float> relati
auto& desktop = Desktop::getInstance();
BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
const auto me = makeMouseEvent (source,
PointerState().withPosition (relativePos),
source.getCurrentModifiers(),
this,
this,
time,
relativePos,
time,
0,
false);

if (isCurrentlyBlockedByAnotherModalComponent())
{
Expand All @@ -2625,10 +2668,16 @@ void Component::internalMagnifyGesture (MouseInputSource source, Point<float> re
auto& desktop = Desktop::getInstance();
BailOutChecker checker (this);

const MouseEvent me (source, relativePos, source.getCurrentModifiers(), MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
this, this, time, relativePos, time, 0, false);
const auto me = makeMouseEvent (source,
PointerState().withPosition (relativePos),
source.getCurrentModifiers(),
this,
this,
time,
relativePos,
time,
0,
false);

if (isCurrentlyBlockedByAnotherModalComponent())
{
Expand Down
6 changes: 3 additions & 3 deletions modules/juce_gui_basics/components/juce_Component.h
Original file line number Diff line number Diff line change
Expand Up @@ -2594,9 +2594,9 @@ class JUCE_API Component : public MouseListener
//==============================================================================
void internalMouseEnter (MouseInputSource, Point<float>, Time);
void internalMouseExit (MouseInputSource, Point<float>, Time);
void internalMouseDown (MouseInputSource, Point<float>, Time, float, float, float, float, float);
void internalMouseUp (MouseInputSource, Point<float>, Time, const ModifierKeys oldModifiers, float, float, float, float, float);
void internalMouseDrag (MouseInputSource, Point<float>, Time, float, float, float, float, float);
void internalMouseDown (MouseInputSource, const PointerState&, Time);
void internalMouseUp (MouseInputSource, const PointerState&, Time, const ModifierKeys oldModifiers);
void internalMouseDrag (MouseInputSource, const PointerState&, Time);
void internalMouseMove (MouseInputSource, Point<float>, Time);
void internalMouseWheel (MouseInputSource, Point<float>, Time, const MouseWheelDetails&);
void internalMagnifyGesture (MouseInputSource, Point<float>, Time, float);
Expand Down
6 changes: 3 additions & 3 deletions modules/juce_gui_basics/desktop/juce_Desktop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,9 +276,9 @@ void Desktop::sendMouseMove()
auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);
auto now = Time::getCurrentTime();

const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::invalidPressure,
MouseInputSource::invalidOrientation, MouseInputSource::invalidRotation,
MouseInputSource::invalidTiltX, MouseInputSource::invalidTiltY,
const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::currentModifiers, MouseInputSource::defaultPressure,
MouseInputSource::defaultOrientation, MouseInputSource::defaultRotation,
MouseInputSource::defaultTiltX, MouseInputSource::defaultTiltY,
target, target, now, pos, now, 0, false);

if (me.mods.isAnyMouseButtonDown())
Expand Down
2 changes: 2 additions & 0 deletions modules/juce_gui_basics/juce_gui_basics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ namespace juce
};
} // namespace juce

#include "mouse/juce_PointerState.h"

#include "accessibility/juce_AccessibilityHandler.cpp"
#include "components/juce_Component.cpp"
#include "components/juce_ComponentListener.cpp"
Expand Down
1 change: 1 addition & 0 deletions modules/juce_gui_basics/juce_gui_basics.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ namespace juce
class Displays;
class AccessibilityHandler;
class KeyboardFocusTraverser;
class PointerState;

class FlexBox;
class Grid;
Expand Down
Loading

0 comments on commit 101a886

Please sign in to comment.