mirror of https://github.com/dcoredump/dexed.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
457 lines
19 KiB
457 lines
19 KiB
/*
|
|
==============================================================================
|
|
|
|
This file is part of the JUCE library.
|
|
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
|
|
Permission is granted to use this software under the terms of either:
|
|
a) the GPL v2 (or any later version)
|
|
b) the Affero GPL v3
|
|
|
|
Details of these licenses can be found at: www.gnu.org/licenses
|
|
|
|
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
To release a closed-source product which uses JUCE, commercial licenses are
|
|
available: visit www.juce.com for more information.
|
|
|
|
==============================================================================
|
|
*/
|
|
|
|
#ifndef JUCE_DESKTOP_H_INCLUDED
|
|
#define JUCE_DESKTOP_H_INCLUDED
|
|
|
|
|
|
//==============================================================================
|
|
/**
|
|
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
|
|
*/
|
|
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.
|
|
|
|
*/
|
|
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.
|
|
*/
|
|
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 paraphenalia 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 device which can be turned around, this is used to inidicate the orientation. */
|
|
enum DisplayOrientation
|
|
{
|
|
upright = 1, /**< Indicates that the display is the normal way up. */
|
|
upsideDown = 2, /**< Indicates that the display is upside-down. */
|
|
rotatedClockwise = 4, /**< Indicates that the display is turned 90 degrees clockwise from its upright position. */
|
|
rotatedAntiClockwise = 8, /**< Indicates that the display 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 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;
|
|
|
|
//==============================================================================
|
|
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();
|
|
#endif
|
|
|
|
private:
|
|
friend class Desktop;
|
|
friend struct ContainerDeletePolicy<Displays>;
|
|
Displays (Desktop&);
|
|
~Displays();
|
|
|
|
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;
|
|
|
|
private:
|
|
//==============================================================================
|
|
static Desktop* instance;
|
|
|
|
friend class Component;
|
|
friend class ComponentPeer;
|
|
friend class MouseInputSourceInternal;
|
|
friend class DeletedAtShutdown;
|
|
friend class TopLevelWindowManager;
|
|
|
|
ScopedPointer<MouseInputSource::SourceList> mouseSources;
|
|
|
|
ListenerList<MouseListener> mouseListeners;
|
|
ListenerList<FocusChangeListener> focusListeners;
|
|
|
|
Array<Component*> desktopComponents;
|
|
Array<ComponentPeer*> peers;
|
|
|
|
ScopedPointer<Displays> displays;
|
|
|
|
Point<int> lastFakeMouseMove;
|
|
void sendMouseMove();
|
|
|
|
int mouseClickCounter, mouseWheelCounter;
|
|
void incrementMouseClickCounter() noexcept;
|
|
void incrementMouseWheelCounter() noexcept;
|
|
|
|
ScopedPointer<LookAndFeel> defaultLookAndFeel;
|
|
WeakReference<LookAndFeel> currentLookAndFeel;
|
|
|
|
Component* kioskModeComponent;
|
|
Rectangle<int> kioskComponentOriginalBounds;
|
|
|
|
int allowedOrientations;
|
|
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 enableOrDisable, bool allowMenusAndBars);
|
|
|
|
void triggerFocusCallback();
|
|
void handleAsyncUpdate() override;
|
|
|
|
static double getDefaultMasterScale();
|
|
|
|
Desktop();
|
|
~Desktop();
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop)
|
|
};
|
|
|
|
|
|
#endif // JUCE_DESKTOP_H_INCLUDED
|
|
|