summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPriton-CE <thies.eric@gmail.com>2024-09-21 01:00:42 +0200
committerPriton-CE <thies.eric@gmail.com>2024-09-21 01:00:42 +0200
commit7d69af6b32a691e98827ea10315a456a07990fac (patch)
treeaa9fa429dfb140c11dd0cfd34c4f6cd157f6d7af
parent08fff53a956deb437cac4f642b45eea03e2fbbde (diff)
added handling for custom proton prefixes and cleaned up the wine protocol init procedure
-rw-r--r--proto-wine/ftnoir_protocol_wine.cpp94
-rw-r--r--proto-wine/lang/de_DE.ts4
-rw-r--r--proto-wine/lang/nl_NL.ts4
-rw-r--r--proto-wine/lang/ru_RU.ts4
-rw-r--r--proto-wine/lang/stub.ts4
-rw-r--r--proto-wine/lang/zh_CN.ts4
-rw-r--r--proto-wine/proton.cpp31
-rw-r--r--proto-wine/proton.h7
8 files changed, 116 insertions, 36 deletions
diff --git a/proto-wine/ftnoir_protocol_wine.cpp b/proto-wine/ftnoir_protocol_wine.cpp
index b70b3f16..47d37aeb 100644
--- a/proto-wine/ftnoir_protocol_wine.cpp
+++ b/proto-wine/ftnoir_protocol_wine.cpp
@@ -1,4 +1,5 @@
#include "ftnoir_protocol_wine.h"
+#include <qprocess.h>
#ifndef OTR_WINE_NO_WRAPPER
# include "csv/csv.h"
#endif
@@ -10,6 +11,8 @@
#include <QString>
#include <QDebug>
+#include "proton.h"
+
wine::wine() = default;
wine::~wine()
@@ -63,50 +66,90 @@ module_status wine::initialize()
#ifndef OTR_WINE_NO_WRAPPER
static const QString library_path(OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH);
+ /////////////////////////
+ // determine wine path //
+ /////////////////////////
QString wine_path = "wine";
- if (s.wine_select_path().toString() != "WINE") {
- // if we are not supposed to use system wine then:
- if (s.wine_select_path().toString() != "CUSTOM") {
- // if we don't have a custom path then change the wine_path to the path corresponding to the selected version
- wine_path = s.wine_select_path().toString();
- }
- else if (!s.wine_custom_path->isEmpty()) {
- // if we do have a custom path and it is not empty then
- wine_path = s.wine_custom_path;
+
+ if (s.variant_wine) {
+ // NORMAL WINE
+
+ // resolve combo box
+ if (s.wine_select_path().toString() != "WINE") {
+ // if we are not supposed to use system wine then:
+ if (s.wine_select_path().toString() != "CUSTOM") {
+ // if we don't have a custom path then change the wine_path to the path corresponding to the selected version
+ wine_path = s.wine_select_path().toString();
+ }
+ else if (!s.wine_custom_path->isEmpty()) {
+ // if we do have a custom path and it is not empty then
+ wine_path = s.wine_custom_path;
+ }
}
+
+ // parse tilde if present
+ if (wine_path[0] == '~')
+ wine_path = qgetenv("HOME") + wine_path.mid(1);
}
- if (wine_path[0] == '~')
- wine_path = qgetenv("HOME") + wine_path.mid(1);
+ else if (s.variant_proton)
+ {
+ // PROTON
+ wine_path = s.proton_path().toString() + "/bin/wine";
+ }
qDebug() << "proto/wine: wine_path:" << wine_path;
- auto env = QProcessEnvironment::systemEnvironment();
+ /////////////////////////////////////
+ // determine environment variables //
+ /////////////////////////////////////
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+
+ // if proton is used setup proton environment
if (s.variant_proton)
{
if (s.proton_appid == 0)
return error(tr("Must specify application id for Proton (Steam Play)"));
- std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_dist_path, int appid);
- QString proton_path(const QString& proton_dist_path);
+ auto [proton_env, env_error_string, env_success] = make_steam_environ(s.proton_path().toString());
+ env = proton_env;
- QString proton_dist_path = s.proton_path().toString();
+ if (!env_success)
+ return error(env_error_string);
+ }
- wine_path = proton_path(proton_dist_path);
- auto [proton_env, error_string, success] = make_steam_environ(proton_dist_path, s.proton_appid);
- env = proton_env;
+ // determine wineprefix
+ if (s.variant_proton && s.variant_proton_steamplay) {
+ // wine prefix is dependend on steam
+
+ auto [prefix, error_string, success] = make_wineprefix(s.proton_appid);
+ env.insert("WINEPREFIX", prefix);
if (!success)
return error(error_string);
}
- else
- {
- QString wineprefix = "~/.wine";
- if (!s.wineprefix->isEmpty())
+ else {
+ // wine prefix was supplied via path
+
+ QString wineprefix = "";
+
+ // check if prefix was supplied via wine
+ if (s.variant_wine && !s.wineprefix->isEmpty())
wineprefix = s.wineprefix;
+
+ // check if prefix was supplied via proton
+ if (s.variant_proton_external && !s.protonprefix->isEmpty())
+ wineprefix = s.protonprefix;
+
+ // check if the user specified a prefix anywhere
+ if (wineprefix.isEmpty())
+ return error(tr("Prefix has not been defined!").arg(wineprefix));
+
+ // handle tilde
if (wineprefix[0] == '~')
wineprefix = qgetenv("HOME") + wineprefix.mid(1);
+ // return error if relative path is given
if (wineprefix[0] != '/')
return error(tr("Wine prefix must be an absolute path (given '%1')").arg(wineprefix));
@@ -115,13 +158,20 @@ module_status wine::initialize()
env.insert("WINEPREFIX", wineprefix);
}
+ // ESYNC and FSYNC
if (s.esync)
env.insert("WINEESYNC", "1");
if (s.fsync)
env.insert("WINEFSYNC", "1");
+ // Headtracking Protocol
env.insert("OTR_WINE_PROTO", QString::number(s.protocol+1));
+
+ ////////////////////////////////
+ // launch the wrapper program //
+ ////////////////////////////////
+
wrapper.setProcessEnvironment(env);
wrapper.setWorkingDirectory(OPENTRACK_BASE_PATH);
wrapper.start(wine_path, { library_path + "opentrack-wrapper-wine.exe.so" });
diff --git a/proto-wine/lang/de_DE.ts b/proto-wine/lang/de_DE.ts
index d39458d0..072c8626 100644
--- a/proto-wine/lang/de_DE.ts
+++ b/proto-wine/lang/de_DE.ts
@@ -121,6 +121,10 @@
<source>Can&apos;t open shared memory mapping</source>
<translation>Shared-Memory-Mapping kann nicht geƶffnet werden</translation>
</message>
+ <message>
+ <source>Prefix has not been defined!</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>wine_metadata</name>
diff --git a/proto-wine/lang/nl_NL.ts b/proto-wine/lang/nl_NL.ts
index 5cfc99f5..bc3ef604 100644
--- a/proto-wine/lang/nl_NL.ts
+++ b/proto-wine/lang/nl_NL.ts
@@ -121,6 +121,10 @@
<source>Failed to start Wine! Make sure the binary is set correctly.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Prefix has not been defined!</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>wine_metadata</name>
diff --git a/proto-wine/lang/ru_RU.ts b/proto-wine/lang/ru_RU.ts
index 40c154c6..a7702454 100644
--- a/proto-wine/lang/ru_RU.ts
+++ b/proto-wine/lang/ru_RU.ts
@@ -121,6 +121,10 @@
<source>Failed to start Wine! Make sure the binary is set correctly.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Prefix has not been defined!</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>wine_metadata</name>
diff --git a/proto-wine/lang/stub.ts b/proto-wine/lang/stub.ts
index 5769bfd8..2c708749 100644
--- a/proto-wine/lang/stub.ts
+++ b/proto-wine/lang/stub.ts
@@ -121,6 +121,10 @@
<source>Failed to start Wine! Make sure the binary is set correctly.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Prefix has not been defined!</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>wine_metadata</name>
diff --git a/proto-wine/lang/zh_CN.ts b/proto-wine/lang/zh_CN.ts
index db23f8e8..6884f266 100644
--- a/proto-wine/lang/zh_CN.ts
+++ b/proto-wine/lang/zh_CN.ts
@@ -121,6 +121,10 @@
<source>Failed to start Wine! Make sure the binary is set correctly.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Prefix has not been defined!</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>wine_metadata</name>
diff --git a/proto-wine/proton.cpp b/proto-wine/proton.cpp
index aa2c3755..998da748 100644
--- a/proto-wine/proton.cpp
+++ b/proto-wine/proton.cpp
@@ -10,9 +10,9 @@
#include <QDebug>
#include <QDir>
#include <QFileInfo>
-#include <QProcessEnvironment>
#include <QtGlobal>
+#include "proton.h"
static const char* steam_paths[] = {
"/.steam/steam/steamapps/compatdata",
@@ -27,13 +27,13 @@ static const char* runtime_paths[] = {
};
-std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_dist_path, int appid)
+std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_dist_path)
{
using ret = std::tuple<QProcessEnvironment, QString, bool>;
auto env = QProcessEnvironment::systemEnvironment();
QString error = "";
QString home = qgetenv("HOME");
- QString runtime_path, app_wineprefix;
+ QString runtime_path;
auto expand = [&](QString x) {
x.replace("HOME", home);
@@ -51,14 +51,6 @@ std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString&
if (runtime_path.isEmpty())
error = QString("Couldn't find a Steam runtime.");
- for (const char* path : steam_paths) {
- QDir dir(QDir::homePath() + path + expand("/%1/pfx").arg(appid));
- if (dir.exists())
- app_wineprefix = dir.absolutePath();
- }
- if (app_wineprefix.isEmpty())
- error = QString("Couldn't find a Wineprefix for AppId %1").arg(appid);
-
QString path = expand(
":PROTON_DIST_PATH/bin"
);
@@ -81,14 +73,25 @@ std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString&
);
library_path += ':'; library_path += qgetenv("LD_LIBRARY_PATH");
env.insert("LD_LIBRARY_PATH", library_path);
- env.insert("WINEPREFIX", app_wineprefix);
return ret(env, error, error.isEmpty());
}
-QString proton_path(const QString& proton_dist_path)
+std::tuple<QString, QString, bool> make_wineprefix(int appid)
{
- return proton_dist_path + "/bin/wine";
+ using ret = std::tuple<QString, QString, bool>;
+ QString error = "";
+ QString app_wineprefix;
+ for (const char* path : steam_paths) {
+ QDir dir(QDir::homePath() + path + QString("/%1/pfx").arg(appid));
+ if (dir.exists())
+ app_wineprefix = dir.absolutePath();
+ }
+ if (app_wineprefix.isEmpty())
+ error = QString("Couldn't find a Wineprefix for AppId %1").arg(appid);
+
+ return ret(app_wineprefix, error, error.isEmpty());
}
+
#endif
diff --git a/proto-wine/proton.h b/proto-wine/proton.h
new file mode 100644
index 00000000..51539305
--- /dev/null
+++ b/proto-wine/proton.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include <qchar.h>
+#include <qprocess.h>
+
+std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_dist_path);
+std::tuple<QString, QString, bool> make_wineprefix(int appid); \ No newline at end of file