| @@ -28,7 +28,7 @@ Desktop::Desktop() | |||||
| kioskModeComponent (nullptr), | kioskModeComponent (nullptr), | ||||
| allowedOrientations (allOrientations) | allowedOrientations (allOrientations) | ||||
| { | { | ||||
| createMouseInputSources(); | |||||
| addMouseInputSource(); | |||||
| } | } | ||||
| Desktop::~Desktop() | Desktop::~Desktop() | ||||
| @@ -235,7 +235,8 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Returns the number of MouseInputSource objects the system has at its disposal. | /** Returns the number of MouseInputSource objects the system has at its disposal. | ||||
| In a traditional single-mouse system, there might be only one object. On a multi-touch | In a traditional single-mouse system, there might be only one object. On a multi-touch | ||||
| system, there could be one input source per potential finger. | |||||
| system, there could be one input source per potential finger. The number of mouse | |||||
| sources returned here may increase dynamically as the program runs. | |||||
| To find out how many mouse events are currently happening, use getNumDraggingMouseSources(). | To find out how many mouse events are currently happening, use getNumDraggingMouseSources(). | ||||
| @see getMouseSource | @see getMouseSource | ||||
| */ | */ | ||||
| @@ -383,7 +384,7 @@ private: | |||||
| friend class TopLevelWindowManager; | friend class TopLevelWindowManager; | ||||
| OwnedArray <MouseInputSource> mouseSources; | OwnedArray <MouseInputSource> mouseSources; | ||||
| void createMouseInputSources(); | |||||
| bool addMouseInputSource(); | |||||
| ListenerList <MouseListener> mouseListeners; | ListenerList <MouseListener> mouseListeners; | ||||
| ListenerList <FocusChangeListener> focusListeners; | ListenerList <FocusChangeListener> focusListeners; | ||||
| @@ -600,12 +600,10 @@ Desktop::DisplayOrientation Desktop::getCurrentOrientation() const | |||||
| return upright; | return upright; | ||||
| } | } | ||||
| void Desktop::createMouseInputSources() | |||||
| bool Desktop::addMouseInputSource() | |||||
| { | { | ||||
| // This creates a mouse input source for each possible finger | |||||
| for (int i = 0; i < 10; ++i) | |||||
| mouseSources.add (new MouseInputSource (i, false)); | |||||
| mouseSources.add (new MouseInputSource (mouseSources.size(), false)); | |||||
| return true; | |||||
| } | } | ||||
| Point<int> MouseInputSource::getCurrentMousePosition() | Point<int> MouseInputSource::getCurrentMousePosition() | ||||
| @@ -273,10 +273,10 @@ String SystemClipboard::getTextFromClipboard() | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| void Desktop::createMouseInputSources() | |||||
| bool Desktop::addMouseInputSource() | |||||
| { | { | ||||
| for (int i = 0; i < 10; ++i) | |||||
| mouseSources.add (new MouseInputSource (i, false)); | |||||
| mouseSources.add (new MouseInputSource (mouseSources.size(), false)); | |||||
| return true; | |||||
| } | } | ||||
| bool Desktop::canUseSemiTransparentWindows() noexcept | bool Desktop::canUseSemiTransparentWindows() noexcept | ||||
| @@ -3086,9 +3086,15 @@ void Desktop::Displays::findDisplays() | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| void Desktop::createMouseInputSources() | |||||
| bool Desktop::addMouseInputSource() | |||||
| { | { | ||||
| mouseSources.add (new MouseInputSource (0, true)); | |||||
| if (mouseSources.size() == 0) | |||||
| { | |||||
| mouseSources.add (new MouseInputSource (0, true)); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| bool Desktop::canUseSemiTransparentWindows() noexcept | bool Desktop::canUseSemiTransparentWindows() noexcept | ||||
| @@ -1811,9 +1811,15 @@ void ModifierKeys::updateCurrentModifiers() noexcept | |||||
| //============================================================================== | //============================================================================== | ||||
| void Desktop::createMouseInputSources() | |||||
| bool Desktop::addMouseInputSource() | |||||
| { | { | ||||
| mouseSources.add (new MouseInputSource (0, true)); | |||||
| if (mouseSources.size() == 0) | |||||
| { | |||||
| mouseSources.add (new MouseInputSource (0, true)); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -2915,13 +2915,17 @@ int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconTy | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| void Desktop::createMouseInputSources() | |||||
| bool Desktop::addMouseInputSource() | |||||
| { | { | ||||
| mouseSources.add (new MouseInputSource (0, true)); | |||||
| const int numSources = mouseSources.size(); | |||||
| if (canUseMultiTouch()) | |||||
| for (int i = 1; i <= 10; ++i) | |||||
| mouseSources.add (new MouseInputSource (i, false)); | |||||
| if (numSources == 0 || canUseMultiTouch()) | |||||
| { | |||||
| mouseSources.add (new MouseInputSource (numSources, numSources == 0)); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | } | ||||
| Point<int> MouseInputSource::getCurrentMousePosition() | Point<int> MouseInputSource::getCurrentMousePosition() | ||||
| @@ -80,22 +80,37 @@ void ComponentPeer::updateCurrentModifiers() noexcept | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| MouseInputSource* ComponentPeer::getOrCreateMouseInputSource (int touchIndex) | |||||
| { | |||||
| jassert (touchIndex >= 0 && touchIndex < 100); // sanity-check on number of fingers | |||||
| Desktop& desktop = Desktop::getInstance(); | |||||
| for (;;) | |||||
| { | |||||
| if (MouseInputSource* mouse = desktop.getMouseSource (touchIndex)) | |||||
| return mouse; | |||||
| if (! desktop.addMouseInputSource()) | |||||
| { | |||||
| jassertfalse; // not enough mouse sources! | |||||
| return nullptr; | |||||
| } | |||||
| } | |||||
| } | |||||
| void ComponentPeer::handleMouseEvent (const int touchIndex, const Point<int>& positionWithinPeer, | void ComponentPeer::handleMouseEvent (const int touchIndex, const Point<int>& positionWithinPeer, | ||||
| const ModifierKeys& newMods, const int64 time) | const ModifierKeys& newMods, const int64 time) | ||||
| { | { | ||||
| MouseInputSource* const mouse = Desktop::getInstance().getMouseSource (touchIndex); | |||||
| jassert (mouse != nullptr); // not enough sources! | |||||
| mouse->handleEvent (this, positionWithinPeer, time, newMods); | |||||
| if (MouseInputSource* mouse = getOrCreateMouseInputSource (touchIndex)) | |||||
| mouse->handleEvent (this, positionWithinPeer, time, newMods); | |||||
| } | } | ||||
| void ComponentPeer::handleMouseWheel (const int touchIndex, const Point<int>& positionWithinPeer, | void ComponentPeer::handleMouseWheel (const int touchIndex, const Point<int>& positionWithinPeer, | ||||
| const int64 time, const MouseWheelDetails& wheel) | const int64 time, const MouseWheelDetails& wheel) | ||||
| { | { | ||||
| MouseInputSource* const mouse = Desktop::getInstance().getMouseSource (touchIndex); | |||||
| jassert (mouse != nullptr); // not enough sources! | |||||
| mouse->handleWheel (this, positionWithinPeer, time, wheel); | |||||
| if (MouseInputSource* mouse = getOrCreateMouseInputSource (touchIndex)) | |||||
| mouse->handleWheel (this, positionWithinPeer, time, wheel); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -384,6 +384,7 @@ private: | |||||
| const uint32 uniqueID; | const uint32 uniqueID; | ||||
| bool fakeMouseMessageSent, isWindowMinimised; | bool fakeMouseMessageSent, isWindowMinimised; | ||||
| Component* getTargetForKeyPress(); | Component* getTargetForKeyPress(); | ||||
| static MouseInputSource* getOrCreateMouseInputSource (int); | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentPeer) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentPeer) | ||||
| }; | }; | ||||