From f4c9cb8c1d395422b7e4f1c27ac92b6df08a39bb Mon Sep 17 00:00:00 2001 From: Orochimarufan Date: Mon, 25 Feb 2013 22:47:03 +0100 Subject: refactor indendation, fix a bug in MinecraftProcess & fix a bug in InstanceLauncher --- libmultimc/src/minecraftprocess.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libmultimc/src/minecraftprocess.cpp') diff --git a/libmultimc/src/minecraftprocess.cpp b/libmultimc/src/minecraftprocess.cpp index 943d76b1..3aecb1ee 100644 --- a/libmultimc/src/minecraftprocess.cpp +++ b/libmultimc/src/minecraftprocess.cpp @@ -197,6 +197,8 @@ void MinecraftProcess::launch() start(m_instance->settings().get("JavaPath").toString(), m_arguments); if (!waitForStarted()) { + log("Could not launch minecraft!", ConsoleWindow::ERROR); + return; //TODO: error handling } -- cgit From e4f86893a899ee86cfa6d238f891bec04977c966 Mon Sep 17 00:00:00 2001 From: Orochimarufan Date: Fri, 22 Mar 2013 14:40:55 +0100 Subject: fix merge issues, make console window work again --- CMakeLists.txt | 2 +- gui/consolewindow.cpp | 77 ++++++++++---------- gui/consolewindow.h | 79 +++++++++----------- libmultimc/include/minecraftprocess.h | 132 ++++++++++++++++++++-------------- libmultimc/src/minecraftprocess.cpp | 22 ++---- libsettings/CMakeLists.txt | 11 ++- libsettings/include/keyring.h | 5 +- libsettings/src/stubkeyring.h | 1 - main.cpp | 1 + 9 files changed, 171 insertions(+), 159 deletions(-) (limited to 'libmultimc/src/minecraftprocess.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 742f47f6..97ff786c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -266,7 +266,7 @@ IF(DEFINED MMC_KEYRING_TEST) # test.cpp ADD_EXECUTABLE(Test test.cpp) QT5_USE_MODULES(Test Core) -TARGET_LINK_LIBRARIES(Test libmmcutil libmmcsettings) +TARGET_LINK_LIBRARIES(Test libUtil libSettings) ENDIF() ################################ INSTALLATION AND PACKAGING ################################ diff --git a/gui/consolewindow.cpp b/gui/consolewindow.cpp index 1d84fe04..811900a2 100644 --- a/gui/consolewindow.cpp +++ b/gui/consolewindow.cpp @@ -4,70 +4,71 @@ #include ConsoleWindow::ConsoleWindow(QWidget *parent) : - QDialog(parent), - ui(new Ui::ConsoleWindow), - m_mayclose(true) + QDialog(parent), + ui(new Ui::ConsoleWindow), + m_mayclose(true) { - ui->setupUi(this); + ui->setupUi(this); } ConsoleWindow::~ConsoleWindow() { - delete ui; + delete ui; } void ConsoleWindow::writeColor(QString text, const char *color) { - // append a paragraph - if (color != nullptr) - ui->text->appendHtml(QString("%2").arg(color).arg(text)); - else - ui->text->appendPlainText(text); - // scroll down - QScrollBar *bar = ui->text->verticalScrollBar(); - bar->setValue(bar->maximum()); + // append a paragraph + if (color != nullptr) + ui->text->appendHtml(QString("%2").arg(color).arg(text)); + else + ui->text->appendPlainText(text); + // scroll down + QScrollBar *bar = ui->text->verticalScrollBar(); + bar->setValue(bar->maximum()); } -void ConsoleWindow::write(QString data, WriteMode mode) +void ConsoleWindow::write(QString data, MessageLevel::Enum mode) { - if (data.endsWith('\n')) - data = data.left(data.length()-1); - QStringList paragraphs = data.split('\n'); - QListIterator iter(paragraphs); - if (mode == MULTIMC) - while(iter.hasNext()) - writeColor(iter.next(), "blue"); - else if (mode == ERROR) - while(iter.hasNext()) - writeColor(iter.next(), "red"); - else - while(iter.hasNext()) - writeColor(iter.next()); + if (data.endsWith('\n')) + data = data.left(data.length()-1); + QStringList paragraphs = data.split('\n'); + QListIterator iter(paragraphs); + if (mode == MessageLevel::MultiMC) + while(iter.hasNext()) + writeColor(iter.next(), "blue"); + else if (mode == MessageLevel::Error) + while(iter.hasNext()) + writeColor(iter.next(), "red"); + // TODO: implement other MessageLevels + else + while(iter.hasNext()) + writeColor(iter.next()); } void ConsoleWindow::clear() { - ui->text->clear(); + ui->text->clear(); } void ConsoleWindow::on_closeButton_clicked() { - close(); + close(); } void ConsoleWindow::setMayClose(bool mayclose) { - m_mayclose = mayclose; - if (mayclose) - ui->closeButton->setEnabled(true); - else - ui->closeButton->setEnabled(false); + m_mayclose = mayclose; + if (mayclose) + ui->closeButton->setEnabled(true); + else + ui->closeButton->setEnabled(false); } void ConsoleWindow::closeEvent(QCloseEvent * event) { - if(!m_mayclose) - event->ignore(); - else - QDialog::closeEvent(event); + if(!m_mayclose) + event->ignore(); + else + QDialog::closeEvent(event); } diff --git a/gui/consolewindow.h b/gui/consolewindow.h index 1d322afb..5490bc92 100644 --- a/gui/consolewindow.h +++ b/gui/consolewindow.h @@ -2,6 +2,7 @@ #define CONSOLEWINDOW_H #include +#include "minecraftprocess.h" namespace Ui { class ConsoleWindow; @@ -9,61 +10,51 @@ class ConsoleWindow; class ConsoleWindow : public QDialog { - Q_OBJECT + Q_OBJECT public: - /** - * @brief The WriteMode enum - * defines how stuff is displayed - */ - enum WriteMode { - DEFAULT, - ERROR, - MULTIMC - }; + explicit ConsoleWindow(QWidget *parent = 0); + ~ConsoleWindow(); - explicit ConsoleWindow(QWidget *parent = 0); - ~ConsoleWindow(); - - /** - * @brief specify if the window is allowed to close - * @param mayclose - * used to keep it alive while MC runs - */ - void setMayClose(bool mayclose); + /** + * @brief specify if the window is allowed to close + * @param mayclose + * used to keep it alive while MC runs + */ + void setMayClose(bool mayclose); public slots: - /** - * @brief write a string - * @param data the string - * @param mode the WriteMode - * lines have to be put through this as a whole! - */ - void write(QString data, WriteMode mode=MULTIMC); - - /** - * @brief write a colored paragraph - * @param data the string - * @param color the css color name - * this will only insert a single paragraph. - * \n are ignored. a real \n is always appended. - */ - void writeColor(QString data, const char *color=nullptr); - - /** - * @brief clear the text widget - */ - void clear(); + /** + * @brief write a string + * @param data the string + * @param mode the WriteMode + * lines have to be put through this as a whole! + */ + void write(QString data, MessageLevel::Enum level=MessageLevel::MultiMC); + + /** + * @brief write a colored paragraph + * @param data the string + * @param color the css color name + * this will only insert a single paragraph. + * \n are ignored. a real \n is always appended. + */ + void writeColor(QString data, const char *color=nullptr); + + /** + * @brief clear the text widget + */ + void clear(); private slots: - void on_closeButton_clicked(); + void on_closeButton_clicked(); protected: - void closeEvent(QCloseEvent *); + void closeEvent(QCloseEvent *); private: - Ui::ConsoleWindow *ui; - bool m_mayclose; + Ui::ConsoleWindow *ui; + bool m_mayclose; }; #endif // CONSOLEWINDOW_H diff --git a/libmultimc/include/minecraftprocess.h b/libmultimc/include/minecraftprocess.h index d6b9f612..f6272183 100644 --- a/libmultimc/include/minecraftprocess.h +++ b/libmultimc/include/minecraftprocess.h @@ -6,7 +6,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -23,74 +23,96 @@ #include "libmmc_config.h" +/** + * @brief the MessageLevel Enum + * defines what level a message is + */ +namespace MessageLevel { +enum LIBMULTIMC_EXPORT Enum { + MultiMC, /**< MultiMC Messages */ + Debug, /**< Debug Messages */ + Info, /**< Info Messages */ + Message, /**< Standard Messages */ + Warning, /**< Warnings */ + Error, /**< Errors */ + Fatal /**< Fatal Errors */ +}; +} + /** * @file data/minecraftprocess.h * @brief The MinecraftProcess class */ class LIBMULTIMC_EXPORT MinecraftProcess : public QProcess { - Q_OBJECT + Q_OBJECT public: - /** - * @brief MinecraftProcess constructor - * @param inst the Instance pointer to launch - * @param user the minecraft username - * @param session the minecraft session id - * @param console the instance console window - */ - MinecraftProcess(InstancePtr inst, QString user, QString session); - - /** - * @brief launch minecraft - */ - void launch(); - - /** - * @brief extract the instance icon - * @param inst the instance - * @param destination the destination path - */ - static inline void extractIcon(InstancePtr inst, QString destination); - - /** - * @brief extract the MultiMC launcher.jar - * @param destination the destination path - */ - static inline void extractLauncher(QString destination); - - /** - * @brief prepare the launch by extracting icon and launcher - * @param inst the instance - */ - static void prepare(InstancePtr inst); - - /** - * @brief split a string into argv items like a shell would do - * @param args the argument string - * @return a QStringList containing all arguments - */ - static QStringList splitArgs(QString args); + /** + * @brief MinecraftProcess constructor + * @param inst the Instance pointer to launch + * @param user the minecraft username + * @param session the minecraft session id + * @param console the instance console window + */ + MinecraftProcess(InstancePtr inst, QString user, QString session); + + /** + * @brief launch minecraft + */ + void launch(); + + /** + * @brief extract the instance icon + * @param inst the instance + * @param destination the destination path + */ + static inline void extractIcon(InstancePtr inst, QString destination); + + /** + * @brief extract the MultiMC launcher.jar + * @param destination the destination path + */ + static inline void extractLauncher(QString destination); + + /** + * @brief prepare the launch by extracting icon and launcher + * @param inst the instance + */ + static void prepare(InstancePtr inst); + + /** + * @brief split a string into argv items like a shell would do + * @param args the argument string + * @return a QStringList containing all arguments + */ + static QStringList splitArgs(QString args); signals: - /** - * @brief emitted when mc has finished and the PostLaunchCommand was run - */ - void ended(); + /** + * @brief emitted when mc has finished and the PostLaunchCommand was run + */ + void ended(); + + /** + * @brief emitted when we want to log something + * @param text the text to log + * @param level the level to log at + */ + void log(QString text, MessageLevel::Enum level=MessageLevel::MultiMC); protected: - InstancePtr m_instance; - QString m_user; - QString m_session; - QProcess m_prepostlaunchprocess; - QStringList m_arguments; + InstancePtr m_instance; + QString m_user; + QString m_session; + QProcess m_prepostlaunchprocess; + QStringList m_arguments; - void genArgs(); - void log(QString text, ConsoleWindow::WriteMode mode = ConsoleWindow::MULTIMC); + void genArgs(); protected slots: - void finish(int, QProcess::ExitStatus status); - void on_stdErr(); - void on_stdOut(); + void finish(int, QProcess::ExitStatus status); + void on_stdErr(); + void on_stdOut(); }; diff --git a/libmultimc/src/minecraftprocess.cpp b/libmultimc/src/minecraftprocess.cpp index 3aecb1ee..e22a536c 100644 --- a/libmultimc/src/minecraftprocess.cpp +++ b/libmultimc/src/minecraftprocess.cpp @@ -125,22 +125,12 @@ MinecraftProcess::MinecraftProcess(InstancePtr inst, QString user, QString sessi // console window void MinecraftProcess::on_stdErr() { -// if (m_console != nullptr) -// m_console->write(readAllStandardError(), ConsoleWindow::ERROR); + emit log(readAllStandardError(), MessageLevel::Error); } void MinecraftProcess::on_stdOut() { -// 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)); + emit log(readAllStandardOutput(), MessageLevel::Message); } // exit handler @@ -151,7 +141,7 @@ void MinecraftProcess::finish(int code, ExitStatus status) //TODO: error handling } - log("Minecraft exited."); + emit log("Minecraft exited."); m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code)); @@ -191,13 +181,13 @@ void MinecraftProcess::launch() genArgs(); - log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); - log(QString("Instance launched with arguments: '%1'").arg(m_arguments.join("' '"))); + emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); + emit log(QString("Instance launched with arguments: '%1'").arg(m_arguments.join("' '"))); start(m_instance->settings().get("JavaPath").toString(), m_arguments); if (!waitForStarted()) { - log("Could not launch minecraft!", ConsoleWindow::ERROR); + emit log("Could not launch minecraft!"); return; //TODO: error handling } diff --git a/libsettings/CMakeLists.txt b/libsettings/CMakeLists.txt index 9ae48354..e5aae0b7 100644 --- a/libsettings/CMakeLists.txt +++ b/libsettings/CMakeLists.txt @@ -18,6 +18,12 @@ include/overridesetting.h include/basicsettingsobject.h include/inisettingsobject.h + +include/keyring.h +) + +SET(LIBSETTINGS_HEADERS_PRIVATE +src/stubkeyring.h ) SET(LIBSETTINGS_SOURCES @@ -29,6 +35,9 @@ src/overridesetting.cpp src/basicsettingsobject.cpp src/inisettingsobject.cpp + +src/keyring.cpp +src/stubkeyring.cpp ) # Set the include dir path. @@ -37,6 +46,6 @@ include_directories(${LIBSETTINGS_INCLUDE_DIR}) add_definitions(-DLIBSETTINGS_LIBRARY) -add_library(libSettings SHARED ${LIBSETTINGS_SOURCES} ${LIBSETTINGS_HEADERS}) +add_library(libSettings SHARED ${LIBSETTINGS_SOURCES} ${LIBSETTINGS_HEADERS} ${LIBSETTINGS_HEADERS_PRIVATE}) qt5_use_modules(libSettings Core) target_link_libraries(libSettings) diff --git a/libsettings/include/keyring.h b/libsettings/include/keyring.h index afdc3bba..5774e287 100644 --- a/libsettings/include/keyring.h +++ b/libsettings/include/keyring.h @@ -18,7 +18,7 @@ #ifndef KEYRING_H #define KEYRING_H -#include +#include #include "libsettings_config.h" @@ -31,9 +31,8 @@ * @brief The Keyring class * the System Keyring/Keychain/Wallet/Vault/etc */ -class LIBMMCSETTINGS_EXPORT Keyring : public QObject +class LIBSETTINGS_EXPORT Keyring { - Q_OBJECT public: /** * @brief the System Keyring instance diff --git a/libsettings/src/stubkeyring.h b/libsettings/src/stubkeyring.h index 0566d5ab..b5f04e4c 100644 --- a/libsettings/src/stubkeyring.h +++ b/libsettings/src/stubkeyring.h @@ -24,7 +24,6 @@ class StubKeyring : public Keyring { - Q_OBJECT public: virtual bool storePassword(QString service, QString username, QString password); virtual QString getPassword(QString service, QString username); diff --git a/main.cpp b/main.cpp index 7c82d6d8..4239d70f 100644 --- a/main.cpp +++ b/main.cpp @@ -72,6 +72,7 @@ private slots: //if (instance->getShowConsole()) console->show(); connect(proc, SIGNAL(ended()), SLOT(onTerminated())); + connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum))); proc->launch(); } -- cgit From 40570c321069b832722b807227fd8ff9bbd7c10d Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Sun, 24 Mar 2013 15:36:00 +0100 Subject: Fix settings objects, instances can be started from the GUI now --- gui/mainwindow.cpp | 20 ++++++++++++++++++++ gui/mainwindow.h | 4 ++++ libmultimc/src/instance.cpp | 6 ++++++ libmultimc/src/minecraftprocess.cpp | 7 ++++--- libsettings/src/basicsettingsobject.cpp | 5 ++++- libsettings/src/inisettingsobject.cpp | 5 ++++- libsettings/src/setting.cpp | 9 ++++++++- resources/icons/instances/clucker.svg | 12 ++++++------ 8 files changed, 56 insertions(+), 12 deletions(-) (limited to 'libmultimc/src/minecraftprocess.cpp') diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 5a915e8c..408a61c5 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -39,6 +39,7 @@ #include "gui/taskdialog.h" #include "gui/browserdialog.h" #include "gui/aboutdialog.h" +#include "gui/consolewindow.h" #include "kcategorizedview.h" #include "kcategorydrawer.h" @@ -49,6 +50,7 @@ #include "logintask.h" #include +#include "minecraftprocess.h" #include "instancemodel.h" #include "instancedelegate.h" @@ -276,9 +278,27 @@ void MainWindow::doLogin ( QString inst, const QString& errorMsg ) void MainWindow::onLoginComplete ( QString inst, LoginResponse response ) { + // TODO: console + console = new ConsoleWindow(); + auto instance = instList.getInstanceById(inst); + if(instance) + { + proc = new MinecraftProcess(instance, response.username(), response.sessionID()); + + console->show(); + //connect(proc, SIGNAL(ended()), SLOT(onTerminated())); + connect(proc, SIGNAL(log(QString,MessageLevel::Enum)), console, SLOT(write(QString,MessageLevel::Enum))); + proc->launch(); + } + else + { + + } + /* QMessageBox::information ( this, "Login Successful", QString ( "Logged in as %1 with session ID %2. Instance: %3" ). arg ( response.username(), response.sessionID(), inst ) ); + */ } void MainWindow::onLoginFailed ( QString inst, const QString& errorMsg ) diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 5d990639..eec09972 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -26,6 +26,8 @@ class InstanceModel; class InstanceProxyModel; class KCategorizedView; class KCategoryDrawer; +class MinecraftProcess; +class ConsoleWindow; namespace Ui { @@ -94,6 +96,8 @@ private: InstanceModel * model; InstanceProxyModel * proxymodel; InstanceList instList; + MinecraftProcess *proc; + ConsoleWindow *console; }; #endif // MAINWINDOW_H diff --git a/libmultimc/src/instance.cpp b/libmultimc/src/instance.cpp index 1af359d1..f9e105c7 100644 --- a/libmultimc/src/instance.cpp +++ b/libmultimc/src/instance.cpp @@ -48,6 +48,12 @@ Instance::Instance(const QString &rootDir, QObject *parent) : settings().registerSetting(new OverrideSetting("PostExitCommand", globalSettings->getSetting("PostExitCommand"))); + // Window Size + settings().registerSetting(new OverrideSetting("LaunchCompatMode", globalSettings->getSetting("LaunchCompatMode"))); + settings().registerSetting(new OverrideSetting("LaunchMaximized", globalSettings->getSetting("LaunchMaximized"))); + settings().registerSetting(new OverrideSetting("MinecraftWinWidth", globalSettings->getSetting("MinecraftWinWidth"))); + settings().registerSetting(new OverrideSetting("MinecraftWinHeight", globalSettings->getSetting("MinecraftWinHeight"))); + // Memory settings().registerSetting(new OverrideSetting("MinMemAlloc", globalSettings->getSetting("MinMemAlloc"))); settings().registerSetting(new OverrideSetting("MaxMemAlloc", globalSettings->getSetting("MaxMemAlloc"))); diff --git a/libmultimc/src/minecraftprocess.cpp b/libmultimc/src/minecraftprocess.cpp index e22a536c..1239bc3a 100644 --- a/libmultimc/src/minecraftprocess.cpp +++ b/libmultimc/src/minecraftprocess.cpp @@ -182,9 +182,10 @@ void MinecraftProcess::launch() genArgs(); emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory())); - emit log(QString("Instance launched with arguments: '%1'").arg(m_arguments.join("' '"))); - - start(m_instance->settings().get("JavaPath").toString(), m_arguments); + QString JavaPath = m_instance->settings().get("JavaPath").toString(); + emit log(QString("Java path: '%1'").arg(JavaPath)); + emit log(QString("Arguments: '%1'").arg(m_arguments.join("' '"))); + start(JavaPath, m_arguments); if (!waitForStarted()) { emit log("Could not launch minecraft!"); diff --git a/libsettings/src/basicsettingsobject.cpp b/libsettings/src/basicsettingsobject.cpp index 66a2c2c8..484928c8 100644 --- a/libsettings/src/basicsettingsobject.cpp +++ b/libsettings/src/basicsettingsobject.cpp @@ -26,7 +26,10 @@ void BasicSettingsObject::changeSetting(const Setting &setting, QVariant value) { if (contains(setting.id())) { - config.setValue(setting.configKey(), value); + if(value.isValid()) + config.setValue(setting.configKey(), value); + else + config.remove(setting.configKey()); } } diff --git a/libsettings/src/inisettingsobject.cpp b/libsettings/src/inisettingsobject.cpp index 75228865..8c4cc89d 100644 --- a/libsettings/src/inisettingsobject.cpp +++ b/libsettings/src/inisettingsobject.cpp @@ -32,7 +32,10 @@ void INISettingsObject::changeSetting(const Setting &setting, QVariant value) { if (contains(setting.id())) { - m_ini.set(setting.configKey(), value); + if(value.isValid()) + m_ini.set(setting.configKey(), value); + else + m_ini.remove(setting.configKey()); } } diff --git a/libsettings/src/setting.cpp b/libsettings/src/setting.cpp index a224ad39..1a4f9e13 100644 --- a/libsettings/src/setting.cpp +++ b/libsettings/src/setting.cpp @@ -26,9 +26,16 @@ QVariant Setting::get() const { SettingsObject *sbase = qobject_cast(parent()); if (!sbase) + { return defValue(); + } else - return sbase->retrieveValue(*this); + { + QVariant test = sbase->retrieveValue(*this); + if(!test.isValid()) + return defValue(); + return test; + } } QVariant Setting::defValue() const diff --git a/resources/icons/instances/clucker.svg b/resources/icons/instances/clucker.svg index 3ce6ad5c..0c1727eb 100644 --- a/resources/icons/instances/clucker.svg +++ b/resources/icons/instances/clucker.svg @@ -14,7 +14,7 @@ height="32" id="svg2" version="1.1" - inkscape:version="0.48.3.1 r9886" + inkscape:version="0.48.4 r9939" sodipodi:docname="clucker.svg" inkscape:export-filename="/home/peterix/projects/MultiMC4/src/resources/insticons/chicken128.png" inkscape:export-xdpi="360" @@ -234,13 +234,13 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2" - inkscape:cx="-92.12757" - inkscape:cy="71.871222" + inkscape:zoom="11.313708" + inkscape:cx="2.6058272" + inkscape:cy="11.408405" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="1607" + inkscape:window-width="1614" inkscape:window-height="1030" inkscape:window-x="1676" inkscape:window-y="-3" @@ -261,7 +261,7 @@ image/svg+xml - + -- cgit From d24c4823ef8e144a3ffefc208c5a15e86b0b31b1 Mon Sep 17 00:00:00 2001 From: Petr Mrázek Date: Tue, 26 Mar 2013 14:34:34 +0100 Subject: Filter console output, no more sea of red when there's nothing to report. --- libmultimc/include/minecraftprocess.h | 2 ++ libmultimc/src/minecraftprocess.cpp | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) (limited to 'libmultimc/src/minecraftprocess.cpp') diff --git a/libmultimc/include/minecraftprocess.h b/libmultimc/include/minecraftprocess.h index f6272183..ac4d6be2 100644 --- a/libmultimc/include/minecraftprocess.h +++ b/libmultimc/include/minecraftprocess.h @@ -104,6 +104,8 @@ protected: InstancePtr m_instance; QString m_user; QString m_session; + QString m_err_leftover; + QString m_out_leftover; QProcess m_prepostlaunchprocess; QStringList m_arguments; diff --git a/libmultimc/src/minecraftprocess.cpp b/libmultimc/src/minecraftprocess.cpp index 1239bc3a..f1b63e3d 100644 --- a/libmultimc/src/minecraftprocess.cpp +++ b/libmultimc/src/minecraftprocess.cpp @@ -125,12 +125,41 @@ MinecraftProcess::MinecraftProcess(InstancePtr inst, QString user, QString sessi // console window void MinecraftProcess::on_stdErr() { - emit log(readAllStandardError(), MessageLevel::Error); + QByteArray data = readAllStandardError(); + QString str = m_err_leftover + QString::fromLocal8Bit(data); + m_err_leftover.clear(); + QStringList lines = str.split("\n"); + bool complete = str.endsWith("\n"); + + for(int i = 0; i < lines.size() - 1; i++) + { + QString & line = lines[i]; + MessageLevel::Enum level = MessageLevel::Error; + if(line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]") ) + level = MessageLevel::Message; + if(line.contains("[SEVERE]") || line.contains("[WARNING]") || line.contains("[STDERR]")) + level = MessageLevel::Error; + emit log(lines[i].toLocal8Bit(), level); + } + if(!complete) + m_err_leftover = lines.last(); } void MinecraftProcess::on_stdOut() { - emit log(readAllStandardOutput(), MessageLevel::Message); + QByteArray data = readAllStandardOutput(); + QString str = m_out_leftover + QString::fromLocal8Bit(data); + m_out_leftover.clear(); + QStringList lines = str.split("\n"); + bool complete = str.endsWith("\n"); + + for(int i = 0; i < lines.size() - 1; i++) + { + QString & line = lines[i]; + emit log(lines[i].toLocal8Bit(), MessageLevel::Message); + } + if(!complete) + m_out_leftover = lines.last(); } // exit handler -- cgit