diff options
Diffstat (limited to 'data')
-rw-r--r-- | data/appsettings.cpp | 2 | ||||
-rw-r--r-- | data/appsettings.h | 2 | ||||
-rw-r--r-- | data/minecraftprocess.cpp | 324 |
3 files changed, 163 insertions, 165 deletions
diff --git a/data/appsettings.cpp b/data/appsettings.cpp index bdb66535..6b724cd9 100644 --- a/data/appsettings.cpp +++ b/data/appsettings.cpp @@ -20,8 +20,6 @@ #include <QPoint> #include <QColor> -AppSettings *settings; - AppSettings::AppSettings(QObject *parent) : BasicSettingsObject(parent) { diff --git a/data/appsettings.h b/data/appsettings.h index fc0098fc..ba4ef242 100644 --- a/data/appsettings.h +++ b/data/appsettings.h @@ -27,6 +27,4 @@ public: explicit AppSettings(QObject *parent = 0); }; -extern AppSettings *settings; - #endif // APPSETTINGS_H diff --git a/data/minecraftprocess.cpp b/data/minecraftprocess.cpp index d08b767c..1eea8f82 100644 --- a/data/minecraftprocess.cpp +++ b/data/minecraftprocess.cpp @@ -34,213 +34,215 @@ // commandline splitter QStringList MinecraftProcess::splitArgs(QString args) { - QStringList argv; - QString current; - bool escape = false; - QChar inquotes; - for (int i=0; i<args.length(); i++) - { - QChar cchar = args.at(i); - - // \ escaped - if (escape) { - current += cchar; - escape = false; - // in "quotes" - } else if (!inquotes.isNull()) { - if (cchar == 0x5C) - escape = true; - else if (cchar == inquotes) - inquotes = 0; - else - current += cchar; - // otherwise - } else { - if (cchar == 0x20) { - if (!current.isEmpty()) { - argv << current; - current.clear(); - } - } else if (cchar == 0x22 || cchar == 0x27) - inquotes = cchar; - else - current += cchar; - } - } - if (!current.isEmpty()) - argv << current; - return argv; + QStringList argv; + QString current; + bool escape = false; + QChar inquotes; + for (int i=0; i<args.length(); i++) + { + QChar cchar = args.at(i); + + // \ escaped + if (escape) { + current += cchar; + escape = false; + // in "quotes" + } else if (!inquotes.isNull()) { + if (cchar == 0x5C) + escape = true; + else if (cchar == inquotes) + inquotes = 0; + else + current += cchar; + // otherwise + } else { + if (cchar == 0x20) { + if (!current.isEmpty()) { + argv << current; + current.clear(); + } + } else if (cchar == 0x22 || cchar == 0x27) + inquotes = cchar; + else + current += cchar; + } + } + if (!current.isEmpty()) + argv << current; + return argv; } // prepare tools inline void MinecraftProcess::extractIcon(InstancePtr inst, QString destination) { - QImage(":/icons/instances/" + inst->iconKey()).save(destination); + QImage(":/icons/instances/" + inst->iconKey()).save(destination); } inline void MinecraftProcess::extractLauncher(QString destination) { - QFile(":/launcher/launcher.jar").copy(destination); + QFile(":/launcher/launcher.jar").copy(destination); } void MinecraftProcess::prepare(InstancePtr inst) { - extractLauncher(PathCombine(inst->minecraftDir(), LAUNCHER_FILE)); - extractIcon(inst, PathCombine(inst->minecraftDir(), "icon.png")); + extractLauncher(PathCombine(inst->minecraftDir(), LAUNCHER_FILE)); + extractIcon(inst, PathCombine(inst->minecraftDir(), "icon.png")); } // constructor MinecraftProcess::MinecraftProcess(InstancePtr inst, QString user, QString session, ConsoleWindow *console) : - m_instance(inst), m_user(user), m_session(session), m_console(console) + m_instance(inst), m_user(user), m_session(session), m_console(console) { - connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(finish(int, QProcess::ExitStatus))); - - // prepare the process environment - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - + connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(finish(int, QProcess::ExitStatus))); + + // prepare the process environment + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + #ifdef LINUX - // Strip IBus - if (env.value("XMODIFIERS").contains(IBUS)) - env.insert("XMODIFIERS", env.value("XMODIFIERS").replace(IBUS, "")); + // Strip IBus + if (env.value("XMODIFIERS").contains(IBUS)) + env.insert("XMODIFIERS", env.value("XMODIFIERS").replace(IBUS, "")); #endif - - // export some infos - env.insert("INST_NAME", inst->name()); - env.insert("INST_ID", inst->id()); - env.insert("INST_DIR", QDir(inst->rootDir()).absolutePath()); - - this->setProcessEnvironment(env); - m_prepostlaunchprocess.setProcessEnvironment(env); - - // set the cwd - QDir mcDir(inst->minecraftDir()); - this->setWorkingDirectory(mcDir.absolutePath()); - m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath()); - - // std channels - connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr())); - connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut())); + + // export some infos + env.insert("INST_NAME", inst->name()); + env.insert("INST_ID", inst->id()); + env.insert("INST_DIR", QDir(inst->rootDir()).absolutePath()); + + this->setProcessEnvironment(env); + m_prepostlaunchprocess.setProcessEnvironment(env); + + // set the cwd + QDir mcDir(inst->minecraftDir()); + this->setWorkingDirectory(mcDir.absolutePath()); + m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath()); + + // std channels + connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr())); + connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut())); } // console window void MinecraftProcess::on_stdErr() { - if (m_console != nullptr) - m_console->write(readAllStandardError(), ConsoleWindow::ERROR); + if (m_console != nullptr) + m_console->write(readAllStandardError(), ConsoleWindow::ERROR); } void MinecraftProcess::on_stdOut() { - if (m_console != nullptr) - m_console->write(readAllStandardOutput(), ConsoleWindow::DEFAULT); + if (m_console != nullptr) + m_console->write(readAllStandardOutput(), ConsoleWindow::DEFAULT); } void MinecraftProcess::log(QString text) { - if (m_console != nullptr) - m_console->write(text); - else - qDebug(qPrintable(text)); + if (m_console != nullptr) + m_console->write(text); + else + qDebug(qPrintable(text)); } // exit handler void MinecraftProcess::finish(int code, ExitStatus status) { - if (status != NormalExit) - { - //TODO: error handling - } - - log("Minecraft exited."); - - m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code)); - - // run post-exit - if (!m_instance->getPostExitCommand().isEmpty()) - { - m_prepostlaunchprocess.start(m_instance->getPostExitCommand()); - m_prepostlaunchprocess.waitForFinished(); - if (m_prepostlaunchprocess.exitStatus() != NormalExit) - { - //TODO: error handling - } - } - - if (m_console != nullptr) - m_console->setMayClose(true); - - emit ended(); + if (status != NormalExit) + { + //TODO: error handling + } + + log("Minecraft exited."); + + m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code)); + + // run post-exit + if (!m_instance->settings().get("PostExitCommand").toString().isEmpty()) + { + m_prepostlaunchprocess.start(m_instance->settings().get("PostExitCommand").toString()); + m_prepostlaunchprocess.waitForFinished(); + if (m_prepostlaunchprocess.exitStatus() != NormalExit) + { + //TODO: error handling + } + } + + if (m_console != nullptr) + m_console->setMayClose(true); + + emit ended(); } void MinecraftProcess::launch() { - if (!m_instance->getPreLaunchCommand().isEmpty()) - { - m_prepostlaunchprocess.start(m_instance->getPreLaunchCommand()); - m_prepostlaunchprocess.waitForFinished(); - if (m_prepostlaunchprocess.exitStatus() != NormalExit) - { - //TODO: error handling - return; - } - } - - m_instance->setLastLaunch(); - - prepare(m_instance); - - genArgs(); - - log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); - log(QString("Instance launched with arguments: '%1'").arg(m_arguments.join("' '"))); - - start(m_instance->getJavaPath(), m_arguments); - if (!waitForStarted()) - { - //TODO: error handling - } - - if(m_console != nullptr) - m_console->setMayClose(false); + if (!m_instance->settings().get("PreLaunchCommand").toString().isEmpty()) + { + m_prepostlaunchprocess.start(m_instance->settings().get("PreLaunchCommand").toString()); + m_prepostlaunchprocess.waitForFinished(); + if (m_prepostlaunchprocess.exitStatus() != NormalExit) + { + //TODO: error handling + return; + } + } + + m_instance->setLastLaunch(); + + prepare(m_instance); + + genArgs(); + + log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); + log(QString("Instance launched with arguments: '%1'").arg(m_arguments.join("' '"))); + + start(m_instance->settings().get("JavaPath").toString(), m_arguments); + if (!waitForStarted()) + { + //TODO: error handling + } + + if(m_console != nullptr) + m_console->setMayClose(false); } void MinecraftProcess::genArgs() { - // start fresh - m_arguments.clear(); - - // window size - QString windowSize; - if (m_instance->getLaunchMaximized()) - windowSize = "max"; - else - windowSize = QString("%1x%2").arg(m_instance->getMinecraftWinWidth()).arg(m_instance->getMinecraftWinHeight()); - - // window title - QString windowTitle; - windowTitle.append("MultiMC: ").append(m_instance->name()); - - // Java arguments - m_arguments.append(splitArgs(m_instance->getJvmArgs())); - + // start fresh + m_arguments.clear(); + + // window size + QString windowSize; + if (m_instance->settings().get("LaunchMaximized").toBool()) + windowSize = "max"; + else + windowSize = QString("%1x%2"). + arg(m_instance->settings().get("MinecraftWinWidth").toInt()). + arg(m_instance->settings().get("MinecraftWinHeight").toInt()); + + // window title + QString windowTitle; + windowTitle.append("MultiMC: ").append(m_instance->name()); + + // Java arguments + m_arguments.append(splitArgs(m_instance->settings().get("JvmArgs").toString())); + #ifdef OSX - // OSX dock icon and name - m_arguments << "-Xdock:icon=icon.png"; - m_arguments << QString("-Xdock:name=\"%1\"").arg(windowTitle); + // OSX dock icon and name + m_arguments << "-Xdock:icon=icon.png"; + m_arguments << QString("-Xdock:name=\"%1\"").arg(windowTitle); #endif - - // lwjgl - QString lwjgl = m_instance->lwjglVersion(); - if (lwjgl != "Mojang") - lwjgl = QDir(settings->getLWJGLDir() + "/" + lwjgl).absolutePath(); - - // launcher arguments - m_arguments << QString("-Xms%1m").arg(m_instance->getMinMemAlloc()); - m_arguments << QString("-Xmx%1m").arg(m_instance->getMaxMemAlloc()); - m_arguments << "-jar" << LAUNCHER_FILE; - m_arguments << m_user; - m_arguments << m_session; - m_arguments << windowTitle; - m_arguments << windowSize; - m_arguments << lwjgl; + + // lwjgl + QString lwjgl = m_instance->lwjglVersion(); + if (lwjgl != "Mojang") + lwjgl = QDir(globalSettings->get("LWJGLDir").toString() + "/" + lwjgl).absolutePath(); + + // launcher arguments + m_arguments << QString("-Xms%1m").arg(m_instance->settings().get("MinMemAlloc").toInt()); + m_arguments << QString("-Xmx%1m").arg(m_instance->settings().get("MaxMemAlloc").toInt()); + m_arguments << "-jar" << LAUNCHER_FILE; + m_arguments << m_user; + m_arguments << m_session; + m_arguments << windowTitle; + m_arguments << windowSize; + m_arguments << lwjgl; } |