LMMS
Loading...
Searching...
No Matches
juce_Desktop.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
36
38{
40 animator.cancelAllAnimations (false);
41
42 jassert (instance == this);
43 instance = nullptr;
44
45 // doh! If you don't delete all your windows before exiting, you're going to
46 // be leaking memory!
47 jassert (desktopComponents.size() == 0);
48}
49
51{
52 if (instance == nullptr)
53 instance = new Desktop();
54
55 return *instance;
56}
57
58Desktop* Desktop::instance = nullptr;
59
60//==============================================================================
65
66Component* Desktop::getComponent (int index) const noexcept
67{
68 return desktopComponents [index];
69}
70
72{
74
75 for (int i = desktopComponents.size(); --i >= 0;)
76 {
77 auto* c = desktopComponents.getUnchecked(i);
78
79 if (c->isVisible())
80 {
81 auto relative = c->getLocalPoint (nullptr, screenPosition);
82
83 if (c->contains (relative))
84 return c->getComponentAt (relative);
85 }
86 }
87
88 return nullptr;
89}
90
91//==============================================================================
93{
94 if (auto lf = currentLookAndFeel.get())
95 return *lf;
96
97 if (defaultLookAndFeel == nullptr)
99
100 auto lf = defaultLookAndFeel.get();
101 jassert (lf != nullptr);
103 return *lf;
104}
105
106void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel)
107{
109 currentLookAndFeel = newDefaultLookAndFeel;
110
111 for (int i = getNumComponents(); --i >= 0;)
112 if (auto* c = getComponent (i))
113 c->sendLookAndFeelChange();
114}
115
116//==============================================================================
118{
119 jassert (c != nullptr);
120 jassert (! desktopComponents.contains (c));
121 desktopComponents.addIfNotAlreadyThere (c);
122}
123
125{
126 desktopComponents.removeFirstMatchingValue (c);
127}
128
130{
131 auto index = desktopComponents.indexOf (c);
132 jassert (index >= 0);
133
134 if (index >= 0)
135 {
136 int newIndex = -1;
137
138 if (! c->isAlwaysOnTop())
139 {
140 newIndex = desktopComponents.size();
141
142 while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop())
143 --newIndex;
144
145 --newIndex;
146 }
147
148 desktopComponents.move (index, newIndex);
149 }
150}
151
152//==============================================================================
154{
155 return getMousePositionFloat().roundToInt();
156}
157
159{
160 return getInstance().getMainMouseSource().getScreenPosition();
161}
162
164{
165 getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat());
166}
167
169{
170 return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt();
171}
172
175
178
181int Desktop::getNumDraggingMouseSources() const noexcept { return mouseSources->getNumDraggingMouseSources(); }
182MouseInputSource* Desktop::getMouseSource (int index) const noexcept { return mouseSources->getMouseSource (index); }
183MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept { return mouseSources->getDraggingMouseSource (index); }
185void Desktop::beginDragAutoRepeat (int interval) { mouseSources->beginDragAutoRepeat (interval); }
186
187//==============================================================================
191
193{
194 if (auto* currentFocus = Component::getCurrentlyFocusedComponent())
195 {
196 if (currentFocus->hasFocusOutline())
197 {
198 focusOutline = currentFocus->getLookAndFeel().createFocusOutlineForComponent (*currentFocus);
199
200 if (focusOutline != nullptr)
201 focusOutline->setOwner (currentFocus);
202
203 return;
204 }
205 }
206
207 focusOutline = nullptr;
208}
209
211{
212 // The component may be deleted during this operation, but we'll use a SafePointer rather than a
213 // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer).
215 {
216 l.globalFocusChanged (currentFocus.get());
217 });
218
220}
221
222//==============================================================================
225
226void Desktop::darkModeChanged() { darkModeSettingListeners.call ([] (DarkModeSettingListener& l) { l.darkModeSettingChanged(); }); }
227
228//==============================================================================
230{
231 if (mouseListeners.size() == 0)
232 stopTimer();
233 else
234 startTimer (100);
235
237}
238
244
251
258
264
266{
267 if (! mouseListeners.isEmpty())
268 {
269 startTimer (20);
270
272
273 if (auto* target = findComponentAt (lastFakeMouseMove.roundToInt()))
274 {
275 Component::BailOutChecker checker (target);
276 auto pos = target->getLocalPoint (nullptr, lastFakeMouseMove);
277 auto now = Time::getCurrentTime();
278
282 target, target, now, pos, now, 0, false);
283
284 if (me.mods.isAnyMouseButtonDown())
285 mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseDrag (me); });
286 else
287 mouseListeners.callChecked (checker, [&] (MouseListener& l) { l.mouseMove (me); });
288 }
289 }
290}
291
292//==============================================================================
293void Desktop::setKioskModeComponent (Component* componentToUse, bool allowMenusAndBars)
294{
296 return;
297
298 const ScopedValueSetter<bool> setter (kioskModeReentrant, true, false);
299
300 if (kioskModeComponent != componentToUse)
301 {
302 // agh! Don't delete or remove a component from the desktop while it's still the kiosk component!
304
305 if (auto* oldKioskComp = kioskModeComponent)
306 {
307 kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one)
308 setKioskComponent (oldKioskComp, false, allowMenusAndBars);
309 oldKioskComp->setBounds (kioskComponentOriginalBounds);
310 }
311
312 kioskModeComponent = componentToUse;
313
314 if (kioskModeComponent != nullptr)
315 {
316 // Only components that are already on the desktop can be put into kiosk mode!
318
320 setKioskComponent (kioskModeComponent, true, allowMenusAndBars);
321 }
322 }
323}
324
325//==============================================================================
326void Desktop::setOrientationsEnabled (int newOrientations)
327{
328 if (allowedOrientations != newOrientations)
329 {
330 // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation.
331 jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0);
332
333 allowedOrientations = newOrientations;
335 }
336}
337
342
343bool Desktop::isOrientationEnabled (DisplayOrientation orientation) const noexcept
344{
345 // Make sure you only pass one valid flag in here...
346 jassert (orientation == upright || orientation == upsideDown
347 || orientation == rotatedClockwise || orientation == rotatedAntiClockwise);
348
349 return (allowedOrientations & orientation) != 0;
350}
351
352void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept
353{
355
356 if (masterScaleFactor != newScaleFactor)
357 {
358 masterScaleFactor = newScaleFactor;
359 displays->refresh();
360 }
361}
362
364{
365 return displays->displays.isEmpty();
366}
367
368} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_Array.h:56
void triggerAsyncUpdate()
Definition juce_AsyncUpdater.cpp:62
Definition juce_Component.h:2331
static Component *JUCE_CALLTYPE getCurrentlyFocusedComponent() noexcept
Definition juce_Component.cpp:3092
static ComponentPeer * getPeerFor(const Component *) noexcept
Definition juce_ComponentPeer.cpp:61
Definition juce_Desktop.h:60
Definition juce_Desktop.h:78
void sendMouseMove()
Definition juce_Desktop.cpp:265
int allowedOrientations
Definition juce_Desktop.h:445
DisplayOrientation
Definition juce_Desktop.h:344
@ upright
Definition juce_Desktop.h:345
@ rotatedAntiClockwise
Definition juce_Desktop.h:348
@ upsideDown
Definition juce_Desktop.h:346
@ rotatedClockwise
Definition juce_Desktop.h:347
@ allOrientations
Definition juce_Desktop.h:350
void setGlobalScaleFactor(float newScaleFactor) noexcept
Definition juce_Desktop.cpp:352
int getNumComponents() const noexcept
Definition juce_Desktop.cpp:61
void addDarkModeSettingListener(DarkModeSettingListener *listener)
Definition juce_Desktop.cpp:223
Rectangle< int > kioskComponentOriginalBounds
Definition juce_Desktop.h:442
Component * findComponentAt(Point< int > screenPosition) const
Definition juce_Desktop.cpp:71
void setOrientationsEnabled(int allowedOrientations)
Definition juce_Desktop.cpp:326
void setKioskComponent(Component *, bool shouldBeEnabled, bool allowMenusAndBars)
Definition juce_linux_Windowing.cpp:586
std::unique_ptr< MouseInputSource::SourceList > mouseSources
Definition juce_Desktop.h:418
MouseInputSource * getDraggingMouseSource(int index) const noexcept
Definition juce_Desktop.cpp:183
std::unique_ptr< NativeDarkModeChangeDetectorImpl > nativeDarkModeChangeDetectorImpl
Definition juce_Desktop.h:475
void removeFocusChangeListener(FocusChangeListener *listener)
Definition juce_Desktop.cpp:189
int getMouseWheelMoveCounter() const noexcept
Definition juce_Desktop.cpp:174
void setKioskModeComponent(Component *componentToUse, bool allowMenusAndBars=true)
Definition juce_Desktop.cpp:293
void componentBroughtToFront(Component *)
Definition juce_Desktop.cpp:129
void incrementMouseClickCounter() noexcept
Definition juce_Desktop.cpp:176
static Desktop * instance
Definition juce_Desktop.h:409
Point< float > lastFakeMouseMove
Definition juce_Desktop.h:429
void incrementMouseWheelCounter() noexcept
Definition juce_Desktop.cpp:177
int getNumMouseSources() const noexcept
Definition juce_Desktop.cpp:180
int mouseClickCounter
Definition juce_Desktop.h:432
bool isHeadless() const noexcept
Definition juce_Desktop.cpp:363
ListenerList< MouseListener > & getMouseListeners()
Definition juce_Desktop.cpp:239
void handleAsyncUpdate() override
Definition juce_Desktop.cpp:210
static Point< float > getMousePositionFloat()
Definition juce_Desktop.cpp:158
void addGlobalMouseListener(MouseListener *listener)
Definition juce_Desktop.cpp:245
MouseInputSource getMainMouseSource() const noexcept
Definition juce_Desktop.cpp:184
static Point< int > getMousePosition()
Definition juce_Desktop.cpp:153
void resetTimer()
Definition juce_Desktop.cpp:229
WeakReference< LookAndFeel > currentLookAndFeel
Definition juce_Desktop.h:437
std::unique_ptr< FocusOutline > focusOutline
Definition juce_Desktop.h:439
bool isOrientationEnabled(DisplayOrientation orientation) const noexcept
Definition juce_Desktop.cpp:343
int getNumDraggingMouseSources() const noexcept
Definition juce_Desktop.cpp:181
ListenerList< FocusChangeListener > focusListeners
Definition juce_Desktop.h:421
void addFocusChangeListener(FocusChangeListener *listener)
Definition juce_Desktop.cpp:188
void removeDesktopComponent(Component *)
Definition juce_Desktop.cpp:124
void beginDragAutoRepeat(int millisecondsBetweenCallbacks)
Definition juce_Desktop.cpp:185
friend class Component
Definition juce_Desktop.h:411
Array< Component * > desktopComponents
Definition juce_Desktop.h:424
int getMouseButtonClickCounter() const noexcept
Definition juce_Desktop.cpp:173
ListenerList< MouseListener > mouseListeners
Definition juce_Desktop.h:420
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
static double getDefaultMasterScale()
Definition juce_linux_Windowing.cpp:673
const Array< MouseInputSource > & getMouseSources() const noexcept
Definition juce_Desktop.cpp:179
static void setScreenSaverEnabled(bool isEnabled)
Definition juce_linux_Windowing.cpp:659
void darkModeChanged()
Definition juce_Desktop.cpp:226
void addDesktopComponent(Component *)
Definition juce_Desktop.cpp:117
~Desktop() override
Definition juce_Desktop.cpp:37
std::unique_ptr< LookAndFeel > defaultLookAndFeel
Definition juce_Desktop.h:436
void removeDarkModeSettingListener(DarkModeSettingListener *listener)
Definition juce_Desktop.cpp:224
void allowedOrientationsChanged()
Definition juce_linux_Windowing.cpp:676
Component * getComponent(int index) const noexcept
Definition juce_Desktop.cpp:66
void updateFocusOutline()
Definition juce_Desktop.cpp:192
void removeGlobalMouseListener(MouseListener *listener)
Definition juce_Desktop.cpp:252
static void setMousePosition(Point< int > newPosition)
Definition juce_Desktop.cpp:163
void triggerFocusCallback()
Definition juce_Desktop.cpp:190
Desktop()
Definition juce_Desktop.cpp:29
static Point< int > getLastMouseDownPosition()
Definition juce_Desktop.cpp:168
ListenerList< DarkModeSettingListener > darkModeSettingListeners
Definition juce_Desktop.h:422
bool kioskModeReentrant
Definition juce_Desktop.h:443
int mouseWheelCounter
Definition juce_Desktop.h:432
std::unique_ptr< Displays > displays
Definition juce_Desktop.h:427
LookAndFeel & getDefaultLookAndFeel() noexcept
Definition juce_Desktop.cpp:92
float masterScaleFactor
Definition juce_Desktop.h:448
void timerCallback() override
Definition juce_Desktop.cpp:259
void setDefaultLookAndFeel(LookAndFeel *newDefaultLookAndFeel)
Definition juce_Desktop.cpp:106
static std::unique_ptr< NativeDarkModeChangeDetectorImpl > createNativeDarkModeChangeDetectorImpl()
Definition juce_linux_Windowing.cpp:647
MouseInputSource * getMouseSource(int index) const noexcept
Definition juce_Desktop.cpp:182
ComponentAnimator animator
Definition juce_Desktop.h:450
int getOrientationsEnabled() const noexcept
Definition juce_Desktop.cpp:338
friend class Displays
Definition juce_Desktop.h:416
Component * kioskModeComponent
Definition juce_Desktop.h:441
Definition juce_Desktop.h:39
Definition juce_ListenerList.h:70
Definition juce_LookAndFeel_V4.h:37
Definition juce_LookAndFeel.h:108
static ModifierKeys currentModifiers
Definition juce_ModifierKeys.h:189
bool isAnyMouseButtonDown() const noexcept
Definition juce_ModifierKeys.h:93
Definition juce_MouseEvent.h:39
const ModifierKeys mods
Definition juce_MouseEvent.h:125
Definition juce_MouseInputSource.h:52
static constexpr float defaultRotation
Definition juce_MouseInputSource.h:233
static constexpr float defaultTiltX
Definition juce_MouseInputSource.h:236
static constexpr float defaultTiltY
Definition juce_MouseInputSource.h:237
static constexpr float defaultOrientation
Definition juce_MouseInputSource.h:230
static constexpr float defaultPressure
Definition juce_MouseInputSource.h:227
Definition juce_MouseListener.h:39
Definition juce_Point.h:42
constexpr Point< float > toFloat() const noexcept
Definition juce_Point.h:234
Definition juce_ScopedValueSetter.h:55
static Time JUCE_CALLTYPE getCurrentTime() noexcept
Definition juce_Time.cpp:233
void stopTimer() noexcept
Definition juce_Timer.cpp:357
void startTimer(int intervalInMilliseconds) noexcept
Definition juce_Timer.cpp:332
Definition juce_WeakReference.h:78
int * l
Definition inflate.c:1579
register unsigned i
Definition inflate.c:1575
#define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED
Definition juce_MessageManager.h:465
#define jassert(expression)
#define JUCE_CALLTYPE
Definition carla_juce.cpp:31
return c
Definition crypt.c:175
#define const
Definition zconf.h:137