Describes and controls aspects of the computer's desktop. More...
#include <juce_Desktop.h>
Public Types | |
enum | DisplayOrientation { upright = 1, upsideDown = 2, rotatedClockwise = 4, rotatedAntiClockwise = 8, allOrientations = 1 + 2 + 4 + 8 } |
In a tablet/mobile device which can be turned around, this is used to indicate the orientation. More... | |
Public Member Functions | |
void | addDarkModeSettingListener (DarkModeSettingListener *listener) |
Registers a DarkModeSettingListener that will receive a callback when the operating system dark mode setting changes. More... | |
void | addFocusChangeListener (FocusChangeListener *listener) |
Registers a FocusChangeListener that will receive a callback whenever the focused component changes. More... | |
void | addGlobalMouseListener (MouseListener *listener) |
Registers a MouseListener that will receive all mouse events that occur on any component. More... | |
void | beginDragAutoRepeat (int millisecondsBetweenCallbacks) |
Ensures that a non-stop stream of mouse-drag events will be sent during the current mouse-drag operation. More... | |
Component * | findComponentAt (Point< int > screenPosition) const |
Finds the component at a given screen location. More... | |
ComponentAnimator & | getAnimator () noexcept |
The Desktop object has a ComponentAnimator instance which can be used for performing your animations. More... | |
Component * | getComponent (int index) const noexcept |
Returns one of the top-level desktop window components. More... | |
DisplayOrientation | getCurrentOrientation () const |
In a tablet device which can be turned around, this returns the current orientation. More... | |
LookAndFeel & | getDefaultLookAndFeel () noexcept |
Returns the current default look-and-feel for components which don't have one explicitly set. More... | |
const Displays & | getDisplays () const noexcept |
Returns the Displays object representing the connected displays. More... | |
MouseInputSource * | getDraggingMouseSource (int index) const noexcept |
Returns one of the mouse sources that's currently being dragged. More... | |
float | getGlobalScaleFactor () const noexcept |
Returns the current global scale factor, as set by setGlobalScaleFactor(). More... | |
Component * | getKioskModeComponent () const noexcept |
Returns the component that is currently being used in kiosk-mode. More... | |
MouseInputSource | getMainMouseSource () const noexcept |
Returns the main mouse input device that the system is using. More... | |
int | getMouseButtonClickCounter () const noexcept |
Returns the number of times the mouse button has been clicked since the app started. More... | |
MouseInputSource * | getMouseSource (int index) const noexcept |
Returns one of the system's MouseInputSource objects. More... | |
const Array< MouseInputSource > & | getMouseSources () const noexcept |
Provides access to the array of mouse sources, for iteration. More... | |
int | getMouseWheelMoveCounter () const noexcept |
Returns the number of times the mouse wheel has been moved since the app started. More... | |
int | getNumComponents () const noexcept |
Returns the number of components that are currently active as top-level desktop windows. More... | |
int | getNumDraggingMouseSources () const noexcept |
Returns the number of mouse-sources that are currently being dragged. More... | |
int | getNumMouseSources () const noexcept |
Returns the number of MouseInputSource objects the system has at its disposal. More... | |
int | getOrientationsEnabled () const noexcept |
Returns the set of orientations the display is allowed to rotate to. More... | |
bool | isDarkModeActive () const |
True if the operating system "dark mode" is active. More... | |
bool | isHeadless () const noexcept |
Returns true on a headless system where there are no connected displays. More... | |
bool | isOrientationEnabled (DisplayOrientation orientation) const noexcept |
Returns whether the display is allowed to auto-rotate to the given orientation. More... | |
void | removeDarkModeSettingListener (DarkModeSettingListener *listener) |
Unregisters a DarkModeSettingListener that was added with addDarkModeSettingListener(). More... | |
void | removeFocusChangeListener (FocusChangeListener *listener) |
Unregisters a FocusChangeListener that was added with addFocusChangeListener(). More... | |
void | removeGlobalMouseListener (MouseListener *listener) |
Unregisters a MouseListener that was added with addGlobalMouseListener(). More... | |
void | setDefaultLookAndFeel (LookAndFeel *newDefaultLookAndFeel) |
Changes the default look-and-feel. More... | |
void | setGlobalScaleFactor (float newScaleFactor) noexcept |
Sets a global scale factor to be used for all desktop windows. More... | |
void | setKioskModeComponent (Component *componentToUse, bool allowMenusAndBars=true) |
Takes a component and makes it full-screen, removing the taskbar, dock, etc. More... | |
void | setOrientationsEnabled (int allowedOrientations) |
Sets which orientations the display is allowed to auto-rotate to. More... | |
Static Public Member Functions | |
static bool | canUseSemiTransparentWindows () noexcept |
True if the OS supports semitransparent windows. More... | |
static Desktop & | getInstance () |
There's only one desktop object, and this method will return it. More... | |
static Point< int > | getLastMouseDownPosition () |
Returns the last position at which a mouse button was pressed. More... | |
static Point< int > | getMousePosition () |
Returns the mouse position. More... | |
static bool | isScreenSaverEnabled () |
Returns true if the screensaver has not been turned off. More... | |
static void | setMousePosition (Point< int > newPosition) |
Makes the mouse pointer jump to a given location. More... | |
static void | setScreenSaverEnabled (bool isEnabled) |
This lets you prevent the screensaver from becoming active. More... | |
Private Member Functions | |
Desktop () | |
~Desktop () override | |
void | addDesktopComponent (Component *) |
void | allowedOrientationsChanged () |
void | cancelPendingUpdate () noexcept |
This will stop any pending updates from happening. More... | |
void | componentBroughtToFront (Component *) |
void | darkModeChanged () |
ListenerList< MouseListener > & | getMouseListeners () |
int | getTimerInterval () const noexcept |
Returns the timer's interval. More... | |
void | handleAsyncUpdate () override |
Called back to do whatever your class needs to do. More... | |
void | handleUpdateNowIfNeeded () |
If an update has been triggered and is pending, this will invoke it synchronously. More... | |
void | incrementMouseClickCounter () noexcept |
void | incrementMouseWheelCounter () noexcept |
bool | isTimerRunning () const noexcept |
Returns true if the timer is currently running. More... | |
bool | isUpdatePending () const noexcept |
Returns true if there's an update callback in the pipeline. More... | |
void | removeDesktopComponent (Component *) |
void | resetTimer () |
void | sendMouseMove () |
void | setKioskComponent (Component *, bool shouldBeEnabled, bool allowMenusAndBars) |
void | startTimer (int intervalInMilliseconds) noexcept |
Starts the timer and sets the length of interval required. More... | |
void | startTimerHz (int timerFrequencyHz) noexcept |
Starts the timer with an interval specified in Hertz. More... | |
void | stopTimer () noexcept |
Stops the timer. More... | |
void | timerCallback () override |
The user-defined callback routine that actually gets called periodically. More... | |
void | triggerAsyncUpdate () |
Causes the callback to be triggered at a later time. More... | |
void | triggerFocusCallback () |
void | updateFocusOutline () |
Static Private Member Functions | |
static void | callAfterDelay (int milliseconds, std::function< void()> functionToCall) |
Invokes a lambda after a given number of milliseconds. More... | |
static void | callPendingTimersSynchronously () |
For internal use only: invokes any timers that need callbacks. More... | |
static std::unique_ptr< NativeDarkModeChangeDetectorImpl > | createNativeDarkModeChangeDetectorImpl () |
static void | deleteAll () |
Deletes all extant objects. More... | |
static double | getDefaultMasterScale () |
static Point< float > | getMousePositionFloat () |
Private Attributes | |
ReferenceCountedObjectPtr< AsyncUpdaterMessage > | activeMessage |
int | allowedOrientations = allOrientations |
ComponentAnimator | animator |
WeakReference< LookAndFeel > | currentLookAndFeel |
ListenerList< DarkModeSettingListener > | darkModeSettingListeners |
std::unique_ptr< LookAndFeel > | defaultLookAndFeel |
Array< Component * > | desktopComponents |
std::unique_ptr< Displays > | displays |
ListenerList< FocusChangeListener > | focusListeners |
std::unique_ptr< FocusOutline > | focusOutline |
Rectangle< int > | kioskComponentOriginalBounds |
Component * | kioskModeComponent = nullptr |
bool | kioskModeReentrant = false |
Point< float > | lastFakeMouseMove |
float | masterScaleFactor |
int | mouseClickCounter = 0 |
ListenerList< MouseListener > | mouseListeners |
std::unique_ptr< MouseInputSource::SourceList > | mouseSources |
int | mouseWheelCounter = 0 |
std::unique_ptr< NativeDarkModeChangeDetectorImpl > | nativeDarkModeChangeDetectorImpl |
Array< ComponentPeer * > | peers |
size_t | positionInQueue = (size_t) -1 |
int | timerPeriodMs = 0 |
Static Private Attributes | |
static Desktop * | instance |
Friends | |
class | Component |
class | ComponentPeer |
class | DeletedAtShutdown |
class | Displays |
class | MouseInputSourceInternal |
class | TopLevelWindowManager |
Describes and controls aspects of the computer's desktop.
@tags{GUI}
In a tablet/mobile device which can be turned around, this is used to indicate the orientation.
|
private |
|
overrideprivate |
void juce::Desktop::addDarkModeSettingListener | ( | DarkModeSettingListener * | listener | ) |
Registers a DarkModeSettingListener that will receive a callback when the operating system dark mode setting changes.
To query whether dark mode is on use the isDarkModeActive() method.
|
private |
void juce::Desktop::addFocusChangeListener | ( | FocusChangeListener * | listener | ) |
Registers a FocusChangeListener that will receive a callback whenever the focused component changes.
void juce::Desktop::addGlobalMouseListener | ( | MouseListener * | listener | ) |
Registers a MouseListener that will receive all mouse events that occur on any component.
|
private |
void juce::Desktop::beginDragAutoRepeat | ( | int | millisecondsBetweenCallbacks | ) |
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.
|
staticinherited |
Invokes a lambda after a given number of milliseconds.
|
staticinherited |
For internal use only: invokes any timers that need callbacks.
Don't call this unless you really know what you're doing!
|
noexceptinherited |
This will stop any pending updates from happening.
If called after triggerAsyncUpdate() and before the handleAsyncUpdate() callback happens, this will cancel the handleAsyncUpdate() callback.
Note that this method simply cancels the next callback - if a callback is already in progress on a different thread, this won't block until the callback finishes, so there's no guarantee that the callback isn't still running when the method returns.
|
staticnoexcept |
True if the OS supports semitransparent windows.
|
private |
|
staticprivate |
|
private |
|
staticinherited |
Deletes all extant objects.
This shouldn't be used by applications, as it's called automatically in the shutdown code of the JUCEApplicationBase class.
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.
Referenced by juce::WindowsHooks::mouseWheelHookCallback().
|
inlinenoexcept |
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.
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.
DisplayOrientation juce::Desktop::getCurrentOrientation | ( | ) | const |
In a tablet device which can be turned around, this returns the current orientation.
|
noexcept |
Returns the current default look-and-feel for components which don't have one explicitly set.
|
staticprivate |
|
inlinenoexcept |
Returns the Displays object representing the connected displays.
Referenced by juce::UIATextProvider::UIATextRangeProvider::GetBoundingRectangles(), juce::OpenGLContext::NativeContext::NativeContext(), and juce::OpenGLContext::NativeContext::updateWindowPosition().
|
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.
|
inlinenoexcept |
Returns the current global scale factor, as set by setGlobalScaleFactor().
Referenced by juce::DialogWindow::getDesktopScaleFactor(), and juce::AlertWindow::getDesktopScaleFactor().
|
static |
There's only one desktop object, and this method will return it.
Referenced by juce::UIATextProvider::UIATextRangeProvider::GetBoundingRectangles(), juce::DialogWindow::getDesktopScaleFactor(), juce::AlertWindow::getDesktopScaleFactor(), juce::StandalonePluginHolder::getInstance(), juce::WindowsHooks::mouseWheelHookCallback(), juce::UIATransformProvider::Move(), juce::OpenGLContext::NativeContext::NativeContext(), juce::CarbonViewWrapperComponent::setEmbeddedWindowToOurSize(), and juce::OpenGLContext::NativeContext::updateWindowPosition().
|
inlinenoexcept |
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.
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.
|
noexcept |
Returns the main mouse input device that the system is using.
|
noexcept |
Returns the number of times the mouse button has been clicked since the app started.
Each mouse-down event increments this number by 1.
|
private |
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.
|
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.
|
noexcept |
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().
|
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.
|
noexcept |
Returns the number of components that are currently active as top-level desktop windows.
|
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.
|
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().
|
noexcept |
Returns the set of orientations the display is allowed to rotate to.
|
inlinenoexceptinherited |
Returns the timer's interval.
Referenced by juce::CarbonViewWrapperComponent::setOurSizeToEmbeddedViewSize().
|
overrideprivatevirtual |
Called back to do whatever your class needs to do.
This method is called by the message thread at the next convenient time after the triggerAsyncUpdate() method has been called.
Implements juce::AsyncUpdater.
|
inherited |
If an update has been triggered and is pending, this will invoke it synchronously.
Use this as a kind of "flush" operation - if an update is pending, the handleAsyncUpdate() method will be called immediately; if no update is pending, then nothing will be done.
Because this may invoke the callback, this method must only be called on the main event thread.
|
privatenoexcept |
|
privatenoexcept |
bool juce::Desktop::isDarkModeActive | ( | ) | const |
True if the operating system "dark mode" is active.
To receive a callback when this setting changes implement the DarkModeSettingListener interface and use the addDarkModeSettingListener() to register a listener.
|
noexcept |
Returns true on a headless system where there are no connected displays.
|
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.
|
static |
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.
|
inlinenoexceptinherited |
Returns true if the timer is currently running.
|
noexceptinherited |
Returns true if there's an update callback in the pipeline.
void juce::Desktop::removeDarkModeSettingListener | ( | DarkModeSettingListener * | listener | ) |
Unregisters a DarkModeSettingListener that was added with addDarkModeSettingListener().
|
private |
void juce::Desktop::removeFocusChangeListener | ( | FocusChangeListener * | listener | ) |
Unregisters a FocusChangeListener that was added with addFocusChangeListener().
void juce::Desktop::removeGlobalMouseListener | ( | MouseListener * | listener | ) |
Unregisters a MouseListener that was added with addGlobalMouseListener().
|
private |
|
private |
void juce::Desktop::setDefaultLookAndFeel | ( | LookAndFeel * | newDefaultLookAndFeel | ) |
Changes the default look-and-feel.
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. |
|
noexcept |
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().
|
private |
void juce::Desktop::setKioskModeComponent | ( | Component * | componentToUse, |
bool | allowMenusAndBars = true |
||
) |
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.
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.
void juce::Desktop::setOrientationsEnabled | ( | int | allowedOrientations | ) |
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.
|
static |
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.
|
noexceptinherited |
Starts the timer and sets the length of interval required.
If the timer is already started, this will reset it, so the time between calling this method and the next timer callback will not be less than the interval length passed in.
intervalInMilliseconds | the interval to use (any value less than 1 will be rounded up to 1) |
Referenced by juce::StandalonePluginHolder::init(), juce::CarbonViewWrapperComponent::setOurSizeToEmbeddedViewSize(), and juce::DeviceChangeDetector::triggerAsyncDeviceChangeCallback().
|
noexceptinherited |
Starts the timer with an interval specified in Hertz.
This is effectively the same as calling startTimer (1000 / timerFrequencyHz).
Referenced by juce::AnimatedPosition< Behaviour >::endDrag(), juce::AnimatedPosition< Behaviour >::nudge(), and juce::AnimatedPosition< Behaviour >::timerCallback().
|
noexceptinherited |
Stops the timer.
No more timer callbacks will be triggered after this method returns.
Note that if you call this from a background thread while the message-thread is already in the middle of your callback, then this method will cancel any future timer callbacks, but it will return without waiting for the current one to finish. The current callback will continue, possibly still running some of your timer code after this method has returned.
Referenced by juce::AnimatedPosition< Behaviour >::beginDrag(), juce::CarbonViewWrapperComponent::setOurSizeToEmbeddedViewSize(), juce::AnimatedPosition< Behaviour >::setPosition(), juce::DeviceChangeDetector::timerCallback(), juce::AnimatedPosition< Behaviour >::timerCallback(), and juce::StandalonePluginHolder::~StandalonePluginHolder().
|
overrideprivatevirtual |
The user-defined callback routine that actually gets called periodically.
It's perfectly ok to call startTimer() or stopTimer() from within this callback to change the subsequent intervals.
Implements juce::Timer.
|
inherited |
Causes the callback to be triggered at a later time.
This method returns immediately, after which a callback to the handleAsyncUpdate() method will be made by the message thread as soon as possible.
If an update callback is already pending but hasn't happened yet, calling this method will have no effect.
It's thread-safe to call this method from any thread, BUT beware of calling it from a real-time (e.g. audio) thread, because it involves posting a message to the system queue, which means it may block (and in general will do on most OSes).
|
private |
|
private |
|
friend |
|
friend |
|
friend |
|
friend |
|
friend |
|
friend |
|
privateinherited |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
staticprivate |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
privateinherited |
|
privateinherited |