diff options
author | Priton-CE <thies.eric@gmail.com> | 2024-09-21 01:00:42 +0200 |
---|---|---|
committer | Priton-CE <thies.eric@gmail.com> | 2024-09-21 01:00:42 +0200 |
commit | 7d69af6b32a691e98827ea10315a456a07990fac (patch) | |
tree | aa9fa429dfb140c11dd0cfd34c4f6cd157f6d7af | |
parent | 08fff53a956deb437cac4f642b45eea03e2fbbde (diff) |
added handling for custom proton prefixes and cleaned up the wine protocol init procedure
-rw-r--r-- | proto-wine/ftnoir_protocol_wine.cpp | 94 | ||||
-rw-r--r-- | proto-wine/lang/de_DE.ts | 4 | ||||
-rw-r--r-- | proto-wine/lang/nl_NL.ts | 4 | ||||
-rw-r--r-- | proto-wine/lang/ru_RU.ts | 4 | ||||
-rw-r--r-- | proto-wine/lang/stub.ts | 4 | ||||
-rw-r--r-- | proto-wine/lang/zh_CN.ts | 4 | ||||
-rw-r--r-- | proto-wine/proton.cpp | 31 | ||||
-rw-r--r-- | proto-wine/proton.h | 7 |
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'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 |