LMMS
Loading...
Searching...
No Matches
juce_TopLevelWindow.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
31 private DeletedAtShutdown
32{
33public:
35 ~TopLevelWindowManager() override { clearSingletonInstance(); }
36
38
40 {
41 startTimer (10);
42 }
43
45 {
46 startTimer (jmin (1731, getTimerInterval() * 2));
47
48 auto* newActive = findCurrentlyActiveWindow();
49
50 if (newActive != currentActive)
51 {
52 currentActive = newActive;
53
54 for (int i = windows.size(); --i >= 0;)
55 if (auto* tlw = windows[i])
56 tlw->setWindowActive (isWindowActive (tlw));
57
58 Desktop::getInstance().triggerFocusCallback();
59 }
60 }
61
63 {
64 windows.add (w);
66
67 return isWindowActive (w);
68 }
69
71 {
73
74 if (currentActive == w)
75 currentActive = nullptr;
76
77 windows.removeFirstMatchingValue (w);
78
79 if (windows.isEmpty())
80 deleteInstance();
81 }
82
84
85private:
87
88 void timerCallback() override
89 {
90 checkFocus();
91 }
92
93 bool isWindowActive (TopLevelWindow* const tlw) const
94 {
95 return (tlw == currentActive
97 || tlw->hasKeyboardFocus (true))
98 && tlw->isShowing();
99 }
100
102 {
104 {
105 auto* focusedComp = Component::getCurrentlyFocusedComponent();
106 auto* w = dynamic_cast<TopLevelWindow*> (focusedComp);
107
108 if (w == nullptr && focusedComp != nullptr)
109 w = focusedComp->findParentComponentOfClass<TopLevelWindow>();
110
111 if (w == nullptr)
113
114 if (w != nullptr && w->isShowing())
115 return w;
116 }
117
118 return nullptr;
119 }
120
122};
123
124JUCE_IMPLEMENT_SINGLETON (TopLevelWindowManager)
125
126void juce_checkCurrentlyFocusedTopLevelWindow();
129 if (auto* wm = TopLevelWindowManager::getInstanceWithoutCreating())
130 wm->checkFocusAsync();
131}
133//==============================================================================
134TopLevelWindow::TopLevelWindow (const String& name, const bool shouldAddToDesktop)
135 : Component (name)
136{
137 setTitle (name);
138
139 setOpaque (true);
140
141 if (shouldAddToDesktop)
143 else
145
148 isCurrentlyActive = TopLevelWindowManager::getInstance()->addWindow (this);
149}
150
152{
153 shadower = nullptr;
154 TopLevelWindowManager::getInstance()->removeWindow (this);
155}
156
157//==============================================================================
159{
160 auto* wm = TopLevelWindowManager::getInstance();
161
162 if (hasKeyboardFocus (true))
163 wm->checkFocus();
164 else
165 wm->checkFocusAsync();
166}
167
168void TopLevelWindow::setWindowActive (const bool isNowActive)
169{
170 if (isCurrentlyActive != isNowActive)
171 {
172 isCurrentlyActive = isNowActive;
174 }
175}
176
180
185
187{
188 if (isShowing())
189 if (auto* p = getPeer())
190 if ((p->getStyleFlags() & (ComponentPeer::windowIsTemporary
192 toFront (true);
193}
194
199
201{
203
206
207 return styleFlags;
208}
209
210void TopLevelWindow::setDropShadowEnabled (const bool useShadow)
211{
212 useDropShadow = useShadow;
213
214 if (isOnDesktop())
215 {
216 shadower = nullptr;
218 }
219 else
220 {
221 if (useShadow && isOpaque())
222 {
223 if (shadower == nullptr)
224 {
225 shadower = getLookAndFeel().createDropShadowerForComponent (*this);
226
227 if (shadower != nullptr)
228 shadower->setOwner (this);
229 }
230 }
231 else
232 {
233 shadower = nullptr;
234 }
235 }
236}
237
238void TopLevelWindow::setUsingNativeTitleBar (const bool shouldUseNativeTitleBar)
239{
240 if (useNativeTitleBar != shouldUseNativeTitleBar)
241 {
242 FocusRestorer focusRestorer;
243 useNativeTitleBar = shouldUseNativeTitleBar;
246 }
247}
248
257
259{
260 shadower = nullptr;
262 setDropShadowEnabled (isDropShadowEnabled()); // force an update to clear away any fake shadows if necessary.
263}
264
265void TopLevelWindow::addToDesktop (int windowStyleFlags, void* nativeWindowToAttachTo)
266{
267 /* It's not recommended to change the desktop window flags directly for a TopLevelWindow,
268 because this class needs to make sure its layout corresponds with settings like whether
269 it's got a native title bar or not.
270
271 If you need custom flags for your window, you can override the getDesktopWindowStyleFlags()
272 method. If you do this, it's best to call the base class's getDesktopWindowStyleFlags()
273 method, then add or remove whatever flags are necessary from this value before returning it.
274 */
277
278 Component::addToDesktop (windowStyleFlags, nativeWindowToAttachTo);
279
280 if (windowStyleFlags != getDesktopWindowStyleFlags())
282}
283
284std::unique_ptr<AccessibilityHandler> TopLevelWindow::createAccessibilityHandler()
285{
286 return std::make_unique<AccessibilityHandler> (*this, AccessibilityRole::window);
287}
288
289//==============================================================================
291{
292 if (c == nullptr)
294
295 if (c == nullptr || c->getBounds().isEmpty())
296 {
298 }
299 else
300 {
301 const auto scale = getDesktopScaleFactor() / Desktop::getInstance().getGlobalScaleFactor();
302
303 auto targetCentre = c->localPointToGlobal (c->getLocalBounds().getCentre()) / scale;
304 auto parentArea = getLocalArea (nullptr, c->getParentMonitorArea());
305
306 if (auto* parent = getParentComponent())
307 {
308 targetCentre = parent->getLocalPoint (nullptr, targetCentre);
309 parentArea = parent->getLocalBounds();
310 }
311
312 setBounds (Rectangle<int> (targetCentre.x - width / 2,
313 targetCentre.y - height / 2,
314 width, height)
315 .constrainedWithin (parentArea.reduced (12, 12)));
316 }
317}
318
319//==============================================================================
321{
322 return TopLevelWindowManager::getInstance()->windows.size();
323}
324
326{
327 return TopLevelWindowManager::getInstance()->windows [index];
328}
329
331{
332 TopLevelWindow* best = nullptr;
333 int bestNumTWLParents = -1;
334
335 for (int i = TopLevelWindow::getNumTopLevelWindows(); --i >= 0;)
336 {
338
339 if (tlw->isActiveWindow())
340 {
341 int numTWLParents = 0;
342
343 for (auto* c = tlw->getParentComponent(); c != nullptr; c = c->getParentComponent())
344 if (dynamic_cast<const TopLevelWindow*> (c) != nullptr)
345 ++numTWLParents;
346
347 if (bestNumTWLParents < numTWLParents)
348 {
349 best = tlw;
350 bestNumTWLParents = numTWLParents;
351 }
352 }
353 }
354
355 return best;
356}
357
358} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_Array.h:56
void setBroughtToFrontOnMouseClick(bool shouldBeBroughtToFront) noexcept
Definition juce_Component.cpp:1848
Component * getParentComponent() const noexcept
Definition juce_Component.h:804
void setTitle(const String &newTitle)
Definition juce_Component.cpp:3258
bool isOpaque() const noexcept
Definition juce_Component.cpp:843
Rectangle< int > getLocalArea(const Component *sourceComponent, Rectangle< int > areaRelativeToSourceComponent) const
Definition juce_Component.cpp:1138
void toFront(bool shouldAlsoGainKeyboardFocus)
Definition juce_Component.cpp:954
static Component *JUCE_CALLTYPE getCurrentlyFocusedComponent() noexcept
Definition juce_Component.cpp:3092
bool isShowing() const
Definition juce_Component.cpp:634
void sendLookAndFeelChange()
Definition juce_Component.cpp:2194
FocusChangeType
Definition juce_Component.h:1890
bool hasKeyboardFocus(bool trueIfChildIsFocused) const
Definition juce_Component.cpp:3086
void setOpaque(bool shouldBeOpaque)
Definition juce_Component.cpp:829
Component() noexcept
Definition juce_Component.cpp:517
bool isOnDesktop() const noexcept
Definition juce_Component.cpp:796
bool isParentOf(const Component *possibleChild) const noexcept
Definition juce_Component.cpp:1677
virtual void addToDesktop(int windowStyleFlags, void *nativeWindowToAttachTo=nullptr)
Definition juce_Component.cpp:658
void setBounds(int x, int y, int width, int height)
Definition juce_Component.cpp:1147
void setWantsKeyboardFocus(bool wantsFocus) noexcept
Definition juce_Component.cpp:2842
ComponentPeer * getPeer() const
Definition juce_Component.cpp:801
LookAndFeel & getLookAndFeel() const noexcept
Definition juce_Component.cpp:2173
void centreWithSize(int width, int height)
Definition juce_Component.cpp:1290
virtual float getDesktopScaleFactor() const
Definition juce_Component.cpp:826
@ windowIsTemporary
Definition juce_ComponentPeer.h:52
@ windowIgnoresKeyPresses
Definition juce_ComponentPeer.h:71
@ windowHasDropShadow
Definition juce_ComponentPeer.h:66
@ windowAppearsOnTaskbar
Definition juce_ComponentPeer.h:50
@ windowIsSemiTransparent
Definition juce_ComponentPeer.h:78
@ windowHasTitleBar
Definition juce_ComponentPeer.h:56
DeletedAtShutdown()
Definition juce_DeletedAtShutdown.cpp:34
static Desktop &JUCE_CALLTYPE getInstance()
Definition juce_Desktop.cpp:50
static bool JUCE_CALLTYPE isForegroundProcess()
Definition juce_linux_Windowing.cpp:580
Definition juce_Rectangle.h:67
Rectangle constrainedWithin(Rectangle areaToFitWithin) const noexcept
Definition juce_Rectangle.h:798
Definition juce_String.h:53
int getTimerInterval() const noexcept
Definition juce_Timer.h:116
Timer() noexcept
Definition juce_Timer.cpp:316
void startTimer(int intervalInMilliseconds) noexcept
Definition juce_Timer.cpp:332
Definition juce_TopLevelWindow.h:54
void recreateDesktopWindow()
Definition juce_TopLevelWindow.cpp:249
bool isDropShadowEnabled() const noexcept
Definition juce_TopLevelWindow.h:99
void setWindowActive(bool)
Definition juce_TopLevelWindow.cpp:168
void centreAroundComponent(Component *componentToCentreAround, int width, int height)
Definition juce_TopLevelWindow.cpp:290
void visibilityChanged() override
Definition juce_TopLevelWindow.cpp:186
~TopLevelWindow() override
Definition juce_TopLevelWindow.cpp:151
static int getNumTopLevelWindows() noexcept
Definition juce_TopLevelWindow.cpp:320
virtual int getDesktopWindowStyleFlags() const
Definition juce_TopLevelWindow.cpp:200
void setDropShadowEnabled(bool useShadow)
Definition juce_TopLevelWindow.cpp:210
static TopLevelWindow * getTopLevelWindow(int index) noexcept
Definition juce_TopLevelWindow.cpp:325
static TopLevelWindow * getActiveTopLevelWindow() noexcept
Definition juce_TopLevelWindow.cpp:330
std::unique_ptr< AccessibilityHandler > createAccessibilityHandler() override
Definition juce_TopLevelWindow.cpp:284
bool isUsingNativeTitleBar() const noexcept
Definition juce_TopLevelWindow.cpp:181
void parentHierarchyChanged() override
Definition juce_TopLevelWindow.cpp:195
TopLevelWindow(const String &name, bool addToDesktop)
Definition juce_TopLevelWindow.cpp:134
virtual void activeWindowStatusChanged()
Definition juce_TopLevelWindow.cpp:177
void focusOfChildComponentChanged(FocusChangeType) override
Definition juce_TopLevelWindow.cpp:158
bool isCurrentlyActive
Definition juce_TopLevelWindow.h:157
void setUsingNativeTitleBar(bool useNativeTitleBar)
Definition juce_TopLevelWindow.cpp:238
bool useNativeTitleBar
Definition juce_TopLevelWindow.h:157
std::unique_ptr< DropShadower > shadower
Definition juce_TopLevelWindow.h:158
bool useDropShadow
Definition juce_TopLevelWindow.h:157
void addToDesktop()
Definition juce_TopLevelWindow.cpp:258
Definition juce_TopLevelWindow.cpp:32
void removeWindow(TopLevelWindow *const w)
Definition juce_TopLevelWindow.cpp:70
bool addWindow(TopLevelWindow *const w)
Definition juce_TopLevelWindow.cpp:62
~TopLevelWindowManager() override
Definition juce_TopLevelWindow.cpp:35
bool isWindowActive(TopLevelWindow *const tlw) const
Definition juce_TopLevelWindow.cpp:93
void checkFocus()
Definition juce_TopLevelWindow.cpp:44
void checkFocusAsync()
Definition juce_TopLevelWindow.cpp:39
TopLevelWindowManager()
Definition juce_TopLevelWindow.cpp:34
Array< TopLevelWindow * > windows
Definition juce_TopLevelWindow.cpp:83
TopLevelWindow * findCurrentlyActiveWindow() const
Definition juce_TopLevelWindow.cpp:101
TopLevelWindow * currentActive
Definition juce_TopLevelWindow.cpp:86
void timerCallback() override
Definition juce_TopLevelWindow.cpp:88
UINT_D64 w
Definition inflate.c:942
register unsigned i
Definition inflate.c:1575
static const char * name
Definition pugl.h:1582
static int int height
Definition pugl.h:1594
static int width
Definition pugl.h:1593
static uintptr_t parent
Definition pugl.h:1644
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE(className)
#define JUCE_IMPLEMENT_SINGLETON(Classname)
Definition juce_Singleton.h:201
#define JUCE_DECLARE_SINGLETON_SINGLETHREADED_MINIMAL(Classname)
Definition juce_Singleton.h:252
Definition carla_juce.cpp:31
constexpr Type jmin(Type a, Type b)
Definition juce_MathsFunctions.h:106
void juce_checkCurrentlyFocusedTopLevelWindow()
Definition juce_TopLevelWindow.cpp:127
@ window
Definition juce_AccessibilityRole.h:63
Definition juce_Component.cpp:181
uch * p
Definition crypt.c:594
return c
Definition crypt.c:175
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137