Browse Source

Refactored a few internals of ComponentPeer.

tags/2021-05-28
jules 12 years ago
parent
commit
9c82572dca
5 changed files with 57 additions and 50 deletions
  1. +29
    -0
      modules/juce_gui_basics/components/juce_Desktop.cpp
  2. +5
    -0
      modules/juce_gui_basics/components/juce_Desktop.h
  3. +1
    -1
      modules/juce_gui_basics/native/juce_win32_Windowing.cpp
  4. +22
    -46
      modules/juce_gui_basics/windows/juce_ComponentPeer.cpp
  5. +0
    -3
      modules/juce_gui_basics/windows/juce_ComponentPeer.h

+ 29
- 0
modules/juce_gui_basics/components/juce_Desktop.cpp View File

@@ -140,6 +140,18 @@ void Desktop::componentBroughtToFront (Component* const c)
} }
} }
//==============================================================================
void Desktop::addPeer (ComponentPeer* peer)
{
peers.add (peer);
}
void Desktop::removePeer (ComponentPeer* peer)
{
peers.removeFirstMatchingValue (peer);
triggerFocusCallback();
}
//============================================================================== //==============================================================================
Point<int> Desktop::getMousePosition() Point<int> Desktop::getMousePosition()
{ {
@@ -186,6 +198,23 @@ MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept
return nullptr; return nullptr;
} }
MouseInputSource* Desktop::getOrCreateMouseInputSource (int touchIndex)
{
jassert (touchIndex >= 0 && touchIndex < 100); // sanity-check on number of fingers
for (;;)
{
if (MouseInputSource* mouse = getMouseSource (touchIndex))
return mouse;
if (! addMouseInputSource())
{
jassertfalse; // not enough mouse sources!
return nullptr;
}
}
}
//============================================================================== //==============================================================================
class MouseDragAutoRepeater : public Timer class MouseDragAutoRepeater : public Timer
{ {


+ 5
- 0
modules/juce_gui_basics/components/juce_Desktop.h View File

@@ -397,6 +397,10 @@ private:
ListenerList <FocusChangeListener> focusListeners; ListenerList <FocusChangeListener> focusListeners;
Array <Component*> desktopComponents; Array <Component*> desktopComponents;
Array <ComponentPeer*> peers;
void addPeer (ComponentPeer*);
void removePeer (ComponentPeer*);
Displays displays; Displays displays;
@@ -422,6 +426,7 @@ private:
void timerCallback() override; void timerCallback() override;
void resetTimer(); void resetTimer();
ListenerList <MouseListener>& getMouseListeners(); ListenerList <MouseListener>& getMouseListeners();
MouseInputSource* getOrCreateMouseInputSource (int touchIndex);
void addDesktopComponent (Component*); void addDesktopComponent (Component*);
void removeDesktopComponent (Component*); void removeDesktopComponent (Component*);


+ 1
- 1
modules/juce_gui_basics/native/juce_win32_Windowing.cpp View File

@@ -1534,7 +1534,7 @@ private:
// if the component's not opaque, this won't draw properly unless the platform can support this // if the component's not opaque, this won't draw properly unless the platform can support this
jassert (Desktop::canUseSemiTransparentWindows() || component.isOpaque()); jassert (Desktop::canUseSemiTransparentWindows() || component.isOpaque());
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
{ {
ScopedPointer<LowLevelGraphicsContext> context (component.getLookAndFeel() ScopedPointer<LowLevelGraphicsContext> context (component.getLookAndFeel()


+ 22
- 46
modules/juce_gui_basics/windows/juce_ComponentPeer.cpp View File

@@ -22,7 +22,6 @@
============================================================================== ==============================================================================
*/ */
static Array <ComponentPeer*> heavyweightPeers;
static uint32 lastUniqueID = 1; static uint32 lastUniqueID = 1;
//============================================================================== //==============================================================================
@@ -35,31 +34,32 @@ ComponentPeer::ComponentPeer (Component& comp, const int flags)
fakeMouseMessageSent (false), fakeMouseMessageSent (false),
isWindowMinimised (false) isWindowMinimised (false)
{ {
heavyweightPeers.add (this);
Desktop::getInstance().addPeer (this);
} }
ComponentPeer::~ComponentPeer() ComponentPeer::~ComponentPeer()
{ {
heavyweightPeers.removeFirstMatchingValue (this);
Desktop::getInstance().triggerFocusCallback();
Desktop::getInstance().removePeer (this);
} }
//============================================================================== //==============================================================================
int ComponentPeer::getNumPeers() noexcept int ComponentPeer::getNumPeers() noexcept
{ {
return heavyweightPeers.size();
return Desktop::getInstance().peers.size();
} }
ComponentPeer* ComponentPeer::getPeer (const int index) noexcept ComponentPeer* ComponentPeer::getPeer (const int index) noexcept
{ {
return heavyweightPeers [index];
return Desktop::getInstance().peers [index];
} }
ComponentPeer* ComponentPeer::getPeerFor (const Component* const component) noexcept ComponentPeer* ComponentPeer::getPeerFor (const Component* const component) noexcept
{ {
for (int i = heavyweightPeers.size(); --i >= 0;)
const Array<ComponentPeer*>& peers = Desktop::getInstance().peers;
for (int i = peers.size(); --i >= 0;)
{ {
ComponentPeer* const peer = heavyweightPeers.getUnchecked(i);
ComponentPeer* const peer = peers.getUnchecked(i);
if (&(peer->getComponent()) == component) if (&(peer->getComponent()) == component)
return peer; return peer;
@@ -70,52 +70,28 @@ ComponentPeer* ComponentPeer::getPeerFor (const Component* const component) noex
bool ComponentPeer::isValidPeer (const ComponentPeer* const peer) noexcept bool ComponentPeer::isValidPeer (const ComponentPeer* const peer) noexcept
{ {
return heavyweightPeers.contains (const_cast <ComponentPeer*> (peer));
}
void ComponentPeer::updateCurrentModifiers() noexcept
{
ModifierKeys::updateCurrentModifiers();
return Desktop::getInstance().peers.contains (const_cast <ComponentPeer*> (peer));
} }
//============================================================================== //==============================================================================
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)
{ {
if (MouseInputSource* mouse = getOrCreateMouseInputSource (touchIndex))
if (MouseInputSource* mouse = Desktop::getInstance().getOrCreateMouseInputSource (touchIndex))
mouse->handleEvent (this, positionWithinPeer, time, newMods); 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)
{ {
if (MouseInputSource* mouse = getOrCreateMouseInputSource (touchIndex))
if (MouseInputSource* mouse = Desktop::getInstance().getOrCreateMouseInputSource (touchIndex))
mouse->handleWheel (this, positionWithinPeer, time, wheel); mouse->handleWheel (this, positionWithinPeer, time, wheel);
} }
void ComponentPeer::handleMagnifyGesture (const int touchIndex, const Point<int> positionWithinPeer, void ComponentPeer::handleMagnifyGesture (const int touchIndex, const Point<int> positionWithinPeer,
const int64 time, const float scaleFactor) const int64 time, const float scaleFactor)
{ {
if (MouseInputSource* mouse = getOrCreateMouseInputSource (touchIndex))
if (MouseInputSource* mouse = Desktop::getInstance().getOrCreateMouseInputSource (touchIndex))
mouse->handleMagnifyGesture (this, positionWithinPeer, time, scaleFactor); mouse->handleMagnifyGesture (this, positionWithinPeer, time, scaleFactor);
} }
@@ -170,7 +146,7 @@ Component* ComponentPeer::getTargetForKeyPress()
bool ComponentPeer::handleKeyPress (const int keyCode, const juce_wchar textCharacter) bool ComponentPeer::handleKeyPress (const int keyCode, const juce_wchar textCharacter)
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
bool keyWasUsed = false; bool keyWasUsed = false;
const KeyPress keyInfo (keyCode, const KeyPress keyInfo (keyCode,
@@ -220,7 +196,7 @@ bool ComponentPeer::handleKeyPress (const int keyCode, const juce_wchar textChar
bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown) bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown)
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
bool keyWasUsed = false; bool keyWasUsed = false;
for (Component* target = getTargetForKeyPress(); target != nullptr; target = target->getParentComponent()) for (Component* target = getTargetForKeyPress(); target != nullptr; target = target->getParentComponent())
@@ -251,7 +227,7 @@ bool ComponentPeer::handleKeyUpOrDown (const bool isKeyDown)
void ComponentPeer::handleModifierKeysChange() void ComponentPeer::handleModifierKeysChange()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
Component* target = Desktop::getInstance().getMainMouseSource().getComponentUnderMouse(); Component* target = Desktop::getInstance().getMainMouseSource().getComponentUnderMouse();
@@ -282,7 +258,7 @@ void ComponentPeer::dismissPendingTextInput() {}
//============================================================================== //==============================================================================
void ComponentPeer::handleBroughtToFront() void ComponentPeer::handleBroughtToFront()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
component.internalBroughtToFront(); component.internalBroughtToFront();
} }
@@ -293,7 +269,7 @@ void ComponentPeer::setConstrainer (ComponentBoundsConstrainer* const newConstra
void ComponentPeer::handleMovedOrResized() void ComponentPeer::handleMovedOrResized()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
const bool nowMinimised = isMinimised(); const bool nowMinimised = isMinimised();
@@ -332,7 +308,7 @@ void ComponentPeer::handleMovedOrResized()
void ComponentPeer::handleFocusGain() void ComponentPeer::handleFocusGain()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
if (component.isParentOf (lastFocusedComponent)) if (component.isParentOf (lastFocusedComponent))
{ {
@@ -351,7 +327,7 @@ void ComponentPeer::handleFocusGain()
void ComponentPeer::handleFocusLoss() void ComponentPeer::handleFocusLoss()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
if (component.hasKeyboardFocus (true)) if (component.hasKeyboardFocus (true))
{ {
@@ -375,7 +351,7 @@ Component* ComponentPeer::getLastFocusedSubcomponent() const noexcept
void ComponentPeer::handleScreenSizeChange() void ComponentPeer::handleScreenSizeChange()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
component.parentSizeChanged(); component.parentSizeChanged();
handleMovedOrResized(); handleMovedOrResized();
@@ -458,7 +434,7 @@ namespace DragHelpers
bool ComponentPeer::handleDragMove (const ComponentPeer::DragInfo& info) bool ComponentPeer::handleDragMove (const ComponentPeer::DragInfo& info)
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
Component* const compUnderMouse = component.getComponentAt (info.position); Component* const compUnderMouse = component.getComponentAt (info.position);
@@ -556,7 +532,7 @@ bool ComponentPeer::handleDragDrop (const ComponentPeer::DragInfo& info)
//============================================================================== //==============================================================================
void ComponentPeer::handleUserClosingWindow() void ComponentPeer::handleUserClosingWindow()
{ {
updateCurrentModifiers();
ModifierKeys::updateCurrentModifiers();
component.userTriedToCloseWindow(); component.userTriedToCloseWindow();
} }


+ 0
- 3
modules/juce_gui_basics/windows/juce_ComponentPeer.h View File

@@ -365,8 +365,6 @@ protected:
Rectangle<int> lastNonFullscreenBounds; Rectangle<int> lastNonFullscreenBounds;
ComponentBoundsConstrainer* constrainer; ComponentBoundsConstrainer* constrainer;
static void updateCurrentModifiers() noexcept;
private: private:
//============================================================================== //==============================================================================
WeakReference<Component> lastFocusedComponent, dragAndDropTargetComponent; WeakReference<Component> lastFocusedComponent, dragAndDropTargetComponent;
@@ -374,7 +372,6 @@ 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)
}; };


Loading…
Cancel
Save