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