mirror of
https://github.com/redstrate/Astra.git
synced 2025-04-22 12:47:44 +00:00
Add option to change to a custom WINE executable
This commit is contained in:
parent
707866ce1c
commit
f921e734ef
3 changed files with 72 additions and 47 deletions
|
@ -43,6 +43,41 @@ SettingsWindow::SettingsWindow(LauncherWindow& window, QWidget* parent) : window
|
||||||
infoLabel->setWordWrap(true);
|
infoLabel->setWordWrap(true);
|
||||||
wineBoxLayout->addWidget(infoLabel);
|
wineBoxLayout->addWidget(infoLabel);
|
||||||
|
|
||||||
|
auto winePathLabel = new QLabel(window.winePath);
|
||||||
|
winePathLabel->setWordWrap(true);
|
||||||
|
wineBoxLayout->addRow("Wine Executable", winePathLabel);
|
||||||
|
|
||||||
|
auto wineVersionCombo = new QComboBox();
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
wineVersionCombo->insertItem(2, "FFXIV Built-In");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
wineVersionCombo->insertItem(0, "System Wine");
|
||||||
|
wineVersionCombo->insertItem(1, "Custom Path...");
|
||||||
|
wineVersionCombo->setCurrentIndex(window.settings.value("wineVersion", 0).toInt());
|
||||||
|
wineBoxLayout->addWidget(wineVersionCombo);
|
||||||
|
|
||||||
|
auto selectWineButton = new QPushButton("Select Wine Executable");
|
||||||
|
selectWineButton->setEnabled(window.settings.value("wineVersion", 0).toInt() == 2);
|
||||||
|
wineBoxLayout->addWidget(selectWineButton);
|
||||||
|
|
||||||
|
connect(wineVersionCombo, &QComboBox::currentIndexChanged, [this, selectWineButton, winePathLabel](int index) {
|
||||||
|
this->window.settings.setValue("wineVersion", index);
|
||||||
|
selectWineButton->setEnabled(index == 1);
|
||||||
|
|
||||||
|
this->window.readInitialInformation();
|
||||||
|
winePathLabel->setText(this->window.winePath);
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(selectWineButton, &QPushButton::pressed, [this, winePathLabel] {
|
||||||
|
this->window.winePath = QFileDialog::getOpenFileName(this, "Open Wine Executable");
|
||||||
|
this->window.settings.setValue("winePath", this->window.winePath);
|
||||||
|
|
||||||
|
this->window.readInitialInformation();
|
||||||
|
winePathLabel->setText(this->window.winePath);
|
||||||
|
});
|
||||||
|
|
||||||
auto enableDXVKhud = new QCheckBox("Enable DXVK HUD");
|
auto enableDXVKhud = new QCheckBox("Enable DXVK HUD");
|
||||||
enableDXVKhud->setChecked(window.enableDXVKhud);
|
enableDXVKhud->setChecked(window.enableDXVKhud);
|
||||||
wineBoxLayout->addWidget(enableDXVKhud);
|
wineBoxLayout->addWidget(enableDXVKhud);
|
||||||
|
@ -53,25 +88,6 @@ SettingsWindow::SettingsWindow(LauncherWindow& window, QWidget* parent) : window
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_MAC)
|
|
||||||
auto useSystemWine = new QCheckBox("Use System Wine");
|
|
||||||
useSystemWine->setChecked(window.useSystemWine);
|
|
||||||
wineBoxLayout->addWidget(useSystemWine);
|
|
||||||
|
|
||||||
connect(useSystemWine, &QCheckBox::stateChanged, [this](int state) {
|
|
||||||
this->window.useSystemWine = state;
|
|
||||||
this->window.settings.setValue("useSystemWine", static_cast<bool>(state));
|
|
||||||
});
|
|
||||||
|
|
||||||
auto systemWineLabel = new QLabel("Use the system wine instead of the one packaged with the macOS version of FFXIV.\n"
|
|
||||||
"You can easily install wine through homebrew, but please note that the game will not run out of the box\n"
|
|
||||||
"on DX11 without DXVK installed.");
|
|
||||||
systemWineLabel->setWordWrap(true);
|
|
||||||
wineBoxLayout->addWidget(systemWineLabel);
|
|
||||||
|
|
||||||
layout->addRow(wineBox);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
auto useEsync = new QCheckBox("Use Esync");
|
auto useEsync = new QCheckBox("Use Esync");
|
||||||
useEsync->setChecked(window.useEsync);
|
useEsync->setChecked(window.useEsync);
|
||||||
|
|
|
@ -70,27 +70,10 @@ void LauncherWindow::launchGame(const LoginAuth auth) {
|
||||||
void LauncherWindow::launchExecutable(const QStringList args) {
|
void LauncherWindow::launchExecutable(const QStringList args) {
|
||||||
auto process = new QProcess(this);
|
auto process = new QProcess(this);
|
||||||
process->setProcessChannelMode(QProcess::ForwardedChannels);
|
process->setProcessChannelMode(QProcess::ForwardedChannels);
|
||||||
process->setWorkingDirectory(gamePath + "/game/");
|
|
||||||
|
|
||||||
QList<QString> arguments;
|
QList<QString> arguments;
|
||||||
|
|
||||||
// for platforms using wine, set wine before ffxiv_dx11.exe
|
|
||||||
// TODO: make wine path configurable
|
|
||||||
#if defined(Q_OS_MACOS)
|
|
||||||
if(useSystemWine) {
|
|
||||||
arguments.push_back("/usr/local/bin/wine64");
|
|
||||||
} else {
|
|
||||||
arguments.push_back("/Applications/FINAL FANTASY XIV ONLINE.app/Contents/SharedSupport/finalfantasyxiv/FINAL FANTASY XIV ONLINE/wine");
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList env = QProcess::systemEnvironment();
|
QStringList env = QProcess::systemEnvironment();
|
||||||
|
|
||||||
if(enableDXVKhud)
|
|
||||||
env << "DXVK_HUD=full";
|
|
||||||
|
|
||||||
process->setEnvironment(env);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
if(useGamescope) {
|
if(useGamescope) {
|
||||||
arguments.push_back("gamescope");
|
arguments.push_back("gamescope");
|
||||||
|
@ -101,21 +84,25 @@ void LauncherWindow::launchExecutable(const QStringList args) {
|
||||||
if(useGamemode)
|
if(useGamemode)
|
||||||
arguments.push_back("gamemoderun");
|
arguments.push_back("gamemoderun");
|
||||||
|
|
||||||
arguments.push_back("wine");
|
|
||||||
|
|
||||||
QStringList env = QProcess::systemEnvironment();
|
|
||||||
|
|
||||||
if(useEsync) {
|
if(useEsync) {
|
||||||
env << "WINEESYNC=1";
|
env << "WINEESYNC=1";
|
||||||
}
|
}
|
||||||
|
|
||||||
process->setEnvironment(env);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_MACOS) || defined(Q_OS_LINUX)
|
||||||
|
arguments.push_back(winePath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(enableDXVKhud)
|
||||||
|
env << "DXVK_HUD=full";
|
||||||
|
|
||||||
arguments.append(args);
|
arguments.append(args);
|
||||||
|
|
||||||
auto executable = arguments[0];
|
auto executable = arguments[0];
|
||||||
arguments.removeFirst();
|
arguments.removeFirst();
|
||||||
|
|
||||||
|
process->setWorkingDirectory(gamePath + "/game/");
|
||||||
|
process->setEnvironment(env);
|
||||||
process->start(executable, arguments);
|
process->start(executable, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +114,32 @@ QString LauncherWindow::readVersion(QString path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void LauncherWindow::readInitialInformation() {
|
void LauncherWindow::readInitialInformation() {
|
||||||
|
const int wineVersion = settings.value("wineVersion", 0).toInt();
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
switch(wineVersion) {
|
||||||
|
case 0: // system wine
|
||||||
|
winePath = "/usr/local/bin/wine64";
|
||||||
|
break;
|
||||||
|
case 1: // custom path
|
||||||
|
winePath = settings.value("winePath").toString();
|
||||||
|
break;
|
||||||
|
case 2: // ffxiv built-in (for mac users)
|
||||||
|
winePath = "/Applications/FINAL FANTASY XIV ONLINE.app/Contents/SharedSupport/finalfantasyxiv/FINAL FANTASY XIV ONLINE/wine";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_LINUX)
|
||||||
|
switch(wineVersion) {
|
||||||
|
case 0: // system wine (should be in $PATH)
|
||||||
|
winePath = "wine";
|
||||||
|
break;
|
||||||
|
case 1: // custom pth
|
||||||
|
winePath = settings.value("winePath").toString();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(settings.contains("gamePath") && settings.value("gamePath").canConvert<QString>() && !settings.value("gamePath").toString().isEmpty()) {
|
if(settings.contains("gamePath") && settings.value("gamePath").canConvert<QString>() && !settings.value("gamePath").toString().isEmpty()) {
|
||||||
gamePath = settings.value("gamePath").toString();
|
gamePath = settings.value("gamePath").toString();
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,7 +162,6 @@ void LauncherWindow::readInitialInformation() {
|
||||||
useEsync = settings.value("useEsync", false).toBool();
|
useEsync = settings.value("useEsync", false).toBool();
|
||||||
useGamemode = settings.value("useGamemode", false).toBool();
|
useGamemode = settings.value("useGamemode", false).toBool();
|
||||||
useGamescope = settings.value("useGamescope", false).toBool();
|
useGamescope = settings.value("useGamescope", false).toBool();
|
||||||
useSystemWine = settings.value("useSystemWine", false).toBool();
|
|
||||||
enableDXVKhud = settings.value("enableDXVKhud", false).toBool();
|
enableDXVKhud = settings.value("enableDXVKhud", false).toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,8 +294,6 @@ LauncherWindow::LauncherWindow(QWidget* parent) :
|
||||||
|
|
||||||
readInitialInformation();
|
readInitialInformation();
|
||||||
|
|
||||||
launchExecutable({gamePath + "/game/ffxiv_dx11.exe", "DEV.TestSID=xxxx"});
|
|
||||||
|
|
||||||
connect(loginButton, &QPushButton::released, [=] {
|
connect(loginButton, &QPushButton::released, [=] {
|
||||||
auto info = LoginInformation{usernameEdit->text(), passwordEdit->text(), otpEdit->text()};
|
auto info = LoginInformation{usernameEdit->text(), passwordEdit->text(), otpEdit->text()};
|
||||||
|
|
||||||
|
|
|
@ -32,12 +32,11 @@ public:
|
||||||
QNetworkAccessManager* mgr;
|
QNetworkAccessManager* mgr;
|
||||||
|
|
||||||
int language = 1; // 1 is english, thats all i know
|
int language = 1; // 1 is english, thats all i know
|
||||||
QString gamePath;
|
QString gamePath, winePath;
|
||||||
QString bootVersion, gameVersion;
|
QString bootVersion, gameVersion;
|
||||||
|
|
||||||
bool useEsync, useGamescope, useGamemode;
|
bool useEsync, useGamescope, useGamemode;
|
||||||
bool useDX9 = false;
|
bool useDX9 = false;
|
||||||
bool useSystemWine = false;
|
|
||||||
bool enableDXVKhud = false;
|
bool enableDXVKhud = false;
|
||||||
|
|
||||||
void launchGame(const LoginAuth auth);
|
void launchGame(const LoginAuth auth);
|
||||||
|
|
Loading…
Add table
Reference in a new issue