1 /*
2 * Carla application
3 * Copyright (C) 2013-2019 Filipe Coelho <falktx@falktx.com>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * For a full copy of the GNU General Public License see the doc/GPL.txt file.
16 */
17
18 #include "carla_app.hpp"
19
20 //---------------------------------------------------------------------------------------------------------------------
21 // Imports (Global)
22
23 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
24 # pragma GCC diagnostic push
25 # pragma GCC diagnostic ignored "-Wconversion"
26 # pragma GCC diagnostic ignored "-Weffc++"
27 # pragma GCC diagnostic ignored "-Wsign-conversion"
28 #endif
29
30 #include <QtCore/QCoreApplication>
31 #include <QtCore/QDir>
32
33 #include <QtGui/QIcon>
34 #include <QtGui/QPalette>
35
36 #include <QtWidgets/QApplication>
37
38 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
39 # pragma GCC diagnostic pop
40 #endif
41
42 //---------------------------------------------------------------------------------------------------------------------
43 // Imports (Custom)
44
45 #include "carla_shared.hpp"
46
47 //---------------------------------------------------------------------------------------------------------------------
48
CarlaApplication(const QString appName,int & argc,char * argv[])49 CarlaApplication::CarlaApplication(const QString appName, int& argc, char* argv[])
50 : fApp(nullptr)
51 {
52 QCarlaString pathBinaries, pathResources;
53 /*
54 pathBinaries, pathResources = getPaths(libPrefix)
55
56 // Needed for MacOS and Windows
57 if (os.path.exists(CWD))
58 QApplication.addLibraryPath(CWD)
59
60 // Needed for local wine build
61 if WINDOWS and CWD.endswith(("frontend", "resources")) and os.getenv("CXFREEZE") is None:
62 if kIs64bit:
63 path = "H:\\builds\\msys2-x86_64\\mingw64\\share\\qt5\\plugins"
64 else:
65 path = "H:\\builds\\msys2-i686\\mingw32\\share\\qt5\\plugins"
66 QApplication.addLibraryPath(path)
67 */
68
69 QCarlaString stylesDir;
70
71 // Use binary dir as library path
72 if (QDir(pathBinaries).exists())
73 {
74 QApplication::addLibraryPath(pathBinaries);
75 stylesDir = pathBinaries;
76 }
77
78 // base settings
79 const QSafeSettings settings("falkTX", appName);
80 #ifdef CARLA_OS_MAC
81 const bool useProTheme = true;
82 #else
83 const bool useProTheme = settings.valueBool(CARLA_KEY_MAIN_USE_PRO_THEME, CARLA_DEFAULT_MAIN_USE_PRO_THEME);
84 #endif
85
86 if (! useProTheme)
87 {
88 createApp(appName, argc, argv);
89 return;
90 }
91
92 // set style
93 QApplication::setStyle(stylesDir.isNotEmpty() ? "carla" : "fusion");
94
95 // create app
96 QApplication* const guiApp = createApp(appName, argc, argv);
97
98 if (guiApp == nullptr)
99 return;
100
101 guiApp->setStyle(stylesDir.isNotEmpty() ? "carla" : "fusion");
102
103 #ifdef MACOS
104 if (true)
105 #else
106 // set palette
107 const QString proThemeColor(settings.valueString(CARLA_KEY_MAIN_PRO_THEME_COLOR, CARLA_DEFAULT_MAIN_PRO_THEME_COLOR).toLower());
108
109 if (proThemeColor == "black")
110 #endif
111 {
112 QPalette palBlack;
113 palBlack.setColor(QPalette::Disabled, QPalette::Window, QColor(14, 14, 14));
114 palBlack.setColor(QPalette::Active, QPalette::Window, QColor(17, 17, 17));
115 palBlack.setColor(QPalette::Inactive, QPalette::Window, QColor(17, 17, 17));
116 palBlack.setColor(QPalette::Disabled, QPalette::WindowText, QColor(83, 83, 83));
117 palBlack.setColor(QPalette::Active, QPalette::WindowText, QColor(240, 240, 240));
118 palBlack.setColor(QPalette::Inactive, QPalette::WindowText, QColor(240, 240, 240));
119 palBlack.setColor(QPalette::Disabled, QPalette::Base, QColor(6, 6, 6));
120 palBlack.setColor(QPalette::Active, QPalette::Base, QColor(7, 7, 7));
121 palBlack.setColor(QPalette::Inactive, QPalette::Base, QColor(7, 7, 7));
122 palBlack.setColor(QPalette::Disabled, QPalette::AlternateBase, QColor(12, 12, 12));
123 palBlack.setColor(QPalette::Active, QPalette::AlternateBase, QColor(14, 14, 14));
124 palBlack.setColor(QPalette::Inactive, QPalette::AlternateBase, QColor(14, 14, 14));
125 palBlack.setColor(QPalette::Disabled, QPalette::ToolTipBase, QColor(4, 4, 4));
126 palBlack.setColor(QPalette::Active, QPalette::ToolTipBase, QColor(4, 4, 4));
127 palBlack.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor(4, 4, 4));
128 palBlack.setColor(QPalette::Disabled, QPalette::ToolTipText, QColor(230, 230, 230));
129 palBlack.setColor(QPalette::Active, QPalette::ToolTipText, QColor(230, 230, 230));
130 palBlack.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor(230, 230, 230));
131 palBlack.setColor(QPalette::Disabled, QPalette::Text, QColor(74, 74, 74));
132 palBlack.setColor(QPalette::Active, QPalette::Text, QColor(230, 230, 230));
133 palBlack.setColor(QPalette::Inactive, QPalette::Text, QColor(230, 230, 230));
134 palBlack.setColor(QPalette::Disabled, QPalette::Button, QColor(24, 24, 24));
135 palBlack.setColor(QPalette::Active, QPalette::Button, QColor(28, 28, 28));
136 palBlack.setColor(QPalette::Inactive, QPalette::Button, QColor(28, 28, 28));
137 palBlack.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(90, 90, 90));
138 palBlack.setColor(QPalette::Active, QPalette::ButtonText, QColor(240, 240, 240));
139 palBlack.setColor(QPalette::Inactive, QPalette::ButtonText, QColor(240, 240, 240));
140 palBlack.setColor(QPalette::Disabled, QPalette::BrightText, QColor(255, 255, 255));
141 palBlack.setColor(QPalette::Active, QPalette::BrightText, QColor(255, 255, 255));
142 palBlack.setColor(QPalette::Inactive, QPalette::BrightText, QColor(255, 255, 255));
143 palBlack.setColor(QPalette::Disabled, QPalette::Light, QColor(191, 191, 191));
144 palBlack.setColor(QPalette::Active, QPalette::Light, QColor(191, 191, 191));
145 palBlack.setColor(QPalette::Inactive, QPalette::Light, QColor(191, 191, 191));
146 palBlack.setColor(QPalette::Disabled, QPalette::Midlight, QColor(155, 155, 155));
147 palBlack.setColor(QPalette::Active, QPalette::Midlight, QColor(155, 155, 155));
148 palBlack.setColor(QPalette::Inactive, QPalette::Midlight, QColor(155, 155, 155));
149 palBlack.setColor(QPalette::Disabled, QPalette::Dark, QColor(129, 129, 129));
150 palBlack.setColor(QPalette::Active, QPalette::Dark, QColor(129, 129, 129));
151 palBlack.setColor(QPalette::Inactive, QPalette::Dark, QColor(129, 129, 129));
152 palBlack.setColor(QPalette::Disabled, QPalette::Mid, QColor(94, 94, 94));
153 palBlack.setColor(QPalette::Active, QPalette::Mid, QColor(94, 94, 94));
154 palBlack.setColor(QPalette::Inactive, QPalette::Mid, QColor(94, 94, 94));
155 palBlack.setColor(QPalette::Disabled, QPalette::Shadow, QColor(155, 155, 155));
156 palBlack.setColor(QPalette::Active, QPalette::Shadow, QColor(155, 155, 155));
157 palBlack.setColor(QPalette::Inactive, QPalette::Shadow, QColor(155, 155, 155));
158 palBlack.setColor(QPalette::Disabled, QPalette::Highlight, QColor(14, 14, 14));
159 palBlack.setColor(QPalette::Active, QPalette::Highlight, QColor(60, 60, 60));
160 palBlack.setColor(QPalette::Inactive, QPalette::Highlight, QColor(34, 34, 34));
161 palBlack.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(83, 83, 83));
162 palBlack.setColor(QPalette::Active, QPalette::HighlightedText, QColor(255, 255, 255));
163 palBlack.setColor(QPalette::Inactive, QPalette::HighlightedText, QColor(240, 240, 240));
164 palBlack.setColor(QPalette::Disabled, QPalette::Link, QColor(34, 34, 74));
165 palBlack.setColor(QPalette::Active, QPalette::Link, QColor(100, 100, 230));
166 palBlack.setColor(QPalette::Inactive, QPalette::Link, QColor(100, 100, 230));
167 palBlack.setColor(QPalette::Disabled, QPalette::LinkVisited, QColor(74, 34, 74));
168 palBlack.setColor(QPalette::Active, QPalette::LinkVisited, QColor(230, 100, 230));
169 palBlack.setColor(QPalette::Inactive, QPalette::LinkVisited, QColor(230, 100, 230));
170 guiApp->setPalette(palBlack);
171 }
172 else if (proThemeColor == "blue")
173 {
174 QPalette palBlue;
175 palBlue.setColor(QPalette::Disabled, QPalette::Window, QColor(32, 35, 39));
176 palBlue.setColor(QPalette::Active, QPalette::Window, QColor(37, 40, 45));
177 palBlue.setColor(QPalette::Inactive, QPalette::Window, QColor(37, 40, 45));
178 palBlue.setColor(QPalette::Disabled, QPalette::WindowText, QColor(89, 95, 104));
179 palBlue.setColor(QPalette::Active, QPalette::WindowText, QColor(223, 237, 255));
180 palBlue.setColor(QPalette::Inactive, QPalette::WindowText, QColor(223, 237, 255));
181 palBlue.setColor(QPalette::Disabled, QPalette::Base, QColor(48, 53, 60));
182 palBlue.setColor(QPalette::Active, QPalette::Base, QColor(55, 61, 69));
183 palBlue.setColor(QPalette::Inactive, QPalette::Base, QColor(55, 61, 69));
184 palBlue.setColor(QPalette::Disabled, QPalette::AlternateBase, QColor(60, 64, 67));
185 palBlue.setColor(QPalette::Active, QPalette::AlternateBase, QColor(69, 73, 77));
186 palBlue.setColor(QPalette::Inactive, QPalette::AlternateBase, QColor(69, 73, 77));
187 palBlue.setColor(QPalette::Disabled, QPalette::ToolTipBase, QColor(182, 193, 208));
188 palBlue.setColor(QPalette::Active, QPalette::ToolTipBase, QColor(182, 193, 208));
189 palBlue.setColor(QPalette::Inactive, QPalette::ToolTipBase, QColor(182, 193, 208));
190 palBlue.setColor(QPalette::Disabled, QPalette::ToolTipText, QColor(42, 44, 48));
191 palBlue.setColor(QPalette::Active, QPalette::ToolTipText, QColor(42, 44, 48));
192 palBlue.setColor(QPalette::Inactive, QPalette::ToolTipText, QColor(42, 44, 48));
193 palBlue.setColor(QPalette::Disabled, QPalette::Text, QColor(96, 103, 113));
194 palBlue.setColor(QPalette::Active, QPalette::Text, QColor(210, 222, 240));
195 palBlue.setColor(QPalette::Inactive, QPalette::Text, QColor(210, 222, 240));
196 palBlue.setColor(QPalette::Disabled, QPalette::Button, QColor(51, 55, 62));
197 palBlue.setColor(QPalette::Active, QPalette::Button, QColor(59, 63, 71));
198 palBlue.setColor(QPalette::Inactive, QPalette::Button, QColor(59, 63, 71));
199 palBlue.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(98, 104, 114));
200 palBlue.setColor(QPalette::Active, QPalette::ButtonText, QColor(210, 222, 240));
201 palBlue.setColor(QPalette::Inactive, QPalette::ButtonText, QColor(210, 222, 240));
202 palBlue.setColor(QPalette::Disabled, QPalette::BrightText, QColor(255, 255, 255));
203 palBlue.setColor(QPalette::Active, QPalette::BrightText, QColor(255, 255, 255));
204 palBlue.setColor(QPalette::Inactive, QPalette::BrightText, QColor(255, 255, 255));
205 palBlue.setColor(QPalette::Disabled, QPalette::Light, QColor(59, 64, 72));
206 palBlue.setColor(QPalette::Active, QPalette::Light, QColor(63, 68, 76));
207 palBlue.setColor(QPalette::Inactive, QPalette::Light, QColor(63, 68, 76));
208 palBlue.setColor(QPalette::Disabled, QPalette::Midlight, QColor(48, 52, 59));
209 palBlue.setColor(QPalette::Active, QPalette::Midlight, QColor(51, 56, 63));
210 palBlue.setColor(QPalette::Inactive, QPalette::Midlight, QColor(51, 56, 63));
211 palBlue.setColor(QPalette::Disabled, QPalette::Dark, QColor(18, 19, 22));
212 palBlue.setColor(QPalette::Active, QPalette::Dark, QColor(20, 22, 25));
213 palBlue.setColor(QPalette::Inactive, QPalette::Dark, QColor(20, 22, 25));
214 palBlue.setColor(QPalette::Disabled, QPalette::Mid, QColor(28, 30, 34));
215 palBlue.setColor(QPalette::Active, QPalette::Mid, QColor(32, 35, 39));
216 palBlue.setColor(QPalette::Inactive, QPalette::Mid, QColor(32, 35, 39));
217 palBlue.setColor(QPalette::Disabled, QPalette::Shadow, QColor(13, 14, 16));
218 palBlue.setColor(QPalette::Active, QPalette::Shadow, QColor(15, 16, 18));
219 palBlue.setColor(QPalette::Inactive, QPalette::Shadow, QColor(15, 16, 18));
220 palBlue.setColor(QPalette::Disabled, QPalette::Highlight, QColor(32, 35, 39));
221 palBlue.setColor(QPalette::Active, QPalette::Highlight, QColor(14, 14, 17));
222 palBlue.setColor(QPalette::Inactive, QPalette::Highlight, QColor(27, 28, 33));
223 palBlue.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(89, 95, 104));
224 palBlue.setColor(QPalette::Active, QPalette::HighlightedText, QColor(217, 234, 253));
225 palBlue.setColor(QPalette::Inactive, QPalette::HighlightedText, QColor(223, 237, 255));
226 palBlue.setColor(QPalette::Disabled, QPalette::Link, QColor(79, 100, 118));
227 palBlue.setColor(QPalette::Active, QPalette::Link, QColor(156, 212, 255));
228 palBlue.setColor(QPalette::Inactive, QPalette::Link, QColor(156, 212, 255));
229 palBlue.setColor(QPalette::Disabled, QPalette::LinkVisited, QColor(51, 74, 118));
230 palBlue.setColor(QPalette::Active, QPalette::LinkVisited, QColor(64, 128, 255));
231 palBlue.setColor(QPalette::Inactive, QPalette::LinkVisited, QColor(64, 128, 255));
232 guiApp->setPalette(palBlue);
233 }
234 }
235
createApp(const QString & appName,int & argc,char * argv[])236 QApplication* CarlaApplication::createApp(const QString& appName, int& argc, char* argv[])
237 {
238 #ifdef CARLA_OS_LINUX
239 QApplication::setAttribute(Qt::AA_X11InitThreads);
240 #endif
241
242 #ifdef CARLA_OS_MAC
243 QApplication::setAttribute(Qt::AA_DontShowIconsInMenus);
244 #endif
245
246 #if QT_VERSION >= 0x50600
247 QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
248 QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
249 #endif
250
251 #ifdef CARLA_OS_WIN
252 static int r_argc = argc + 2;
253 static char** const r_argv = static_cast<char**>(calloc(sizeof(char*), r_argc));
254 static char argvExtra1[] = "-platform\0";
255 static char argvExtra2[] = "windows:fontengine=freetype\0";
256 for (int i=0; i<argc; ++i)
257 r_argv[i] = argv[i];
258 r_argv[argc] = argvExtra1;
259 r_argv[argc] = argvExtra2;
260 #else
261 # define r_argc argc
262 # define r_argv argv
263 #endif
264
265 fApp = gCarla.nogui ? new QCoreApplication(r_argc, r_argv) : new QApplication(r_argc, r_argv);
266 fApp->setApplicationName(appName);
267 fApp->setApplicationVersion(CARLA_VERSION_STRING);
268 fApp->setOrganizationName("falkTX");
269
270 #ifndef CARLA_OS_WIN
271 # undef r_argc
272 # undef r_argv
273 #endif
274
275 if (gCarla.nogui)
276 return nullptr;
277
278 QApplication* const guiApp = dynamic_cast<QApplication*>(fApp);
279 CARLA_SAFE_ASSERT_RETURN(guiApp != nullptr, nullptr);
280
281 if (appName.toLower() == "carla-control")
282 {
283 #if QT_VERSION >= 0x50700
284 guiApp->setDesktopFileName("carla-control");
285 #endif
286 guiApp->setWindowIcon(QIcon(":/scalable/carla-control.svg"));
287 }
288 else
289 {
290 #if QT_VERSION >= 0x50700
291 guiApp->setDesktopFileName("carla");
292 #endif
293 guiApp->setWindowIcon(QIcon(":/scalable/carla.svg"));
294 }
295
296 return guiApp;
297 }
298
299 //---------------------------------------------------------------------------------------------------------------------
300