summaryrefslogtreecommitdiffhomepage
path: root/proto-wine/proton.cpp
diff options
context:
space:
mode:
authorRussell Sim <russell.sim@gmail.com>2020-06-13 15:05:22 +0200
committerRussell Sim <russell.sim@gmail.com>2020-06-13 15:07:20 +0200
commitf04ecec2acd165e6dd5692fed21d0667bbf3ac52 (patch)
treef10b26f406a4fc9fb82dbc93156d56032afc1488 /proto-wine/proton.cpp
parent442c01a60ed376c8693255a7649666113250bf37 (diff)
Proton directory discovery
Use search paths to find proton wine and the app directory, so that we can support steam installations in multiple locations and 3rd party proton installations.
Diffstat (limited to 'proto-wine/proton.cpp')
-rw-r--r--proto-wine/proton.cpp68
1 files changed, 46 insertions, 22 deletions
diff --git a/proto-wine/proton.cpp b/proto-wine/proton.cpp
index 15306d26..e8d69fd9 100644
--- a/proto-wine/proton.cpp
+++ b/proto-wine/proton.cpp
@@ -7,55 +7,79 @@
#ifndef OTR_WINE_NO_WRAPPER
+#include <QDebug>
#include <QtGlobal>
#include <QString>
#include <QProcessEnvironment>
+#include <QDir>
+#include <QFileInfo>
-QProcessEnvironment make_steam_environ(const QString& proton_version, int appid)
+
+static const char* steam_paths[] = {
+ "/.steam/steam/steamapps/compatdata",
+ "/.local/share/Steam/steamapps/compatdata",
+};
+
+static const char* runtime_paths[] = {
+ "/.local/share/Steam/ubuntu12_32/steam-runtime",
+ "/.steam/ubuntu12_32/steam-runtime",
+};
+
+
+QProcessEnvironment make_steam_environ(const QString& proton_path, int appid)
{
auto ret = QProcessEnvironment::systemEnvironment();
QString home = qgetenv("HOME");
+ QString runtime_path;
+
+ for (const char* path : runtime_paths) {
+ QDir dir(QDir::homePath() + path);
+ if (dir.exists())
+ runtime_path = dir.absolutePath();
+ }
auto expand = [&](QString x) {
x.replace("HOME", home);
- x.replace("PROTON", proton_version);
+ x.replace("PROTON_PATH", proton_path);
+ x.replace("RUNTIME_PATH", runtime_path);
return x;
};
QString path = expand(
- ":HOME/.local/share/Steam/steamapps/common/Proton PROTON/dist/bin"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/bin"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/usr/bin"
+ ":PROTON_PATH/dist/bin"
);
path += ':'; path += qgetenv("PATH");
ret.insert("PATH", path);
QString library_path = expand(
- ":HOME/.local/share/Steam/steamapps/common/Proton PROTON/dist/lib"
- ":HOME/.local/share/Steam/steamapps/common/Proton PROTON/dist/lib64"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_32"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/pinned_libs_64"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/i386/lib/i386-linux-gnu"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/i386/lib"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib/x86_64-linux-gnu"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/lib"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/usr/lib/x86_64-linux-gnu"
- ":HOME/.local/share/Steam/ubuntu12_32/steam-runtime/amd64/usr/lib"
+ ":PROTON_PATH/dist/lib"
+ ":PROTON_PATH/dist/lib64"
+ ":RUNTIME_PATH/pinned_libs_32"
+ ":RUNTIME_PATH/pinned_libs_64"
+ ":RUNTIME_PATH/i386/lib/i386-linux-gnu"
+ ":RUNTIME_PATH/i386/lib"
+ ":RUNTIME_PATH/i386/usr/lib/i386-linux-gnu"
+ ":RUNTIME_PATH/i386/usr/lib"
+ ":RUNTIME_PATH/amd64/lib/x86_64-linux-gnu"
+ ":RUNTIME_PATH/amd64/lib"
+ ":RUNTIME_PATH/amd64/usr/lib/x86_64-linux-gnu"
+ ":RUNTIME_PATH/amd64/usr/lib"
);
library_path += ':'; library_path += qgetenv("LD_LIBRARY_PATH");
ret.insert("LD_LIBRARY_PATH", library_path);
- ret.insert("WINEPREFIX", expand("HOME/.local/share/Steam/steamapps/compatdata/%1/pfx").arg(appid));
+
+ for (const char* path : steam_paths) {
+ QDir dir(QDir::homePath() + path + expand("/%1/pfx").arg(appid));
+ if (dir.exists())
+ ret.insert("WINEPREFIX", dir.absolutePath());
+ }
return ret;
}
-QString proton_path(const QString& proton_version)
+QString proton_path(const QString& proton_path)
{
- QString wine_path = "HOME/.local/share/Steam/steamapps/common/Proton PROTON/dist/bin/wine";
- wine_path.replace("HOME", qgetenv("HOME"));
- wine_path.replace("PROTON", proton_version);
+ QString wine_path = proton_path + "/dist/bin/wine";
return wine_path;
}