diff options
Diffstat (limited to 'proto-wine')
-rw-r--r-- | proto-wine/CMakeLists.txt | 4 | ||||
-rw-r--r-- | proto-wine/ftnoir_protocol_wine.cpp | 32 | ||||
-rw-r--r-- | proto-wine/ftnoir_protocol_wine.h | 10 | ||||
-rw-r--r-- | proto-wine/ftnoir_protocol_wine_dialog.cpp | 25 | ||||
-rw-r--r-- | proto-wine/ftnoir_winecontrols.ui | 113 | ||||
-rw-r--r-- | proto-wine/lang/nl_NL.ts | 16 | ||||
-rw-r--r-- | proto-wine/lang/ru_RU.ts | 16 | ||||
-rw-r--r-- | proto-wine/lang/stub.ts | 16 | ||||
-rw-r--r-- | proto-wine/lang/zh_CN.ts | 16 | ||||
-rw-r--r-- | proto-wine/opentrack-wrapper-wine-main.cxx | 3 | ||||
-rw-r--r-- | proto-wine/opentrack-wrapper-wine-windows.cxx | 35 | ||||
-rw-r--r-- | proto-wine/proton.cpp | 94 | ||||
-rw-r--r-- | proto-wine/wine-shm.h | 7 |
13 files changed, 293 insertions, 94 deletions
diff --git a/proto-wine/CMakeLists.txt b/proto-wine/CMakeLists.txt index b0f18bb2..0beb50e1 100644 --- a/proto-wine/CMakeLists.txt +++ b/proto-wine/CMakeLists.txt @@ -16,7 +16,7 @@ if(NOT WIN32) set(my-rt) endif() file(GLOB wine-deps "${CMAKE_CURRENT_SOURCE_DIR}/*.cxx") - #install(FILES ${wine-deps} DESTINATION "${opentrack-doc-src-pfx}/proto-wine") + #install(FILES ${wine-deps} DESTINATION "${opentrack-src}/proto-wine") add_custom_command( OUTPUT opentrack-wrapper-wine.exe.so DEPENDS ${wine-deps} @@ -27,7 +27,7 @@ if(NOT WIN32) add_custom_target(wine-wrapper DEPENDS opentrack-wrapper-wine.exe.so) add_dependencies(opentrack-proto-wine wine-wrapper) add_dependencies(wine-wrapper opentrack-compat) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/opentrack-wrapper-wine.exe.so" DESTINATION ${opentrack-hier-pfx}) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/opentrack-wrapper-wine.exe.so" DESTINATION ${opentrack-libexec}) endif() endif() endif() diff --git a/proto-wine/ftnoir_protocol_wine.cpp b/proto-wine/ftnoir_protocol_wine.cpp index bed1fed3..af53ff1f 100644 --- a/proto-wine/ftnoir_protocol_wine.cpp +++ b/proto-wine/ftnoir_protocol_wine.cpp @@ -1,12 +1,15 @@ #include "ftnoir_protocol_wine.h" -#include <QString> -#include <string.h> -#include <math.h> #ifndef OTR_WINE_NO_WRAPPER # include "csv/csv.h" #endif #include "compat/library-path.hpp" +#include <cstring> +#include <cmath> + +#include <QString> +#include <QDebug> + wine::wine() = default; wine::~wine() @@ -16,11 +19,14 @@ wine::~wine() if (shm) { shm->stop = true; exit = wrapper.waitForFinished(100); + if (exit) + qDebug() << "proto/wine: wrapper exit code" << wrapper.exitCode(); } if (!exit) { - wrapper.kill(); - wrapper.waitForFinished(-1); + if (wrapper.state() != QProcess::NotRunning) + wrapper.kill(); + wrapper.waitForFinished(1000); } #endif //shm_unlink("/" WINE_SHM_NAME); @@ -64,11 +70,15 @@ module_status wine::initialize() if (s.proton_appid == 0) return error(tr("Must specify application id for Proton (Steam Play)")); - QProcessEnvironment make_steam_environ(const QString& proton_version, int appid); - QString proton_path(const QString& proton_version); + std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_path, int appid); + QString proton_path(const QString& proton_path); + + wine_path = proton_path(s.proton_path().toString()); + auto [proton_env, error_string, success] = make_steam_environ(s.proton_path().toString(), s.proton_appid); + env = proton_env; - wine_path = proton_path(s.proton_version); - env = make_steam_environ(s.proton_version, s.proton_appid); + if (!success) + return error(error_string); } else { @@ -79,7 +89,7 @@ module_status wine::initialize() wineprefix = qgetenv("HOME") + wineprefix.mid(1); if (wineprefix[0] != '/') - error(tr("Wine prefix must be an absolute path (given '%1')").arg(wineprefix)); + return error(tr("Wine prefix must be an absolute path (given '%1')").arg(wineprefix)); env.insert("WINEPREFIX", wineprefix); } @@ -89,6 +99,8 @@ module_status wine::initialize() if (s.fsync) env.insert("WINEFSYNC", "1"); + env.insert("OTR_WINE_PROTO", QString::number(s.protocol+1)); + wrapper.setProcessEnvironment(env); wrapper.setWorkingDirectory(OPENTRACK_BASE_PATH); wrapper.start(wine_path, { library_path + "opentrack-wrapper-wine.exe.so" }); diff --git a/proto-wine/ftnoir_protocol_wine.h b/proto-wine/ftnoir_protocol_wine.h index 8175be03..f7346be9 100644 --- a/proto-wine/ftnoir_protocol_wine.h +++ b/proto-wine/ftnoir_protocol_wine.h @@ -9,9 +9,10 @@ #include "options/options.hpp" using namespace options; -#include <QString> -#include <QProcess> #include <QMutex> +#include <QProcess> +#include <QString> +#include <QVariant> #include <QDebug> @@ -24,8 +25,9 @@ struct settings : opts esync{b, "esync", true}; value<int> proton_appid{b, "proton-appid", 0}; - value<QString> proton_version{b, "proton-version", {} }, - wineprefix{b, "wineprefix", "~/.wine"}; + value<QVariant> proton_path{b, "proton-version", {} }; + value<QString> wineprefix{b, "wineprefix", "~/.wine"}; + value<int> protocol{b, "protocol", 2}; }; class wine : TR, public IProtocol diff --git a/proto-wine/ftnoir_protocol_wine_dialog.cpp b/proto-wine/ftnoir_protocol_wine_dialog.cpp index f1cb01c2..a954a752 100644 --- a/proto-wine/ftnoir_protocol_wine_dialog.cpp +++ b/proto-wine/ftnoir_protocol_wine_dialog.cpp @@ -1,25 +1,37 @@ #include "ftnoir_protocol_wine.h" #include <QDebug> +#include <QDir> + #include "api/plugin-api.hpp" -static const char* proton_versions[] = { - "4.11", "4.2", "3.16", "3.7", +static const char* proton_paths[] = { + "/.steam/steam/steamapps/common", + "/.steam/root/compatibilitytools.d", + "/.local/share/Steam/steamapps/common", }; FTControls::FTControls() { ui.setupUi(this); - for (const char* version : proton_versions) - ui.proton_version->addItem(version, QVariant{version}); - - tie_setting(s.proton_version, ui.proton_version); + for (const char* path : proton_paths) { + QDir dir(QDir::homePath() + path); + dir.setFilter(QDir::Dirs); + dir.setNameFilters({ "Proton*" }); + QFileInfoList list = dir.entryInfoList(); + for (int i = 0; i < list.size(); ++i) { + QFileInfo fileInfo = list.at(i); + ui.proton_version->addItem(fileInfo.fileName(), QVariant{fileInfo.filePath()}); + } + } + tie_setting(s.proton_path, ui.proton_version); tie_setting(s.variant_wine, ui.variant_wine); tie_setting(s.variant_proton, ui.variant_proton); tie_setting(s.esync, ui.esync); tie_setting(s.fsync, ui.fsync); tie_setting(s.proton_appid, ui.proton_appid); tie_setting(s.wineprefix, ui.wineprefix); + tie_setting(s.protocol, ui.protocol_selection); connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &FTControls::doOK); connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &FTControls::doCancel); @@ -36,4 +48,3 @@ void FTControls::doCancel() s.b->reload(); close(); } - diff --git a/proto-wine/ftnoir_winecontrols.ui b/proto-wine/ftnoir_winecontrols.ui index a0a1e071..e9541447 100644 --- a/proto-wine/ftnoir_winecontrols.ui +++ b/proto-wine/ftnoir_winecontrols.ui @@ -9,8 +9,8 @@ <rect> <x>0</x> <y>0</y> - <width>544</width> - <height>410</height> + <width>528</width> + <height>424</height> </rect> </property> <property name="windowTitle"> @@ -33,6 +33,19 @@ <string>Wine variant</string> </property> <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QRadioButton" name="variant_wine"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Wine (system)</string> + </property> + </widget> + </item> <item row="2" column="1" alignment="Qt::AlignRight"> <widget class="QComboBox" name="proton_version"> <property name="sizePolicy"> @@ -49,16 +62,19 @@ </property> </widget> </item> - <item row="0" column="0"> - <widget class="QRadioButton" name="variant_wine"> + <item row="0" column="1"> + <widget class="QLineEdit" name="wineprefix"> <property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="text"> - <string>Wine (system)</string> + <property name="minimumSize"> + <size> + <width>286</width> + <height>0</height> + </size> </property> </widget> </item> @@ -75,22 +91,6 @@ </property> </widget> </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="wineprefix"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>286</width> - <height>0</height> - </size> - </property> - </widget> - </item> </layout> </widget> </item> @@ -100,6 +100,9 @@ <string>Advanced</string> </property> <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>6</number> + </property> <item> <widget class="QCheckBox" name="esync"> <property name="sizePolicy"> @@ -133,18 +136,80 @@ </widget> </item> <item> + <widget class="QWidget" name="widget_2" native="true"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="label_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Protocol</string> + </property> + </widget> + </item> + <item> + <widget class="QComboBox" name="protocol_selection"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <item> + <property name="text"> + <string>Freetrack</string> + </property> + </item> + <item> + <property name="text"> + <string>NPClient</string> + </property> + </item> + <item> + <property name="text"> + <string>Both</string> + </property> + </item> + </widget> + </item> + </layout> + </widget> + </item> + <item> <widget class="QWidget" name="widget" native="true"> <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> <item> <widget class="QLabel" name="label"> <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> diff --git a/proto-wine/lang/nl_NL.ts b/proto-wine/lang/nl_NL.ts index f71d8ad7..e2183cc8 100644 --- a/proto-wine/lang/nl_NL.ts +++ b/proto-wine/lang/nl_NL.ts @@ -39,6 +39,22 @@ <source>Proton (Steam Play)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Freetrack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NPClient</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Both</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>wine</name> diff --git a/proto-wine/lang/ru_RU.ts b/proto-wine/lang/ru_RU.ts index 9937083f..f3b44bd2 100644 --- a/proto-wine/lang/ru_RU.ts +++ b/proto-wine/lang/ru_RU.ts @@ -39,6 +39,22 @@ <source>Proton (Steam Play)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Freetrack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NPClient</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Both</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>wine</name> diff --git a/proto-wine/lang/stub.ts b/proto-wine/lang/stub.ts index 9b74a44d..dd4f946f 100644 --- a/proto-wine/lang/stub.ts +++ b/proto-wine/lang/stub.ts @@ -39,6 +39,22 @@ <source>Proton (Steam Play)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Freetrack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NPClient</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Both</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>wine</name> diff --git a/proto-wine/lang/zh_CN.ts b/proto-wine/lang/zh_CN.ts index 9b74a44d..dd4f946f 100644 --- a/proto-wine/lang/zh_CN.ts +++ b/proto-wine/lang/zh_CN.ts @@ -39,6 +39,22 @@ <source>Proton (Steam Play)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Protocol</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Freetrack</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>NPClient</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Both</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>wine</name> diff --git a/proto-wine/opentrack-wrapper-wine-main.cxx b/proto-wine/opentrack-wrapper-wine-main.cxx index 3df3abc7..9248a212 100644 --- a/proto-wine/opentrack-wrapper-wine-main.cxx +++ b/proto-wine/opentrack-wrapper-wine-main.cxx @@ -5,7 +5,6 @@ #include <cstdio> #include "freetrackclient/fttypes.h" -#include "wine-shm.h" #include "compat/export.hpp" enum Axis { @@ -14,6 +13,7 @@ enum Axis { #define __WINE_OLE2_H #include "compat/shm.h" +#include "wine-shm.h" void create_registry_key(void); @@ -42,7 +42,6 @@ private: void* mem; void *hMutex, *hMapFile; }; -#include <windows.h> int main(void) { diff --git a/proto-wine/opentrack-wrapper-wine-windows.cxx b/proto-wine/opentrack-wrapper-wine-windows.cxx index 88ced502..c1d552e1 100644 --- a/proto-wine/opentrack-wrapper-wine-windows.cxx +++ b/proto-wine/opentrack-wrapper-wine-windows.cxx @@ -4,18 +4,22 @@ #define shm_wrapper ShmWine #define __WINE_OLE2_H +// OSX sdk 10.8 build error otherwise +#undef _LIBCPP_MSVCRT + #include "compat/shm.h" #include "compat/shm.cpp" #include "wine-shm.h" #include "compat/library-path.hpp" +#include <cstdlib> #include <cstring> +#include <sysexits.h> using std::strcat; -static void write_path(const char* key, const char* subkey) +static void write_path(const char* key, const char* subkey, bool path) { - char dir[8192]; - dir[sizeof(dir)-1] = '\0'; + char dir[8192] {}; if (GetCurrentDirectoryA(8192, dir) < 8190) { @@ -36,13 +40,32 @@ static void write_path(const char* key, const char* subkey) // there's always a leading and trailing slash strcat(dir, OPENTRACK_LIBRARY_PATH); //strcat(dir, "/"); + if (!path) + dir[0] = '\0'; (void) RegSetValueExA(hkpath, subkey, 0, REG_SZ, (BYTE*) dir, strlen(dir) + 1); RegCloseKey(hkpath); } } } -void create_registry_key(void) { - write_path("Software\\NaturalPoint\\NATURALPOINT\\NPClient Location", "Path"); - write_path("Software\\Freetrack\\FreeTrackClient", "Path"); +void create_registry_key(void) +{ + bool use_freetrack, use_npclient; + const char* env = getenv("OTR_WINE_PROTO"); + char* endptr; + if (!env) env = ""; + int selection = strtol(env, &endptr, 10); + if (*endptr) + selection = 0; + + switch (selection) + { + default: std::exit(EX_USAGE); + case 1: use_freetrack = true, use_npclient = false; break; + case 2: use_freetrack = false, use_npclient = true; break; + case 3: use_freetrack = true, use_npclient = true; break; + } + + write_path("Software\\NaturalPoint\\NATURALPOINT\\NPClient Location", "Path", use_npclient); + write_path("Software\\Freetrack\\FreeTrackClient", "Path", use_freetrack); } diff --git a/proto-wine/proton.cpp b/proto-wine/proton.cpp index 15306d26..5ecd1f93 100644 --- a/proto-wine/proton.cpp +++ b/proto-wine/proton.cpp @@ -7,56 +7,86 @@ #ifndef OTR_WINE_NO_WRAPPER -#include <QtGlobal> -#include <QString> +#include <QDebug> +#include <QDir> +#include <QFileInfo> #include <QProcessEnvironment> +#include <QtGlobal> + + +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_version, int appid) + +std::tuple<QProcessEnvironment, QString, bool> make_steam_environ(const QString& proton_path, int appid) { - auto ret = QProcessEnvironment::systemEnvironment(); + using ret = std::tuple<QProcessEnvironment, QString, bool>; + auto env = QProcessEnvironment::systemEnvironment(); + QString error = ""; QString home = qgetenv("HOME"); + QString runtime_path, app_wineprefix; auto expand = [&](QString x) { - x.replace("HOME", home); - x.replace("PROTON", proton_version); - return x; - }; + x.replace("HOME", home); + x.replace("PROTON_PATH", proton_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."); + + 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( - ":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); + env.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)); + env.insert("LD_LIBRARY_PATH", library_path); + env.insert("WINEPREFIX", app_wineprefix); - return ret; + return ret(env, error, error.isEmpty()); } -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); - return wine_path; + return proton_path + "/dist/bin/wine"; } #endif diff --git a/proto-wine/wine-shm.h b/proto-wine/wine-shm.h index 536f647f..62e8bbec 100644 --- a/proto-wine/wine-shm.h +++ b/proto-wine/wine-shm.h @@ -8,17 +8,10 @@ # pragma clang diagnostic ignored "-Wreserved-id-macro" #endif -// OSX sdk 10.8 build error otherwise -#undef _LIBCPP_MSVCRT - #ifdef __clang__ # pragma clang diagnostic pop #endif -#include <memory> - -template<typename t> using ptr = std::shared_ptr<t>; - struct WineSHM { double data[6]; int gameid, gameid2; |