summaryrefslogtreecommitdiffhomepage
path: root/proto-wine/proton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'proto-wine/proton.cpp')
-rw-r--r--proto-wine/proton.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/proto-wine/proton.cpp b/proto-wine/proton.cpp
new file mode 100644
index 00000000..998da748
--- /dev/null
+++ b/proto-wine/proton.cpp
@@ -0,0 +1,97 @@
+/* Copyright (c) 2019 Stanislaw Halik <sthalik@misaki.pl>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ */
+
+#ifndef OTR_WINE_NO_WRAPPER
+
+#include <QDebug>
+#include <QDir>
+#include <QFileInfo>
+#include <QtGlobal>
+
+#include "proton.h"
+
+static const char* steam_paths[] = {
+ "/.steam/steam/steamapps/compatdata",
+ "/.local/share/Steam/steamapps/compatdata",
+ "/.steam/debian-installation/steamapps/compatdata",
+};
+
+static const char* runtime_paths[] = {
+ "/.local/share/Steam/ubuntu12_32/steam-runtime",
+ "/.steam/ubuntu12_32/steam-runtime",
+ "/.steam/debian-installation/ubuntu12_32/steam-runtime",
+};
+
+
+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;
+
+ auto expand = [&](QString x) {
+ x.replace("HOME", home);
+ x.replace("PROTON_DIST_PATH", proton_dist_path);
+ x.replace("RUNTIME_PATH", runtime_path);
+ return x;
+ };
+
+ for (const char* path : runtime_paths) {
+ QDir dir(QDir::homePath() + path);
+ if (dir.exists())
+ runtime_path = dir.absolutePath();
+ }
+
+ if (runtime_path.isEmpty())
+ error = QString("Couldn't find a Steam runtime.");
+
+ QString path = expand(
+ ":PROTON_DIST_PATH/bin"
+ );
+ path += ':'; path += qgetenv("PATH");
+ env.insert("PATH", path);
+
+ QString library_path = expand(
+ ":PROTON_DIST_PATH/lib"
+ ":PROTON_DIST_PATH/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");
+ env.insert("LD_LIBRARY_PATH", library_path);
+
+ return ret(env, error, error.isEmpty());
+}
+
+
+std::tuple<QString, QString, bool> make_wineprefix(int appid)
+{
+ 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