upgrade to JUCE 5.4.3. Remove (probably) unused JUCE modules. Remove VST2 target (it's been end-of-life'd by Steinberg and by JUCE)
This commit is contained in:
		@ -42,8 +42,8 @@ namespace juce
 | 
			
		||||
class JUCE_API  CachedComponentImage
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    CachedComponentImage() noexcept {}
 | 
			
		||||
    virtual ~CachedComponentImage() {}
 | 
			
		||||
    CachedComponentImage() = default;
 | 
			
		||||
    virtual ~CachedComponentImage() = default;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Called as part of the parent component's paint method, this must draw
 | 
			
		||||
 | 
			
		||||
@ -65,9 +65,42 @@ public:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename ...Params>
 | 
			
		||||
    // g++ 4.8 cannot deduce the parameter pack inside the function pointer when it has more than one element
 | 
			
		||||
   #if defined(__GNUC__) && __GNUC__ < 5 && ! defined(__clang__)
 | 
			
		||||
    template <typename... Params>
 | 
			
		||||
    static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
 | 
			
		||||
                                void (MouseListener::*eventMethod) (Params...), Params... params)
 | 
			
		||||
                                void (MouseListener::*eventMethod) (const MouseEvent&),
 | 
			
		||||
                                Params... params)
 | 
			
		||||
    {
 | 
			
		||||
        sendMouseEvent <decltype (eventMethod), Params...> (comp, checker, eventMethod, params...);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename... Params>
 | 
			
		||||
    static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
 | 
			
		||||
                                void (MouseListener::*eventMethod) (const MouseEvent&, const MouseWheelDetails&),
 | 
			
		||||
                                Params... params)
 | 
			
		||||
    {
 | 
			
		||||
        sendMouseEvent <decltype (eventMethod), Params...> (comp, checker, eventMethod, params...);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename... Params>
 | 
			
		||||
    static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
 | 
			
		||||
                                void (MouseListener::*eventMethod) (const MouseEvent&, float),
 | 
			
		||||
                                Params... params)
 | 
			
		||||
    {
 | 
			
		||||
        sendMouseEvent <decltype (eventMethod), Params...> (comp, checker, eventMethod, params...);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    template <typename EventMethod, typename... Params>
 | 
			
		||||
    static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
 | 
			
		||||
                                EventMethod eventMethod,
 | 
			
		||||
                                Params... params)
 | 
			
		||||
   #else
 | 
			
		||||
    template <typename... Params>
 | 
			
		||||
    static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker,
 | 
			
		||||
                                void (MouseListener::*eventMethod) (Params...),
 | 
			
		||||
                                Params... params)
 | 
			
		||||
   #endif
 | 
			
		||||
    {
 | 
			
		||||
        if (checker.shouldBailOut())
 | 
			
		||||
            return;
 | 
			
		||||
@ -456,7 +489,7 @@ void Component::setName (const String& name)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    if (componentName != name)
 | 
			
		||||
    {
 | 
			
		||||
@ -482,7 +515,7 @@ void Component::setVisible (bool shouldBeVisible)
 | 
			
		||||
    {
 | 
			
		||||
        // if component methods are being called from threads other than the message
 | 
			
		||||
        // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
        ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
        const WeakReference<Component> safePointer (this);
 | 
			
		||||
        flags.visibleFlag = shouldBeVisible;
 | 
			
		||||
@ -562,7 +595,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (isOpaque())
 | 
			
		||||
        styleWanted &= ~ComponentPeer::windowIsSemiTransparent;
 | 
			
		||||
@ -663,10 +696,12 @@ void Component::removeFromDesktop()
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    if (flags.hasHeavyweightPeerFlag)
 | 
			
		||||
    {
 | 
			
		||||
        ComponentHelpers::releaseAllCachedImageResources (*this);
 | 
			
		||||
 | 
			
		||||
        auto* peer = ComponentPeer::getPeerFor (this);
 | 
			
		||||
        jassert (peer != nullptr);
 | 
			
		||||
 | 
			
		||||
@ -839,7 +874,7 @@ void Component::toFront (bool setAsForeground)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    if (flags.hasHeavyweightPeerFlag)
 | 
			
		||||
    {
 | 
			
		||||
@ -1009,7 +1044,7 @@ int Component::getParentHeight() const noexcept
 | 
			
		||||
 | 
			
		||||
Rectangle<int> Component::getParentMonitorArea() const
 | 
			
		||||
{
 | 
			
		||||
    return Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre()).userArea;
 | 
			
		||||
    return Desktop::getInstance().getDisplays().findDisplayForRect (getScreenBounds()).userArea;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Component::getScreenX() const                       { return getScreenPosition().x; }
 | 
			
		||||
@ -1030,7 +1065,7 @@ void Component::setBounds (int x, int y, int w, int h)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    if (w < 0) w = 0;
 | 
			
		||||
    if (h < 0) h = 0;
 | 
			
		||||
@ -1344,7 +1379,9 @@ void Component::addChildComponent (Component& child, int zOrder)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    jassert (this != &child); // adding a component to itself!?
 | 
			
		||||
 | 
			
		||||
    if (child.parentComponent != this)
 | 
			
		||||
    {
 | 
			
		||||
@ -1420,7 +1457,7 @@ Component* Component::removeChildComponent (int index, bool sendParentEvents, bo
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN
 | 
			
		||||
 | 
			
		||||
    auto* child = childComponentList [index];
 | 
			
		||||
 | 
			
		||||
@ -1607,7 +1644,7 @@ void Component::enterModalState (bool shouldTakeKeyboardFocus,
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (! isCurrentlyModal (false))
 | 
			
		||||
    {
 | 
			
		||||
@ -1784,7 +1821,7 @@ void Component::internalRepaintUnchecked (Rectangle<int> area, bool isEntireComp
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (flags.visibleFlag)
 | 
			
		||||
    {
 | 
			
		||||
@ -2013,8 +2050,8 @@ void Component::setComponentEffect (ImageEffectFilter* newEffect)
 | 
			
		||||
LookAndFeel& Component::getLookAndFeel() const noexcept
 | 
			
		||||
{
 | 
			
		||||
    for (auto* c = this; c != nullptr; c = c->parentComponent)
 | 
			
		||||
        if (c->lookAndFeel != nullptr)
 | 
			
		||||
            return *(c->lookAndFeel);
 | 
			
		||||
        if (auto lf = c->lookAndFeel.get())
 | 
			
		||||
            return *lf;
 | 
			
		||||
 | 
			
		||||
    return LookAndFeel::getDefaultLookAndFeel();
 | 
			
		||||
}
 | 
			
		||||
@ -2164,10 +2201,12 @@ void Component::addComponentListener (ComponentListener* newListener)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS
 | 
			
		||||
   #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS
 | 
			
		||||
    if (getParentComponent() != nullptr)
 | 
			
		||||
        ASSERT_MESSAGE_MANAGER_IS_LOCKED;
 | 
			
		||||
    #endif
 | 
			
		||||
    {
 | 
			
		||||
        JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    }
 | 
			
		||||
   #endif
 | 
			
		||||
 | 
			
		||||
    componentListeners.add (newListener);
 | 
			
		||||
}
 | 
			
		||||
@ -2218,7 +2257,7 @@ void Component::addMouseListener (MouseListener* newListener,
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    // If you register a component as a mouselistener for itself, it'll receive all the events
 | 
			
		||||
    // twice - once via the direct callback that all components get anyway, and then again as a listener!
 | 
			
		||||
@ -2234,7 +2273,7 @@ void Component::removeMouseListener (MouseListener* listenerToRemove)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (mouseListeners != nullptr)
 | 
			
		||||
        mouseListeners->removeListener (listenerToRemove);
 | 
			
		||||
@ -2734,7 +2773,7 @@ void Component::grabKeyboardFocus()
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    grabFocusInternal (focusChangedDirectly, true);
 | 
			
		||||
 | 
			
		||||
@ -2749,7 +2788,7 @@ void Component::moveKeyboardFocusToSibling (bool moveToNext)
 | 
			
		||||
{
 | 
			
		||||
    // if component methods are being called from threads other than the message
 | 
			
		||||
    // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (parentComponent != nullptr)
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -63,7 +63,7 @@ public:
 | 
			
		||||
        callback. Any ComponentListener objects that have registered with it will also have their
 | 
			
		||||
        ComponentListener::componentBeingDeleted() methods called.
 | 
			
		||||
    */
 | 
			
		||||
    virtual ~Component();
 | 
			
		||||
    ~Component() override;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Creates a component, setting its name at the same time.
 | 
			
		||||
@ -867,8 +867,8 @@ public:
 | 
			
		||||
 | 
			
		||||
    /** Changes the default return value for the hitTest() method.
 | 
			
		||||
 | 
			
		||||
        Setting this to false is an easy way to make a component pass its mouse-clicks
 | 
			
		||||
        through to the components behind it.
 | 
			
		||||
        Setting this to false is an easy way to make a component pass all its mouse events
 | 
			
		||||
        (not just clicks) through to the components behind it.
 | 
			
		||||
 | 
			
		||||
        When a component is created, the default setting for this is true.
 | 
			
		||||
 | 
			
		||||
@ -1480,7 +1480,7 @@ public:
 | 
			
		||||
                     the source component in which it occurred
 | 
			
		||||
        @see mouseEnter, mouseExit, mouseDrag, contains
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseMove (const MouseEvent& event) override;
 | 
			
		||||
    void mouseMove (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when the mouse first enters a component.
 | 
			
		||||
 | 
			
		||||
@ -1496,7 +1496,7 @@ public:
 | 
			
		||||
                     the source component in which it occurred
 | 
			
		||||
        @see mouseExit, mouseDrag, mouseMove, contains
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseEnter (const MouseEvent& event) override;
 | 
			
		||||
    void mouseEnter (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when the mouse moves out of a component.
 | 
			
		||||
 | 
			
		||||
@ -1511,7 +1511,7 @@ public:
 | 
			
		||||
                      the source component in which it occurred
 | 
			
		||||
        @see mouseEnter, mouseDrag, mouseMove, contains
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseExit (const MouseEvent& event) override;
 | 
			
		||||
    void mouseExit (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when a mouse button is pressed.
 | 
			
		||||
 | 
			
		||||
@ -1526,7 +1526,7 @@ public:
 | 
			
		||||
                      the source component in which it occurred
 | 
			
		||||
        @see mouseUp, mouseDrag, mouseDoubleClick, contains
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseDown (const MouseEvent& event) override;
 | 
			
		||||
    void mouseDown (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when the mouse is moved while a button is held down.
 | 
			
		||||
 | 
			
		||||
@ -1538,7 +1538,7 @@ public:
 | 
			
		||||
                      the source component in which it occurred
 | 
			
		||||
        @see mouseDown, mouseUp, mouseMove, contains, setDragRepeatInterval
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseDrag (const MouseEvent& event) override;
 | 
			
		||||
    void mouseDrag (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when a mouse button is released.
 | 
			
		||||
 | 
			
		||||
@ -1553,7 +1553,7 @@ public:
 | 
			
		||||
                      the source component in which it occurred
 | 
			
		||||
        @see mouseDown, mouseDrag, mouseDoubleClick, contains
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseUp (const MouseEvent& event) override;
 | 
			
		||||
    void mouseUp (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when a mouse button has been double-clicked on a component.
 | 
			
		||||
 | 
			
		||||
@ -1565,7 +1565,7 @@ public:
 | 
			
		||||
                      the source component in which it occurred
 | 
			
		||||
        @see mouseDown, mouseUp
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseDoubleClick (const MouseEvent& event) override;
 | 
			
		||||
    void mouseDoubleClick (const MouseEvent& event) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when the mouse-wheel is moved.
 | 
			
		||||
 | 
			
		||||
@ -1582,8 +1582,8 @@ public:
 | 
			
		||||
        @param event   details about the mouse event
 | 
			
		||||
        @param wheel   details about the mouse wheel movement
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseWheelMove (const MouseEvent& event,
 | 
			
		||||
                                 const MouseWheelDetails& wheel) override;
 | 
			
		||||
    void mouseWheelMove (const MouseEvent& event,
 | 
			
		||||
                         const MouseWheelDetails& wheel) override;
 | 
			
		||||
 | 
			
		||||
    /** Called when a pinch-to-zoom mouse-gesture is used.
 | 
			
		||||
 | 
			
		||||
@ -1596,7 +1596,7 @@ public:
 | 
			
		||||
                            should be changed. A value of 1.0 would indicate no change,
 | 
			
		||||
                            values greater than 1.0 mean it should be enlarged.
 | 
			
		||||
    */
 | 
			
		||||
    virtual void mouseMagnify (const MouseEvent& event, float scaleFactor) override;
 | 
			
		||||
    void mouseMagnify (const MouseEvent& event, float scaleFactor) override;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Ensures that a non-stop stream of mouse-drag events will be sent during the
 | 
			
		||||
@ -2123,7 +2123,7 @@ public:
 | 
			
		||||
        and you can test whether it's null before using it to see if something has deleted
 | 
			
		||||
        it.
 | 
			
		||||
 | 
			
		||||
        The ComponentType typedef must be Component, or some subclass of Component.
 | 
			
		||||
        The ComponentType template parameter must be Component, or some subclass of Component.
 | 
			
		||||
 | 
			
		||||
        You may also want to use a WeakReference<Component> object for the same purpose.
 | 
			
		||||
    */
 | 
			
		||||
@ -2132,7 +2132,7 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        /** Creates a null SafePointer. */
 | 
			
		||||
        SafePointer() noexcept {}
 | 
			
		||||
        SafePointer() = default;
 | 
			
		||||
 | 
			
		||||
        /** Creates a SafePointer that points at the given component. */
 | 
			
		||||
        SafePointer (ComponentType* component)                : weakRef (component) {}
 | 
			
		||||
@ -2205,7 +2205,7 @@ public:
 | 
			
		||||
        /** Creates a Positioner which can control the specified component. */
 | 
			
		||||
        explicit Positioner (Component& component) noexcept;
 | 
			
		||||
        /** Destructor. */
 | 
			
		||||
        virtual ~Positioner() {}
 | 
			
		||||
        virtual ~Positioner() = default;
 | 
			
		||||
 | 
			
		||||
        /** Returns the component that this positioner controls. */
 | 
			
		||||
        Component& getComponent() const noexcept    { return component; }
 | 
			
		||||
@ -2249,7 +2249,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    /** Sets a flag to indicate whether mouse drag events on this Component should be ignored when it is inside a
 | 
			
		||||
        Viewport with drag-to-scroll functionality enabled. This is useful for Components such as sliders that
 | 
			
		||||
        should not move their parent Viewport when dragged.
 | 
			
		||||
        should not move when their parent Viewport when dragged.
 | 
			
		||||
    */
 | 
			
		||||
    void setViewportIgnoreDragFlag (bool ignoreDrag) noexcept           { flags.viewportIgnoreDragFlag = ignoreDrag; }
 | 
			
		||||
 | 
			
		||||
@ -2280,8 +2280,6 @@ private:
 | 
			
		||||
    std::unique_ptr<CachedComponentImage> cachedImage;
 | 
			
		||||
 | 
			
		||||
    class MouseListenerList;
 | 
			
		||||
    friend class MouseListenerList;
 | 
			
		||||
    friend struct ContainerDeletePolicy<MouseListenerList>;
 | 
			
		||||
    std::unique_ptr<MouseListenerList> mouseListeners;
 | 
			
		||||
    std::unique_ptr<Array<KeyListener*>> keyListeners;
 | 
			
		||||
    ListenerList<ComponentListener> componentListeners;
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@ class JUCE_API  ComponentListener
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~ComponentListener()  {}
 | 
			
		||||
    virtual ~ComponentListener() = default;
 | 
			
		||||
 | 
			
		||||
    /** Called when the component's position or size changes.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,423 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2017 - ROLI Ltd.
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   By using JUCE, you agree to the terms of both the JUCE 5 End-User License
 | 
			
		||||
   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
 | 
			
		||||
   27th April 2017).
 | 
			
		||||
 | 
			
		||||
   End User License Agreement: www.juce.com/juce-5-licence
 | 
			
		||||
   Privacy Policy: www.juce.com/juce-5-privacy-policy
 | 
			
		||||
 | 
			
		||||
   Or: You may also use this code under the terms of the GPL v3 (see
 | 
			
		||||
   www.gnu.org/licenses).
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
Desktop::Desktop()
 | 
			
		||||
    : mouseSources (new MouseInputSource::SourceList()),
 | 
			
		||||
      masterScaleFactor ((float) getDefaultMasterScale())
 | 
			
		||||
{
 | 
			
		||||
    displays.reset (new Displays (*this));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Desktop::~Desktop()
 | 
			
		||||
{
 | 
			
		||||
    setScreenSaverEnabled (true);
 | 
			
		||||
    animator.cancelAllAnimations (false);
 | 
			
		||||
 | 
			
		||||
    jassert (instance == this);
 | 
			
		||||
    instance = nullptr;
 | 
			
		||||
 | 
			
		||||
    // doh! If you don't delete all your windows before exiting, you're going to
 | 
			
		||||
    // be leaking memory!
 | 
			
		||||
    jassert (desktopComponents.size() == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Desktop& JUCE_CALLTYPE Desktop::getInstance()
 | 
			
		||||
{
 | 
			
		||||
    if (instance == nullptr)
 | 
			
		||||
        instance = new Desktop();
 | 
			
		||||
 | 
			
		||||
    return *instance;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Desktop* Desktop::instance = nullptr;
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
int Desktop::getNumComponents() const noexcept
 | 
			
		||||
{
 | 
			
		||||
    return desktopComponents.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Component* Desktop::getComponent (int index) const noexcept
 | 
			
		||||
{
 | 
			
		||||
    return desktopComponents [index];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Component* Desktop::findComponentAt (Point<int> screenPosition) const
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    for (int i = desktopComponents.size(); --i >= 0;)
 | 
			
		||||
    {
 | 
			
		||||
        auto* c = desktopComponents.getUnchecked(i);
 | 
			
		||||
 | 
			
		||||
        if (c->isVisible())
 | 
			
		||||
        {
 | 
			
		||||
            auto relative = c->getLocalPoint (nullptr, screenPosition);
 | 
			
		||||
 | 
			
		||||
            if (c->contains (relative))
 | 
			
		||||
                return c->getComponentAt (relative);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept
 | 
			
		||||
{
 | 
			
		||||
    if (currentLookAndFeel == nullptr)
 | 
			
		||||
    {
 | 
			
		||||
        if (defaultLookAndFeel == nullptr)
 | 
			
		||||
            defaultLookAndFeel.reset (new LookAndFeel_V4());
 | 
			
		||||
 | 
			
		||||
        currentLookAndFeel = defaultLookAndFeel.get();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return *currentLookAndFeel;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    currentLookAndFeel = newDefaultLookAndFeel;
 | 
			
		||||
 | 
			
		||||
    for (int i = getNumComponents(); --i >= 0;)
 | 
			
		||||
        if (auto* c = getComponent (i))
 | 
			
		||||
            c->sendLookAndFeelChange();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void Desktop::addDesktopComponent (Component* c)
 | 
			
		||||
{
 | 
			
		||||
    jassert (c != nullptr);
 | 
			
		||||
    jassert (! desktopComponents.contains (c));
 | 
			
		||||
    desktopComponents.addIfNotAlreadyThere (c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::removeDesktopComponent (Component* c)
 | 
			
		||||
{
 | 
			
		||||
    desktopComponents.removeFirstMatchingValue (c);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::componentBroughtToFront (Component* c)
 | 
			
		||||
{
 | 
			
		||||
    auto index = desktopComponents.indexOf (c);
 | 
			
		||||
    jassert (index >= 0);
 | 
			
		||||
 | 
			
		||||
    if (index >= 0)
 | 
			
		||||
    {
 | 
			
		||||
        int newIndex = -1;
 | 
			
		||||
 | 
			
		||||
        if (! c->isAlwaysOnTop())
 | 
			
		||||
        {
 | 
			
		||||
            newIndex = desktopComponents.size();
 | 
			
		||||
 | 
			
		||||
            while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())
 | 
			
		||||
                --newIndex;
 | 
			
		||||
 | 
			
		||||
            --newIndex;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        desktopComponents.move (index, newIndex);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
Point<int> Desktop::getMousePosition()
 | 
			
		||||
{
 | 
			
		||||
    return getMousePositionFloat().roundToInt();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Point<float> Desktop::getMousePositionFloat()
 | 
			
		||||
{
 | 
			
		||||
    return getInstance().getMainMouseSource().getScreenPosition();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::setMousePosition (Point<int> newPosition)
 | 
			
		||||
{
 | 
			
		||||
    getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Point<int> Desktop::getLastMouseDownPosition()
 | 
			
		||||
{
 | 
			
		||||
    return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Desktop::getMouseButtonClickCounter() const noexcept    { return mouseClickCounter; }
 | 
			
		||||
int Desktop::getMouseWheelMoveCounter() const noexcept      { return mouseWheelCounter; }
 | 
			
		||||
 | 
			
		||||
void Desktop::incrementMouseClickCounter() noexcept         { ++mouseClickCounter; }
 | 
			
		||||
void Desktop::incrementMouseWheelCounter() noexcept         { ++mouseWheelCounter; }
 | 
			
		||||
 | 
			
		||||
const Array<MouseInputSource>& Desktop::getMouseSources() const noexcept        { return mouseSources->sourceArray; }
 | 
			
		||||
int Desktop::getNumMouseSources() const noexcept                                { return mouseSources->sources.size(); }
 | 
			
		||||
int Desktop::getNumDraggingMouseSources() const noexcept                        { return mouseSources->getNumDraggingMouseSources(); }
 | 
			
		||||
MouseInputSource* Desktop::getMouseSource (int index) const noexcept            { return mouseSources->getMouseSource (index); }
 | 
			
		||||
MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept    { return mouseSources->getDraggingMouseSource (index); }
 | 
			
		||||
MouseInputSource Desktop::getMainMouseSource() const noexcept                   { return MouseInputSource (mouseSources->sources.getUnchecked(0)); }
 | 
			
		||||
void Desktop::beginDragAutoRepeat (int interval)                                { mouseSources->beginDragAutoRepeat (interval); }
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void Desktop::addFocusChangeListener    (FocusChangeListener* l)   { focusListeners.add (l); }
 | 
			
		||||
void Desktop::removeFocusChangeListener (FocusChangeListener* l)   { focusListeners.remove (l); }
 | 
			
		||||
void Desktop::triggerFocusCallback()                               { triggerAsyncUpdate(); }
 | 
			
		||||
 | 
			
		||||
void Desktop::handleAsyncUpdate()
 | 
			
		||||
{
 | 
			
		||||
    // The component may be deleted during this operation, but we'll use a SafePointer rather than a
 | 
			
		||||
    // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).
 | 
			
		||||
    WeakReference<Component> currentFocus (Component::getCurrentlyFocusedComponent());
 | 
			
		||||
    focusListeners.call ([&] (FocusChangeListener& l) { l.globalFocusChanged (currentFocus); });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void Desktop::resetTimer()
 | 
			
		||||
{
 | 
			
		||||
    if (mouseListeners.size() == 0)
 | 
			
		||||
        stopTimer();
 | 
			
		||||
    else
 | 
			
		||||
        startTimer (100);
 | 
			
		||||
 | 
			
		||||
    lastFakeMouseMove = getMousePositionFloat();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ListenerList<MouseListener>& Desktop::getMouseListeners()
 | 
			
		||||
{
 | 
			
		||||
    resetTimer();
 | 
			
		||||
    return mouseListeners;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::addGlobalMouseListener (MouseListener* listener)
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    mouseListeners.add (listener);
 | 
			
		||||
    resetTimer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::removeGlobalMouseListener (MouseListener* listener)
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    mouseListeners.remove (listener);
 | 
			
		||||
    resetTimer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::timerCallback()
 | 
			
		||||
{
 | 
			
		||||
    if (lastFakeMouseMove != getMousePositionFloat())
 | 
			
		||||
        sendMouseMove();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::sendMouseMove()
 | 
			
		||||
{
 | 
			
		||||
    if (! mouseListeners.isEmpty())
 | 
			
		||||
    {
 | 
			
		||||
        startTimer (20);
 | 
			
		||||
 | 
			
		||||
        lastFakeMouseMove = getMousePositionFloat();
 | 
			
		||||
 | 
			
		||||
        if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))
 | 
			
		||||
        {
 | 
			
		||||
            Component::BailOutChecker checker (target);
 | 
			
		||||
            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,
 | 
			
		||||
                                 target, target, now, pos, now, 0, false);
 | 
			
		||||
 | 
			
		||||
            if (me.mods.isAnyMouseButtonDown())
 | 
			
		||||
                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });
 | 
			
		||||
            else
 | 
			
		||||
                mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
Desktop::Displays::Displays (Desktop& desktop)   { init (desktop); }
 | 
			
		||||
Desktop::Displays::~Displays()  {}
 | 
			
		||||
 | 
			
		||||
const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    jassert (displays.getReference(0).isMain);
 | 
			
		||||
    return displays.getReference(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const Desktop::Displays::Display& Desktop::Displays::getDisplayContaining (Point<int> position) const noexcept
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    auto* best = &displays.getReference(0);
 | 
			
		||||
    double bestDistance = 1.0e10;
 | 
			
		||||
 | 
			
		||||
    for (auto& d : displays)
 | 
			
		||||
    {
 | 
			
		||||
        if (d.totalArea.contains (position))
 | 
			
		||||
        {
 | 
			
		||||
            best = &d;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auto distance = d.totalArea.getCentre().getDistanceFrom (position);
 | 
			
		||||
 | 
			
		||||
        if (distance < bestDistance)
 | 
			
		||||
        {
 | 
			
		||||
            bestDistance = distance;
 | 
			
		||||
            best = &d;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return *best;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RectangleList<int> Desktop::Displays::getRectangleList (bool userAreasOnly) const
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
    RectangleList<int> rl;
 | 
			
		||||
 | 
			
		||||
    for (auto& d : displays)
 | 
			
		||||
        rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea);
 | 
			
		||||
 | 
			
		||||
    return rl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Rectangle<int> Desktop::Displays::getTotalBounds (bool userAreasOnly) const
 | 
			
		||||
{
 | 
			
		||||
    return getRectangleList (userAreasOnly).getBounds();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;
 | 
			
		||||
bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return d1.userArea == d2.userArea
 | 
			
		||||
        && d1.totalArea == d2.totalArea
 | 
			
		||||
        && d1.scale == d2.scale
 | 
			
		||||
        && d1.isMain == d2.isMain;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept;
 | 
			
		||||
bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return ! (d1 == d2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::Displays::init (Desktop& desktop)
 | 
			
		||||
{
 | 
			
		||||
    findDisplays (desktop.getGlobalScaleFactor());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::Displays::refresh()
 | 
			
		||||
{
 | 
			
		||||
    Array<Display> oldDisplays;
 | 
			
		||||
    oldDisplays.swapWith (displays);
 | 
			
		||||
 | 
			
		||||
    init (Desktop::getInstance());
 | 
			
		||||
 | 
			
		||||
    if (oldDisplays != displays)
 | 
			
		||||
    {
 | 
			
		||||
        for (int i = ComponentPeer::getNumPeers(); --i >= 0;)
 | 
			
		||||
            if (auto* peer = ComponentPeer::getPeer (i))
 | 
			
		||||
                peer->handleScreenSizeChange();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)
 | 
			
		||||
{
 | 
			
		||||
    if (kioskModeReentrant)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);
 | 
			
		||||
 | 
			
		||||
    if (kioskModeComponent != componentToUse)
 | 
			
		||||
    {
 | 
			
		||||
        // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!
 | 
			
		||||
        jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);
 | 
			
		||||
 | 
			
		||||
        if (auto* oldKioskComp = kioskModeComponent)
 | 
			
		||||
        {
 | 
			
		||||
            kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)
 | 
			
		||||
            setKioskComponent (oldKioskComp, false, allowMenusAndBars);
 | 
			
		||||
            oldKioskComp->setBounds (kioskComponentOriginalBounds);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        kioskModeComponent = componentToUse;
 | 
			
		||||
 | 
			
		||||
        if (kioskModeComponent != nullptr)
 | 
			
		||||
        {
 | 
			
		||||
            // Only components that are already on the desktop can be put into kiosk mode!
 | 
			
		||||
            jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr);
 | 
			
		||||
 | 
			
		||||
            kioskComponentOriginalBounds = kioskModeComponent->getBounds();
 | 
			
		||||
            setKioskComponent (kioskModeComponent, true, allowMenusAndBars);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
void Desktop::setOrientationsEnabled (int newOrientations)
 | 
			
		||||
{
 | 
			
		||||
    if (allowedOrientations != newOrientations)
 | 
			
		||||
    {
 | 
			
		||||
        // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.
 | 
			
		||||
        jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);
 | 
			
		||||
 | 
			
		||||
        allowedOrientations = newOrientations;
 | 
			
		||||
        allowedOrientationsChanged();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Desktop::getOrientationsEnabled() const noexcept
 | 
			
		||||
{
 | 
			
		||||
    return allowedOrientations;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept
 | 
			
		||||
{
 | 
			
		||||
    // Make sure you only pass one valid flag in here...
 | 
			
		||||
    jassert (orientation == upright || orientation == upsideDown
 | 
			
		||||
              || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);
 | 
			
		||||
 | 
			
		||||
    return (allowedOrientations & orientation) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept
 | 
			
		||||
{
 | 
			
		||||
    ASSERT_MESSAGE_MANAGER_IS_LOCKED
 | 
			
		||||
 | 
			
		||||
    if (masterScaleFactor != newScaleFactor)
 | 
			
		||||
    {
 | 
			
		||||
        masterScaleFactor = newScaleFactor;
 | 
			
		||||
        displays->refresh();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
@ -1,479 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
 | 
			
		||||
   This file is part of the JUCE library.
 | 
			
		||||
   Copyright (c) 2017 - ROLI Ltd.
 | 
			
		||||
 | 
			
		||||
   JUCE is an open source library subject to commercial or open-source
 | 
			
		||||
   licensing.
 | 
			
		||||
 | 
			
		||||
   By using JUCE, you agree to the terms of both the JUCE 5 End-User License
 | 
			
		||||
   Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
 | 
			
		||||
   27th April 2017).
 | 
			
		||||
 | 
			
		||||
   End User License Agreement: www.juce.com/juce-5-licence
 | 
			
		||||
   Privacy Policy: www.juce.com/juce-5-privacy-policy
 | 
			
		||||
 | 
			
		||||
   Or: You may also use this code under the terms of the GPL v3 (see
 | 
			
		||||
   www.gnu.org/licenses).
 | 
			
		||||
 | 
			
		||||
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
			
		||||
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
			
		||||
   DISCLAIMED.
 | 
			
		||||
 | 
			
		||||
  ==============================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
namespace juce
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Classes can implement this interface and register themselves with the Desktop class
 | 
			
		||||
    to receive callbacks when the currently focused component changes.
 | 
			
		||||
 | 
			
		||||
    @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener
 | 
			
		||||
 | 
			
		||||
    @tags{GUI}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  FocusChangeListener
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    virtual ~FocusChangeListener()  {}
 | 
			
		||||
 | 
			
		||||
    /** Callback to indicate that the currently focused component has changed. */
 | 
			
		||||
    virtual void globalFocusChanged (Component* focusedComponent) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//==============================================================================
 | 
			
		||||
/**
 | 
			
		||||
    Describes and controls aspects of the computer's desktop.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @tags{GUI}
 | 
			
		||||
*/
 | 
			
		||||
class JUCE_API  Desktop  : private DeletedAtShutdown,
 | 
			
		||||
                           private Timer,
 | 
			
		||||
                           private AsyncUpdater
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** There's only one desktop object, and this method will return it. */
 | 
			
		||||
    static Desktop& JUCE_CALLTYPE getInstance();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the mouse position.
 | 
			
		||||
 | 
			
		||||
        The coordinates are relative to the top-left of the main monitor.
 | 
			
		||||
 | 
			
		||||
        Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and
 | 
			
		||||
        you should only resort to grabbing the global mouse position if there's really no
 | 
			
		||||
        way to get the coordinates via a mouse event callback instead.
 | 
			
		||||
    */
 | 
			
		||||
    static Point<int> getMousePosition();
 | 
			
		||||
 | 
			
		||||
    /** Makes the mouse pointer jump to a given location.
 | 
			
		||||
        The coordinates are relative to the top-left of the main monitor.
 | 
			
		||||
        Note that this is a pretty old method, kept around mainly for backwards-compatibility,
 | 
			
		||||
        and you should use the MouseInputSource class directly in new code.
 | 
			
		||||
    */
 | 
			
		||||
    static void setMousePosition (Point<int> newPosition);
 | 
			
		||||
 | 
			
		||||
    /** Returns the last position at which a mouse button was pressed.
 | 
			
		||||
 | 
			
		||||
        Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(),
 | 
			
		||||
        and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to
 | 
			
		||||
        get this information via other means, such as MouseEvent::getMouseDownScreenPosition()
 | 
			
		||||
        if possible, and only ever call this as a last resort.
 | 
			
		||||
    */
 | 
			
		||||
    static Point<int> getLastMouseDownPosition();
 | 
			
		||||
 | 
			
		||||
    /** Returns the number of times the mouse button has been clicked since the app started.
 | 
			
		||||
        Each mouse-down event increments this number by 1.
 | 
			
		||||
        @see getMouseWheelMoveCounter
 | 
			
		||||
    */
 | 
			
		||||
    int getMouseButtonClickCounter() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns the number of times the mouse wheel has been moved since the app started.
 | 
			
		||||
        Each mouse-wheel event increments this number by 1.
 | 
			
		||||
        @see getMouseButtonClickCounter
 | 
			
		||||
    */
 | 
			
		||||
    int getMouseWheelMoveCounter() const noexcept;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** This lets you prevent the screensaver from becoming active.
 | 
			
		||||
 | 
			
		||||
        Handy if you're running some sort of presentation app where having a screensaver
 | 
			
		||||
        appear would be annoying.
 | 
			
		||||
 | 
			
		||||
        Pass false to disable the screensaver, and true to re-enable it. (Note that this
 | 
			
		||||
        won't enable a screensaver unless the user has actually set one up).
 | 
			
		||||
 | 
			
		||||
        The disablement will only happen while the JUCE application is the foreground
 | 
			
		||||
        process - if another task is running in front of it, then the screensaver will
 | 
			
		||||
        be unaffected.
 | 
			
		||||
 | 
			
		||||
        @see isScreenSaverEnabled
 | 
			
		||||
    */
 | 
			
		||||
    static void setScreenSaverEnabled (bool isEnabled);
 | 
			
		||||
 | 
			
		||||
    /** Returns true if the screensaver has not been turned off.
 | 
			
		||||
 | 
			
		||||
        This will return the last value passed into setScreenSaverEnabled(). Note that
 | 
			
		||||
        it won't tell you whether the user is actually using a screen saver, just
 | 
			
		||||
        whether this app is deliberately preventing one from running.
 | 
			
		||||
 | 
			
		||||
        @see setScreenSaverEnabled
 | 
			
		||||
    */
 | 
			
		||||
    static bool isScreenSaverEnabled();
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Registers a MouseListener that will receive all mouse events that occur on
 | 
			
		||||
        any component.
 | 
			
		||||
 | 
			
		||||
        @see removeGlobalMouseListener
 | 
			
		||||
    */
 | 
			
		||||
    void addGlobalMouseListener (MouseListener* listener);
 | 
			
		||||
 | 
			
		||||
    /** Unregisters a MouseListener that was added with the addGlobalMouseListener()
 | 
			
		||||
        method.
 | 
			
		||||
 | 
			
		||||
        @see addGlobalMouseListener
 | 
			
		||||
    */
 | 
			
		||||
    void removeGlobalMouseListener (MouseListener* listener);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Registers a MouseListener that will receive a callback whenever the focused
 | 
			
		||||
        component changes.
 | 
			
		||||
    */
 | 
			
		||||
    void addFocusChangeListener (FocusChangeListener* listener);
 | 
			
		||||
 | 
			
		||||
    /** Unregisters a listener that was added with addFocusChangeListener(). */
 | 
			
		||||
    void removeFocusChangeListener (FocusChangeListener* listener);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Takes a component and makes it full-screen, removing the taskbar, dock, etc.
 | 
			
		||||
 | 
			
		||||
        The component must already be on the desktop for this method to work. It will
 | 
			
		||||
        be resized to completely fill the screen and any extraneous taskbars, menu bars,
 | 
			
		||||
        etc will be hidden.
 | 
			
		||||
 | 
			
		||||
        To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called,
 | 
			
		||||
        the component that's currently being used will be resized back to the size
 | 
			
		||||
        and position it was in before being put into this mode.
 | 
			
		||||
 | 
			
		||||
        If allowMenusAndBars is true, things like the menu and dock (on mac) are still
 | 
			
		||||
        allowed to pop up when the mouse moves onto them. If this is false, it'll try
 | 
			
		||||
        to hide as much on-screen paraphernalia as possible.
 | 
			
		||||
    */
 | 
			
		||||
    void setKioskModeComponent (Component* componentToUse,
 | 
			
		||||
                                bool allowMenusAndBars = true);
 | 
			
		||||
 | 
			
		||||
    /** Returns the component that is currently being used in kiosk-mode.
 | 
			
		||||
 | 
			
		||||
        This is the component that was last set by setKioskModeComponent(). If none
 | 
			
		||||
        has been set, this returns nullptr.
 | 
			
		||||
    */
 | 
			
		||||
    Component* getKioskModeComponent() const noexcept               { return kioskModeComponent; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the number of components that are currently active as top-level
 | 
			
		||||
        desktop windows.
 | 
			
		||||
 | 
			
		||||
        @see getComponent, Component::addToDesktop
 | 
			
		||||
    */
 | 
			
		||||
    int getNumComponents() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns one of the top-level desktop window components.
 | 
			
		||||
 | 
			
		||||
        The index is from 0 to getNumComponents() - 1. This could return 0 if the
 | 
			
		||||
        index is out-of-range.
 | 
			
		||||
 | 
			
		||||
        @see getNumComponents, Component::addToDesktop
 | 
			
		||||
    */
 | 
			
		||||
    Component* getComponent (int index) const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Finds the component at a given screen location.
 | 
			
		||||
 | 
			
		||||
        This will drill down into top-level windows to find the child component at
 | 
			
		||||
        the given position.
 | 
			
		||||
 | 
			
		||||
        Returns nullptr if the coordinates are inside a non-JUCE window.
 | 
			
		||||
    */
 | 
			
		||||
    Component* findComponentAt (Point<int> screenPosition) const;
 | 
			
		||||
 | 
			
		||||
    /** The Desktop object has a ComponentAnimator instance which can be used for performing
 | 
			
		||||
        your animations.
 | 
			
		||||
 | 
			
		||||
        Having a single shared ComponentAnimator object makes it more efficient when multiple
 | 
			
		||||
        components are being moved around simultaneously. It's also more convenient than having
 | 
			
		||||
        to manage your own instance of one.
 | 
			
		||||
 | 
			
		||||
        @see ComponentAnimator
 | 
			
		||||
    */
 | 
			
		||||
    ComponentAnimator& getAnimator() noexcept                       { return animator; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Returns the current default look-and-feel for components which don't have one
 | 
			
		||||
        explicitly set.
 | 
			
		||||
        @see setDefaultLookAndFeel
 | 
			
		||||
    */
 | 
			
		||||
    LookAndFeel& getDefaultLookAndFeel() noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Changes the default look-and-feel.
 | 
			
		||||
        @param newDefaultLookAndFeel    the new look-and-feel object to use - if this is
 | 
			
		||||
                                        set to nullptr, it will revert to using the system's
 | 
			
		||||
                                        default one. The object passed-in must be deleted by the
 | 
			
		||||
                                        caller when it's no longer needed.
 | 
			
		||||
        @see getDefaultLookAndFeel
 | 
			
		||||
    */
 | 
			
		||||
    void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Provides access to the array of mouse sources, for iteration.
 | 
			
		||||
        In a traditional single-mouse system, there might be only one MouseInputSource. On a
 | 
			
		||||
        multi-touch 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().
 | 
			
		||||
    */
 | 
			
		||||
    const Array<MouseInputSource>& getMouseSources() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns the number of MouseInputSource objects the system has at its disposal.
 | 
			
		||||
        In a traditional single-mouse system, there might be only one MouseInputSource. On a
 | 
			
		||||
        multi-touch 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().
 | 
			
		||||
        @see getMouseSource
 | 
			
		||||
    */
 | 
			
		||||
    int getNumMouseSources() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns one of the system's MouseInputSource objects.
 | 
			
		||||
        The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return
 | 
			
		||||
        a null pointer.
 | 
			
		||||
        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.
 | 
			
		||||
    */
 | 
			
		||||
    MouseInputSource* getMouseSource (int index) const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns the main mouse input device that the system is using.
 | 
			
		||||
        @see getNumMouseSources()
 | 
			
		||||
    */
 | 
			
		||||
    MouseInputSource getMainMouseSource() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns the number of mouse-sources that are currently being dragged.
 | 
			
		||||
        In a traditional single-mouse system, this will be 0 or 1, depending on whether a
 | 
			
		||||
        JUCE component has the button down on it. In a multi-touch system, this could
 | 
			
		||||
        be any number from 0 to the number of simultaneous touches that can be detected.
 | 
			
		||||
    */
 | 
			
		||||
    int getNumDraggingMouseSources() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns one of the mouse sources that's currently being dragged.
 | 
			
		||||
        The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is
 | 
			
		||||
        out of range, or if no mice or fingers are down, this will return a null pointer.
 | 
			
		||||
    */
 | 
			
		||||
    MouseInputSource* getDraggingMouseSource (int index) const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Ensures that a non-stop stream of mouse-drag events will be sent during the
 | 
			
		||||
        current mouse-drag operation.
 | 
			
		||||
 | 
			
		||||
        This allows you to make sure that mouseDrag() events are sent continuously, even
 | 
			
		||||
        when the mouse isn't moving. This can be useful for things like auto-scrolling
 | 
			
		||||
        components when the mouse is near an edge.
 | 
			
		||||
 | 
			
		||||
        Call this method during a mouseDown() or mouseDrag() callback, specifying the
 | 
			
		||||
        minimum interval between consecutive mouse drag callbacks. The callbacks
 | 
			
		||||
        will continue until the mouse is released, and then the interval will be reset,
 | 
			
		||||
        so you need to make sure it's called every time you begin a drag event.
 | 
			
		||||
        Passing an interval of 0 or less will cancel the auto-repeat.
 | 
			
		||||
 | 
			
		||||
        @see mouseDrag
 | 
			
		||||
    */
 | 
			
		||||
    void beginDragAutoRepeat (int millisecondsBetweenCallbacks);
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** In a tablet/mobile device which can be turned around, this is used to indicate the orientation. */
 | 
			
		||||
    enum DisplayOrientation
 | 
			
		||||
    {
 | 
			
		||||
        upright                 = 1,  /**< Indicates that the device is the normal way up. */
 | 
			
		||||
        upsideDown              = 2,  /**< Indicates that the device is upside-down. */
 | 
			
		||||
        rotatedClockwise        = 4,  /**< Indicates that the device is turned 90 degrees clockwise from its upright position. */
 | 
			
		||||
        rotatedAntiClockwise    = 8,  /**< Indicates that the device is turned 90 degrees anti-clockwise from its upright position. */
 | 
			
		||||
 | 
			
		||||
        allOrientations         = 1 + 2 + 4 + 8   /**< A combination of all the orientation values */
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /** In a tablet device which can be turned around, this returns the current orientation. */
 | 
			
		||||
    DisplayOrientation getCurrentOrientation() const;
 | 
			
		||||
 | 
			
		||||
    /** Sets which orientations the display is allowed to auto-rotate to.
 | 
			
		||||
 | 
			
		||||
        For devices that support rotating desktops, this lets you specify which of the orientations your app can use.
 | 
			
		||||
 | 
			
		||||
        The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one
 | 
			
		||||
        set bit.
 | 
			
		||||
    */
 | 
			
		||||
    void setOrientationsEnabled (int allowedOrientations);
 | 
			
		||||
 | 
			
		||||
    /** Returns the set of orientations the display is allowed to rotate to.
 | 
			
		||||
        @see setOrientationsEnabled
 | 
			
		||||
    */
 | 
			
		||||
    int getOrientationsEnabled() const noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns whether the display is allowed to auto-rotate to the given orientation.
 | 
			
		||||
        Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed.
 | 
			
		||||
    */
 | 
			
		||||
    bool isOrientationEnabled (DisplayOrientation orientation) const noexcept;
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Manages details about connected display devices */
 | 
			
		||||
    class JUCE_API  Displays
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        /** Contains details about a display device. */
 | 
			
		||||
        struct Display
 | 
			
		||||
        {
 | 
			
		||||
            /** This is the bounds of the area of this display which isn't covered by
 | 
			
		||||
                OS-dependent objects like the taskbar, menu bar, etc. */
 | 
			
		||||
            Rectangle<int> userArea;
 | 
			
		||||
 | 
			
		||||
            /** This is the total physical area of this display, including any taskbars, etc */
 | 
			
		||||
            Rectangle<int> totalArea;
 | 
			
		||||
 | 
			
		||||
            /** This is the scale-factor of this display.
 | 
			
		||||
                If you create a component with size 1x1, this scale factor indicates the actual
 | 
			
		||||
                size of the component in terms of physical pixels.
 | 
			
		||||
                For higher-resolution displays, it may be a value greater than 1.0
 | 
			
		||||
            */
 | 
			
		||||
            double scale;
 | 
			
		||||
 | 
			
		||||
            /** The DPI of the display.
 | 
			
		||||
                This is the number of physical pixels per inch. To get the number of logical
 | 
			
		||||
                pixels per inch, divide this by the Display::scale value.
 | 
			
		||||
            */
 | 
			
		||||
            double dpi;
 | 
			
		||||
 | 
			
		||||
            /** This will be true if this is the user's main screen. */
 | 
			
		||||
            bool isMain;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        /** Returns the display which acts as user's main screen. */
 | 
			
		||||
        const Display& getMainDisplay() const noexcept;
 | 
			
		||||
 | 
			
		||||
        /** Returns the display which contains a particular point.
 | 
			
		||||
            If the point lies outside all the displays, the nearest one will be returned.
 | 
			
		||||
        */
 | 
			
		||||
        const Display& getDisplayContaining (Point<int> position) const noexcept;
 | 
			
		||||
 | 
			
		||||
        /** Returns a RectangleList made up of all the displays. */
 | 
			
		||||
        RectangleList<int> getRectangleList (bool userAreasOnly) const;
 | 
			
		||||
 | 
			
		||||
        /** Returns the smallest bounding box which contains all the displays. */
 | 
			
		||||
        Rectangle<int> getTotalBounds (bool userAreasOnly) const;
 | 
			
		||||
 | 
			
		||||
        /** The list of displays. */
 | 
			
		||||
        Array<Display> displays;
 | 
			
		||||
 | 
			
		||||
       #ifndef DOXYGEN
 | 
			
		||||
        /** @internal */
 | 
			
		||||
        void refresh();
 | 
			
		||||
        /** @internal */
 | 
			
		||||
        ~Displays();
 | 
			
		||||
       #endif
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        friend class Desktop;
 | 
			
		||||
        Displays (Desktop&);
 | 
			
		||||
 | 
			
		||||
        void init (Desktop&);
 | 
			
		||||
        void findDisplays (float masterScale);
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const Displays& getDisplays() const noexcept        { return *displays; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** Sets a global scale factor to be used for all desktop windows.
 | 
			
		||||
        Setting this will also scale the monitor sizes that are returned by getDisplays().
 | 
			
		||||
    */
 | 
			
		||||
    void setGlobalScaleFactor (float newScaleFactor) noexcept;
 | 
			
		||||
 | 
			
		||||
    /** Returns the current global scale factor, as set by setGlobalScaleFactor().
 | 
			
		||||
        @see setGlobalScaleFactor
 | 
			
		||||
    */
 | 
			
		||||
    float getGlobalScaleFactor() const noexcept         { return masterScaleFactor; }
 | 
			
		||||
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    /** True if the OS supports semitransparent windows */
 | 
			
		||||
    static bool canUseSemiTransparentWindows() noexcept;
 | 
			
		||||
 | 
			
		||||
   #if JUCE_MAC
 | 
			
		||||
    /** OSX-specific function to check for the "dark" title-bar and menu mode. */
 | 
			
		||||
    static bool isOSXDarkModeActive();
 | 
			
		||||
   #endif
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    static Desktop* instance;
 | 
			
		||||
 | 
			
		||||
    friend class Component;
 | 
			
		||||
    friend class ComponentPeer;
 | 
			
		||||
    friend class MouseInputSourceInternal;
 | 
			
		||||
    friend class DeletedAtShutdown;
 | 
			
		||||
    friend class TopLevelWindowManager;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<MouseInputSource::SourceList> mouseSources;
 | 
			
		||||
 | 
			
		||||
    ListenerList<MouseListener> mouseListeners;
 | 
			
		||||
    ListenerList<FocusChangeListener> focusListeners;
 | 
			
		||||
 | 
			
		||||
    Array<Component*> desktopComponents;
 | 
			
		||||
    Array<ComponentPeer*> peers;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<Displays> displays;
 | 
			
		||||
 | 
			
		||||
    Point<float> lastFakeMouseMove;
 | 
			
		||||
    void sendMouseMove();
 | 
			
		||||
 | 
			
		||||
    int mouseClickCounter = 0, mouseWheelCounter = 0;
 | 
			
		||||
    void incrementMouseClickCounter() noexcept;
 | 
			
		||||
    void incrementMouseWheelCounter() noexcept;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<LookAndFeel> defaultLookAndFeel;
 | 
			
		||||
    WeakReference<LookAndFeel> currentLookAndFeel;
 | 
			
		||||
 | 
			
		||||
    Component* kioskModeComponent = nullptr;
 | 
			
		||||
    Rectangle<int> kioskComponentOriginalBounds;
 | 
			
		||||
    bool kioskModeReentrant = false;
 | 
			
		||||
 | 
			
		||||
    int allowedOrientations = allOrientations;
 | 
			
		||||
    void allowedOrientationsChanged();
 | 
			
		||||
 | 
			
		||||
    float masterScaleFactor;
 | 
			
		||||
 | 
			
		||||
    ComponentAnimator animator;
 | 
			
		||||
 | 
			
		||||
    void timerCallback() override;
 | 
			
		||||
    void resetTimer();
 | 
			
		||||
    ListenerList<MouseListener>& getMouseListeners();
 | 
			
		||||
 | 
			
		||||
    void addDesktopComponent (Component*);
 | 
			
		||||
    void removeDesktopComponent (Component*);
 | 
			
		||||
    void componentBroughtToFront (Component*);
 | 
			
		||||
 | 
			
		||||
    void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);
 | 
			
		||||
 | 
			
		||||
    void triggerFocusCallback();
 | 
			
		||||
    void handleAsyncUpdate() override;
 | 
			
		||||
 | 
			
		||||
    static Point<float> getMousePositionFloat();
 | 
			
		||||
 | 
			
		||||
    static double getDefaultMasterScale();
 | 
			
		||||
 | 
			
		||||
    Desktop();
 | 
			
		||||
    ~Desktop();
 | 
			
		||||
 | 
			
		||||
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace juce
 | 
			
		||||
@ -254,7 +254,7 @@ bool ModalComponentManager::cancelAllModalComponents()
 | 
			
		||||
int ModalComponentManager::runEventLoopForCurrentComponent()
 | 
			
		||||
{
 | 
			
		||||
    // This can only be run from the message thread!
 | 
			
		||||
    jassert (MessageManager::getInstance()->isThisTheMessageThread());
 | 
			
		||||
    JUCE_ASSERT_MESSAGE_THREAD
 | 
			
		||||
 | 
			
		||||
    int returnValue = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -57,10 +57,10 @@ public:
 | 
			
		||||
    {
 | 
			
		||||
    public:
 | 
			
		||||
        /** */
 | 
			
		||||
        Callback() {}
 | 
			
		||||
        Callback() = default;
 | 
			
		||||
 | 
			
		||||
        /** Destructor. */
 | 
			
		||||
        virtual ~Callback() {}
 | 
			
		||||
        virtual ~Callback() = default;
 | 
			
		||||
 | 
			
		||||
        /** Called to indicate that a modal component has been dismissed.
 | 
			
		||||
 | 
			
		||||
@ -134,17 +134,16 @@ protected:
 | 
			
		||||
    ModalComponentManager();
 | 
			
		||||
 | 
			
		||||
    /** Destructor. */
 | 
			
		||||
    ~ModalComponentManager();
 | 
			
		||||
    ~ModalComponentManager() override;
 | 
			
		||||
 | 
			
		||||
    /** @internal */
 | 
			
		||||
    void handleAsyncUpdate() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    //==============================================================================
 | 
			
		||||
    struct ModalItem;
 | 
			
		||||
 | 
			
		||||
    friend class Component;
 | 
			
		||||
    friend struct ContainerDeletePolicy<ModalItem>;
 | 
			
		||||
 | 
			
		||||
    struct ModalItem;
 | 
			
		||||
    OwnedArray<ModalItem> stack;
 | 
			
		||||
 | 
			
		||||
    void startModal (Component*, bool autoDelete);
 | 
			
		||||
@ -161,7 +160,7 @@ private:
 | 
			
		||||
 | 
			
		||||
    @tags{GUI}
 | 
			
		||||
*/
 | 
			
		||||
class ModalCallbackFunction
 | 
			
		||||
class JUCE_API ModalCallbackFunction
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    /** This is a utility function to create a ModalComponentManager::Callback that will
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user