Skip to content

Commit 49127a1

Browse files
committed
add umu launcher
1 parent 2ebac99 commit 49127a1

File tree

7 files changed

+224
-70
lines changed

7 files changed

+224
-70
lines changed

src/Model.cpp

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,56 +133,107 @@ int Model::getItemState(int id) {
133133

134134
bool Model::runBash(const int id) {
135135
bool status = true;
136-
// m_bashRunner
136+
QString s;
137+
if (id < 0) { // we use original game id as negative number
138+
int orgId = (-1)*id;
139+
s = QString("Original.TR%1").arg(orgId);
140+
} else {
141+
s = QString("%1.TRLE").arg(id);
142+
}
143+
const QString a = fileManager.getFullPath(s, false);
144+
const QString b = ExecutableNames().data[data.getType(id)];
145+
146+
m_bashRunner.setWorkingDirectory(a);
147+
m_bashRunner.insertArguments(QStringList()
148+
<< QString("%1/%2/start.sh").arg(a, b));
149+
m_bashRunner.run();
150+
137151
return status;
138152
}
139153

140154
bool Model::runUmu(const int id) {
141155
bool status = true;
142-
// m_umuRunner
156+
157+
QString a;
158+
if (id < 0) { // we use original game id as negative number
159+
int orgId = (-1)*id;
160+
QString s = QString("Original.TR%1").arg(orgId);
161+
a = fileManager.getFullPath(s, false);
162+
} else {
163+
QString s = QString("%1.TRLE").arg(id);
164+
a = fileManager.getFullPath(s, false);
165+
}
166+
167+
const QString b = fileManager.getExtraPathToExe(a);
168+
const QString c = ExecutableNames().data[data.getType(id)];
169+
170+
m_umuRunner.setWorkingDirectory(b);
171+
m_umuRunner.insertArguments(QStringList() << QString("%1/%2").arg(b, c));
172+
m_umuRunner.run();
173+
143174
return status;
144175
}
145176

177+
178+
void Model::setUmuEnv(const QVector<QPair<QString, QString>>& env) {
179+
for (const QPair<QString, QString>& e : env) {
180+
m_umuRunner.insertProcessEnvironment(e);
181+
}
182+
}
183+
184+
void Model::setUmuSetup() {
185+
m_umuRunner.toggleSetupFlag();
186+
}
187+
146188
bool Model::runSteam(const int id) {
147189
bool status = true;
148190
QStringList arg;
149191
const qint64 appid = SteamAppIds().data[data.getType(id)];
150192
arg << QString("steam://run/%1").arg(appid);
151-
m_steamRunner.clearArguments();
152193
m_steamRunner.insertArguments(arg);
153194
m_steamRunner.run();
154195
return status;
155196
}
156197

157198
bool Model::runLutris(const QStringList& arg) {
158199
bool status = true;
159-
m_lutrisRunner.clearArguments();
160200
m_lutrisRunner.insertArguments(arg);
161201
m_lutrisRunner.run();
162202
return status;
163203
}
164204

165-
bool Model::runWine(const int id) {
205+
bool Model::runWine(const qint64 id) {
166206
bool status = true;
167207

168-
QString s;
208+
QString a;
169209
if (id < 0) { // we use original game id as negative number
170210
int orgId = (-1)*id;
171-
s = QString("Original.TR%1").arg(orgId);
211+
QString s = QString("Original.TR%1").arg(orgId);
212+
a = fileManager.getFullPath(s, false);
172213
} else {
173-
s = QString("%1.TRLE").arg(id);
214+
QString s = QString("%1.TRLE").arg(id);
215+
a = fileManager.getFullPath(s, false);
174216
}
175-
const QString e = fileManager.getExtraPathToExe(s);
176-
const QString a = fileManager.getFullPath(e, false);
177-
const QString b = ExecutableNames().data[data.getType(id)];
178217

179-
m_wineRunner.setWorkingDirectory(a);
180-
m_wineRunner.insertArguments(QStringList() << QString("%1/%2").arg(a, b));
181-
// m_wineRunner.insertProcessEnvironment()
218+
const QString b = fileManager.getExtraPathToExe(a);
219+
const QString c = ExecutableNames().data[data.getType(id)];
220+
221+
m_wineRunner.setWorkingDirectory(b);
222+
m_wineRunner.insertArguments(QStringList() << QString("%1/%2").arg(b, c));
182223
m_wineRunner.run();
183224
return status;
184225
}
185226

227+
void Model::setWineEnv(const QVector<QPair<QString, QString>>& env) {
228+
for (const QPair<QString, QString>& e : env) {
229+
m_wineRunner.insertProcessEnvironment(e);
230+
}
231+
}
232+
233+
void Model::setWineSetup() {
234+
m_umuRunner.toggleSetupFlag();
235+
}
236+
186237
bool Model::setLink(int id) {
187238
bool status = false;
188239
if (id < 0) { // we use original game id as negative number

src/Model.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@ class Model : public QObject {
6767
void getList(QVector<ListItemData>* list);
6868
void getCoverList(QVector<ListItemData*>* tiems);
6969
int getItemState(int id);
70-
bool runWine(const int id);
70+
bool runUmu(const int id);
71+
void setUmuEnv(const QVector<QPair<QString, QString>>& env);
72+
void setUmuSetup();
73+
bool runWine(const qint64 id);
74+
void setWineEnv(const QVector<QPair<QString, QString>>& env);
75+
void setWineSetup();
7176
bool runLutris(const QStringList& arg);
7277
bool runSteam(const int id);
73-
bool runUmu(const int id);
7478
bool runBash(const int id);
7579
bool setLink(int id);
7680
QString getGameDirectory(int id);
@@ -100,7 +104,7 @@ class Model : public QObject {
100104
Runner m_wineRunner = Runner("wine");
101105
Runner m_lutrisRunner = Runner("lutris");
102106
Runner m_steamRunner = Runner("steam");
103-
Runner m_umuRunner = Runner("umu-launcher");
107+
Runner m_umuRunner = Runner("umu-run");
104108
Runner m_bashRunner = Runner("bash");
105109

106110
PyRunner m_pyRunner;

src/Runner.cpp

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818

1919
Runner::Runner() : m_env(QProcessEnvironment::systemEnvironment()) {
2020
m_status = 0;
21+
m_setupFlag = false;
2122
}
2223

2324
Runner::Runner(const QString& cmd)
24-
: m_env(QProcessEnvironment::systemEnvironment()) {
25+
: m_env(QProcessEnvironment::systemEnvironment()), m_command(cmd) {
2526
m_status = 0;
26-
m_command = cmd;
27+
m_setupFlag = false;
2728
}
2829

2930
void Runner::insertArguments(const QStringList& value) {
@@ -34,9 +35,8 @@ void Runner::clearArguments() {
3435
m_arguments.clear();
3536
}
3637

37-
void Runner::insertProcessEnvironment(
38-
const QString& name, const QString& value) {
39-
m_env.insert(name, value);
38+
void Runner::insertProcessEnvironment(const QPair<QString, QString> env) {
39+
m_env.insert(env.first, env.second);
4040
}
4141

4242
void Runner::clearProcessEnvironment() {
@@ -47,20 +47,51 @@ void Runner::setWorkingDirectory(const QString& cwd) {
4747
m_process.setWorkingDirectory(cwd);
4848
}
4949

50+
51+
void Runner::toggleSetupFlag() {
52+
m_setupFlag = !m_setupFlag;
53+
}
54+
5055
void Runner::run() {
51-
// Start Wine with the application as an argument
56+
int status = 1;
57+
5258
m_process.setProcessEnvironment(m_env);
53-
m_process.start(m_command, m_arguments);
54-
QObject::connect(&m_process, &QProcess::readyReadStandardOutput, [&]() {
55-
// Read and print the output to standard output
56-
QTextStream(stdout) << m_process.readAllStandardOutput();
57-
});
58-
59-
if (m_process.waitForStarted() == true) {
60-
m_process.waitForFinished();
61-
m_status = 0;
62-
} else {
63-
m_status = 1;
64-
qWarning() << "Failed to start Wine process!";
59+
m_process.setProgram(m_command);
60+
if (m_setupFlag) {
61+
m_arguments << "-setup";
62+
}
63+
m_process.setArguments(m_arguments);
64+
65+
// Merge stderr into stdout
66+
m_process.setProcessChannelMode(QProcess::MergedChannels);
67+
68+
// Connect single output handler
69+
QObject::connect(&m_process, &QProcess::readyReadStandardOutput,
70+
this, &Runner::handleOutput);
71+
72+
m_process.start();
73+
bool hasStarted = m_process.waitForStarted();
74+
75+
if (hasStarted) {
76+
bool finished = false;
77+
finished = m_process.waitForFinished();
78+
if (finished) {
79+
status = 0;
80+
}
81+
}
82+
83+
if (status != 0) {
84+
qWarning() << "Failed to start or finish process!";
6585
}
86+
87+
m_env.clear();
88+
m_arguments.clear();
89+
m_setupFlag = false;
90+
m_status = status;
91+
}
92+
93+
void Runner::handleOutput() {
94+
QByteArray output = m_process.readAllStandardOutput();
95+
QTextStream outStream(stdout);
96+
outStream << output;
6697
}

src/Runner.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,24 @@ class Runner : public QObject {
2929
int getCommand();
3030
bool setCommand(const QString& cmd);
3131
void setWorkingDirectory(const QString& cwd);
32-
void insertProcessEnvironment(const QString& name, const QString& value);
32+
void insertProcessEnvironment(const QPair<QString, QString> env);
3333
void clearProcessEnvironment();
3434
void insertArguments(const QStringList& value);
3535
void clearArguments();
36+
void toggleSetupFlag();
3637

3738
signals:
3839
void started();
3940
void stopped();
4041

4142
private:
43+
void handleOutput();
4244
QProcess m_process;
4345
QProcessEnvironment m_env;
4446
QString m_command;
4547
QStringList m_arguments;
4648
qint64 m_status;
49+
bool m_setupFlag;
4750
};
4851

4952
#endif // SRC_RUNNER_HPP_

src/TombRaiderLinuxLauncher.cpp

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "../src/TombRaiderLinuxLauncher.hpp"
1515
#include "ui_TombRaiderLinuxLauncher.h"
16+
#include <qlineedit.h>
1617

1718

1819
TombRaiderLinuxLauncher::TombRaiderLinuxLauncher(QWidget *parent)
@@ -369,6 +370,27 @@ void TombRaiderLinuxLauncher::setOptionsClicked() {
369370
readSavedSettings();
370371
}
371372

373+
QStringList TombRaiderLinuxLauncher::parsToArg(const QString& str) {
374+
return str.split(QRegularExpression("\\s+"), Qt::SkipEmptyParts);
375+
}
376+
377+
QVector<QPair<QString, QString>>
378+
TombRaiderLinuxLauncher::parsToEnv(const QString& str) {
379+
QRegularExpression re("(\\w+)\\s*=\\s*\"([^\"]*)\"");
380+
QRegularExpressionMatchIterator it = re.globalMatch(str);
381+
382+
QVector<QPair<QString, QString>> envList;
383+
while (it.hasNext()) {
384+
QRegularExpressionMatch match = it.next();
385+
// VARIABLE="some text here"
386+
QPair<QString, QString> env;
387+
env.first = match.captured(1); // VARIABLE
388+
env.second = match.captured(2); // "some text here"
389+
envList.append(env);
390+
}
391+
return envList;
392+
}
393+
372394
void TombRaiderLinuxLauncher::linkClicked() {
373395
qDebug() << "linkClicked()";
374396
QModelIndex current = ui->listViewLevels->currentIndex();
@@ -377,45 +399,58 @@ void TombRaiderLinuxLauncher::linkClicked() {
377399
if (id != 0) {
378400
qint64 type = settings.value(
379401
QString("level%1/RunnerType").arg(id)).toInt();
402+
QLineEdit* input = ui->lineEditEnvironmentVariables;
380403
qDebug() << "Type was: " << type;
404+
381405
if (type == 0) {
382-
Model::getInstance().runWine(id);
406+
QVector<QPair<QString, QString>> envList =
407+
parsToEnv(input->text());
408+
if (ui->checkBoxSetup->isChecked()) {
409+
Model::getInstance().setUmuSetup();
410+
}
411+
Model::getInstance().setUmuEnv(envList);
412+
Model::getInstance().runUmu(id);
413+
383414
} else if (type == 1) {
384-
const QString arg = ui->lineEditEnvironmentVariables->text();
385-
QStringList argList = arg.split(
386-
QRegularExpression("\\s+"), Qt::SkipEmptyParts);
387-
Model::getInstance().runLutris(argList);
415+
QVector<QPair<QString, QString>> envList =
416+
parsToEnv(input->text());
417+
if (ui->checkBoxSetup->isChecked()) {
418+
Model::getInstance().setUmuSetup();
419+
}
420+
Model::getInstance().setWineEnv(envList);
421+
Model::getInstance().runWine(id);
422+
388423
} else if (type == 2) {
424+
QStringList argList = parsToArg(input->text());
425+
Model::getInstance().runLutris(argList);
426+
427+
} else if (type == 3) {
389428
if (!controller.link(id)) {
390429
qDebug() << "link error";
391430
}
392-
const QString arg = ui->lineEditEnvironmentVariables->text();
393-
QStringList argList = arg.split(
394-
QRegularExpression("\\s+"), Qt::SkipEmptyParts);
431+
QStringList argList = parsToArg(input->text());
395432
Model::getInstance().runLutris(argList);
396-
} else if (type == 3) {
397-
Model::getInstance().runSteam(id);
433+
398434
} else if (type == 4) {
435+
Model::getInstance().runSteam(id);
436+
437+
} else if (type == 5) {
399438
if (levelListModel->getListType()) {
400439
id = (-1)*id;
401440
}
402441
if (!controller.link(id)) {
403442
qDebug() << "link error";
404443
}
405444
QApplication::quit();
406-
} else if (type == 5) {
445+
446+
} else if (type == 6) {
407447
if (levelListModel->getListType()) {
408448
id = (-1)*id;
409449
}
410450
if (!controller.link(id)) {
411451
qDebug() << "link error";
412452
}
413-
} else if (type == 6) {
414-
const QString arg = ui->lineEditEnvironmentVariables->text();
415-
QStringList argList = arg.split(
416-
QRegularExpression("\\s+"), Qt::SkipEmptyParts);
417-
qDebug() << "args was: " << argList[0];
418-
Model::getInstance().runUmu(id);
453+
419454
} else if (type == 7) {
420455
Model::getInstance().runBash(id);
421456
}

src/TombRaiderLinuxLauncher.hpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,14 @@ class TombRaiderLinuxLauncher : public QMainWindow {
166166
void readSavedSettings();
167167

168168
/**
169-
* Executes the sorting algorithm.
169+
* Pars input string to string list.
170170
*/
171-
void sortItems(std::function<bool(
172-
QListWidgetItem*,
173-
QListWidgetItem*)> compare);
171+
QStringList parsToArg(const QString& str);
172+
173+
/**
174+
* Pars input string to list of environment variables.
175+
*/
176+
QVector<QPair<QString, QString>> parsToEnv(const QString& str);
174177

175178
LevelListModel *levelListModel;
176179
Controller& controller = Controller::getInstance();

0 commit comments

Comments
 (0)