-
-
Notifications
You must be signed in to change notification settings - Fork 98
/
Application.hpp
178 lines (142 loc) · 5.88 KB
/
Application.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/*
* DISTRHO Plugin Framework (DPF)
* Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com>
*
* Permission to use, copy, modify, and/or distribute this software for any purpose with
* or without fee is hereby granted, provided that the above copyright notice and this
* permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
* TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef DGL_APP_HPP_INCLUDED
#define DGL_APP_HPP_INCLUDED
#include "Base.hpp"
#ifdef DISTRHO_NAMESPACE
START_NAMESPACE_DISTRHO
class PluginApplication;
END_NAMESPACE_DISTRHO
#endif
START_NAMESPACE_DGL
// --------------------------------------------------------------------------------------------------------------------
// build config sentinels
/**
This set of static variables act as a build sentinel that detects a configuration error.
Usually this means the way DGL was built and how it is being used and linked into your program is different,
we want to avoid such combinations as memory layout would then also be different
leading to all sort of subtle but very nasty memory corruption issues.
Make sure the flags used to build DGL match the ones used by your program and the link errors should go away.
*/
#define BUILD_CONFIG_SENTINEL(NAME) \
static struct DISTRHO_JOIN_MACRO(_, NAME) { bool ok; DISTRHO_JOIN_MACRO(_, NAME)() noexcept; } NAME;
#ifdef DPF_DEBUG
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_on)
#else
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_off)
#endif
#ifdef DGL_USE_FILE_BROWSER
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_on)
#else
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_off)
#endif
#ifdef DGL_NO_SHARED_RESOURCES
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_on)
#else
BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_off)
#endif
#undef BUILD_CONFIG_SENTINEL
// --------------------------------------------------------------------------------------------------------------------
/**
Base DGL Application class.
One application instance is required for creating a window.
There's no single/global application instance in DGL, and multiple windows can share the same app instance.
In standalone mode an application will automatically quit its event-loop when all its windows are closed.
Unless stated otherwise, functions within this class are not thread-safe.
*/
class DISTRHO_API Application
{
public:
/**
Constructor.
*/
// NOTE: the default value is not yet passed, so we catch where we use this
Application(bool isStandalone = true);
/**
Destructor.
*/
virtual ~Application();
/**
Idle function.
This runs the application event-loop once.
*/
void idle();
/**
Run the application event-loop until all Windows are closed.
idle() is called at regular intervals.
@note This function is meant for standalones only, *never* call this from plugins.
*/
void exec(uint idleTimeInMs = 30);
/**
Quit the application.
This stops the event-loop and closes all Windows.
This function is thread-safe.
*/
void quit();
/**
Check if the application is about to quit.
Returning true means there's no event-loop running at the moment (or it's just about to stop).
This function is thread-safe.
*/
bool isQuitting() const noexcept;
/**
Check if the application is standalone, otherwise running as a module or plugin.
This function is thread-safe.
*/
bool isStandalone() const noexcept;
/**
Return the time in seconds.
This is a monotonically increasing clock with high resolution.@n
The returned time is only useful to compare against other times returned by this function,
its absolute value has no meaning.
*/
double getTime() const;
/**
Add a callback function to be triggered on every idle cycle.
You can add more than one, and remove them at anytime with removeIdleCallback().
Idle callbacks trigger right after OS event handling and Window idle events (within the same cycle).
There are no guarantees in terms of timing, use Window::addIdleCallback for time-relative callbacks.
*/
void addIdleCallback(IdleCallback* callback);
/**
Remove an idle callback previously added via addIdleCallback().
*/
void removeIdleCallback(IdleCallback* callback);
/**
Get the class name of the application.
This is a stable identifier for the application, used as the window class/instance name on X11 and Windows.
It is not displayed to the user, but can be used in scripts and by window managers,
so it should be the same for every instance of the application, but different from other applications.
Plugins created with DPF have their class name automatically set based on DGL_NAMESPACE and plugin name.
*/
const char* getClassName() const noexcept;
/**
Set the class name of the application.
@see getClassName
*/
void setClassName(const char* name);
private:
struct PrivateData;
PrivateData* const pData;
friend class Window;
#ifdef DISTRHO_NAMESPACE
friend class DISTRHO_NAMESPACE::PluginApplication;
#endif
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Application)
};
// --------------------------------------------------------------------------------------------------------------------
END_NAMESPACE_DGL
#endif // DGL_APP_HPP_INCLUDED