aboutsummaryrefslogtreecommitdiffstats
path: root/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'src/app')
-rw-r--r--src/app/main.cpp141
1 files changed, 83 insertions, 58 deletions
diff --git a/src/app/main.cpp b/src/app/main.cpp
index f095e373bc7..3660a111e57 100644
--- a/src/app/main.cpp
+++ b/src/app/main.cpp
@@ -58,7 +58,9 @@
#include <QStandardPaths>
#include <QTemporaryDir>
-#include <memory>
+#include <string>
+#include <vector>
+#include <iterator>
#ifdef ENABLE_QT_BREAKPAD
#include <qtsystemexceptionhandler.h>
@@ -146,9 +148,22 @@ static void printHelp(const QString &a0)
displayHelpText(help);
}
+QString applicationDirPath(char *arg = 0)
+{
+ static QString dir;
+
+ if (arg)
+ dir = QFileInfo(QString::fromLocal8Bit(arg)).dir().absolutePath();
+
+ if (QCoreApplication::instance())
+ return QApplication::applicationDirPath();
+
+ return dir;
+}
+
static QString resourcePath()
{
- return QDir::cleanPath(QCoreApplication::applicationDirPath() + '/' + RELATIVE_DATA_PATH);
+ return QDir::cleanPath(applicationDirPath() + '/' + RELATIVE_DATA_PATH);
}
static inline QString msgCoreLoadFailure(const QString &why)
@@ -238,7 +253,7 @@ static void setupInstallSettings(QString &installSettingspath)
if (installSettings.contains(kInstallSettingsKey)) {
QString installSettingsPath = installSettings.value(kInstallSettingsKey).toString();
if (QDir::isRelativePath(installSettingsPath))
- installSettingsPath = QCoreApplication::applicationDirPath() + '/' + installSettingsPath;
+ installSettingsPath = applicationDirPath() + '/' + installSettingsPath;
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, installSettingsPath);
}
}
@@ -293,23 +308,12 @@ static inline QSettings *userSettings()
return createUserSettings();
}
-static void setHighDpiEnvironmentVariable(int argc, char **argv)
+static void setHighDpiEnvironmentVariable()
{
if (Utils::HostOsInfo().isMacHost())
return;
- std::vector<std::string> arguments(argv, argv + argc);
- auto it = arguments.begin();
- QString settingsPath;
- while (it != arguments.end()) {
- const QString &arg = QString::fromStdString(*it);
- it = ++it;
- if (arg == SETTINGS_OPTION && it != arguments.end())
- settingsPath = QDir::fromNativeSeparators(QString::fromStdString(*it));
- }
- if (!settingsPath.isEmpty())
- QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, settingsPath);
std::unique_ptr<QSettings> settings(createUserSettings());
const bool defaultValue = Utils::HostOsInfo().isWindowsHost();
@@ -347,8 +351,6 @@ int main(int argc, char **argv)
Utils::TemporaryDirectory::setMasterTemporaryDirectory(QDir::tempPath() + "/" + Core::Constants::IDE_CASED_ID + "-XXXXXX");
- setHighDpiEnvironmentVariable(argc, argv);
-
QLoggingCategory::setFilterRules(QLatin1String("qtc.*.debug=false\nqtc.*.info=false"));
#ifdef Q_OS_MAC
@@ -360,55 +362,42 @@ int main(int argc, char **argv)
setrlimit(RLIMIT_NOFILE, &rl);
#endif
- SharedTools::QtSingleApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
- SharedTools::QtSingleApplication app((QLatin1String(Core::Constants::IDE_DISPLAY_NAME)), argc, argv);
-
- loadFonts();
-
- if (Utils::HostOsInfo().isWindowsHost()
- && !qFuzzyCompare(qApp->devicePixelRatio(), 1.0)
- && QApplication::style()->objectName().startsWith(
- QLatin1String("windows"), Qt::CaseInsensitive)) {
- QApplication::setStyle(QLatin1String("fusion"));
- }
- const int threadCount = QThreadPool::globalInstance()->maxThreadCount();
- QThreadPool::globalInstance()->setMaxThreadCount(qMax(4, 2 * threadCount));
-
- const QString libexecPath = QCoreApplication::applicationDirPath()
- + '/' + RELATIVE_LIBEXEC_PATH;
-#ifdef ENABLE_QT_BREAKPAD
- QtSystemExceptionHandler systemExceptionHandler(libexecPath);
-#else
- // Display a backtrace once a serious signal is delivered (Linux only).
- CrashHandlerSetup setupCrashHandler(Core::Constants::IDE_DISPLAY_NAME,
- CrashHandlerSetup::EnableRestart, libexecPath);
-#endif
-
- app.setAttribute(Qt::AA_UseHighDpiPixmaps);
-
// Manually determine -settingspath and -installsettingspath command line options
// We can't use the regular way of the plugin manager, because that needs to parse plugin meta data
// but the settings path can influence which plugins are enabled
QString settingsPath;
QString installSettingsPath;
QStringList customPluginPaths;
- QStringList pluginArguments;
-
- QStringListIterator it(app.arguments());
- while (it.hasNext()) {
- const QString &arg = it.next();
- if (arg == SETTINGS_OPTION && it.hasNext())
- settingsPath = QDir::fromNativeSeparators(it.next());
- else if (arg == INSTALL_SETTINGS_OPTION && it.hasNext())
- installSettingsPath = QDir::fromNativeSeparators(it.next());
- else if (arg == PLUGINPATH_OPTION && it.hasNext())
- customPluginPaths += QDir::fromNativeSeparators(it.next());
- else
- pluginArguments.append(arg);
+ std::vector<char *> appArguments;
+ bool hasTestOption = false;
+
+ auto it = argv;
+ const auto end = argv + argc;
+ while (it != end) {
+ const auto arg = QString::fromLocal8Bit(*it);
+ const bool hasNext = it + 1 != end;
+
+ if (arg == SETTINGS_OPTION && hasNext) {
+ ++it;
+ settingsPath = QDir::fromNativeSeparators(QString::fromLocal8Bit(*it));
+ } else if (arg == INSTALL_SETTINGS_OPTION && hasNext) {
+ ++it;
+ installSettingsPath = QDir::fromNativeSeparators(QString::fromLocal8Bit(*it));
+ } else if (arg == PLUGINPATH_OPTION && hasNext) {
+ ++it;
+ customPluginPaths += QDir::fromNativeSeparators(QString::fromLocal8Bit(*it));
+ } else {
+ if (arg == TEST_OPTION)
+ hasTestOption = true;
+ appArguments.push_back(*it);
+ }
+ ++it;
}
+ applicationDirPath(argv[0]);
+
QScopedPointer<Utils::TemporaryDirectory> temporaryCleanSettingsDir;
- if (settingsPath.isEmpty() && pluginArguments.contains(TEST_OPTION)) {
+ if (settingsPath.isEmpty() && hasTestOption) {
temporaryCleanSettingsDir.reset(new Utils::TemporaryDirectory("qtc-test-settings"));
if (!temporaryCleanSettingsDir->isValid())
return 1;
@@ -421,11 +410,47 @@ int main(int argc, char **argv)
QSettings::setDefaultFormat(QSettings::IniFormat);
setupInstallSettings(installSettingsPath);
// plugin manager takes control of this settings object
- QSettings *settings = userSettings();
+ setHighDpiEnvironmentVariable();
+
+ SharedTools::QtSingleApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
+
+ int numberofArguments = static_cast<int>(appArguments.size());
+
+ SharedTools::QtSingleApplication app((QLatin1String(Core::Constants::IDE_DISPLAY_NAME)),
+ numberofArguments,
+ appArguments.data());
+ const QStringList pluginArguments = app.arguments();
+
+ /*Initialize global settings and resetup install settings with QApplication::applicationDirPath */
+ setupInstallSettings(installSettingsPath);
+ QSettings *settings = userSettings();
QSettings *globalSettings = new QSettings(QSettings::IniFormat, QSettings::SystemScope,
QLatin1String(Core::Constants::IDE_SETTINGSVARIANT_STR),
QLatin1String(Core::Constants::IDE_CASED_ID));
+ loadFonts();
+
+ if (Utils::HostOsInfo().isWindowsHost()
+ && !qFuzzyCompare(qApp->devicePixelRatio(), 1.0)
+ && QApplication::style()->objectName().startsWith(
+ QLatin1String("windows"), Qt::CaseInsensitive)) {
+ QApplication::setStyle(QLatin1String("fusion"));
+ }
+ const int threadCount = QThreadPool::globalInstance()->maxThreadCount();
+ QThreadPool::globalInstance()->setMaxThreadCount(qMax(4, 2 * threadCount));
+
+ const QString libexecPath = QCoreApplication::applicationDirPath()
+ + '/' + RELATIVE_LIBEXEC_PATH;
+#ifdef ENABLE_QT_BREAKPAD
+ QtSystemExceptionHandler systemExceptionHandler(libexecPath);
+#else
+ // Display a backtrace once a serious signal is delivered (Linux only).
+ CrashHandlerSetup setupCrashHandler(Core::Constants::IDE_DISPLAY_NAME,
+ CrashHandlerSetup::EnableRestart, libexecPath);
+#endif
+
+ app.setAttribute(Qt::AA_UseHighDpiPixmaps);
+
PluginManager pluginManager;
PluginManager::setPluginIID(QLatin1String("org.qt-project.Qt.QtCreatorPlugin"));
PluginManager::setGlobalSettings(globalSettings);