diff options
author | Trial97 <alexandru.tripon97@gmail.com> | 2023-08-15 12:16:00 +0300 |
---|---|---|
committer | Trial97 <alexandru.tripon97@gmail.com> | 2023-08-15 12:16:00 +0300 |
commit | c94ee67077076fdfb3ad04e93a0de2ae32b6a4e5 (patch) | |
tree | 437dec3be224cae5e229eeaa4ac9ebeedffd03e3 /launcher/DesktopServices.cpp | |
parent | 019e5ca3e819f5daf9933bc0fb091784b0ca561f (diff) | |
parent | 8f5bb982cd27dd9158b63d826769c168455a139b (diff) | |
download | PrismLauncher-c94ee67077076fdfb3ad04e93a0de2ae32b6a4e5.tar.gz PrismLauncher-c94ee67077076fdfb3ad04e93a0de2ae32b6a4e5.tar.bz2 PrismLauncher-c94ee67077076fdfb3ad04e93a0de2ae32b6a4e5.zip |
Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into curseforge-url-handle3
Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
Diffstat (limited to 'launcher/DesktopServices.cpp')
-rw-r--r-- | launcher/DesktopServices.cpp | 115 |
1 files changed, 38 insertions, 77 deletions
diff --git a/launcher/DesktopServices.cpp b/launcher/DesktopServices.cpp index 81362f09..004e5e08 100644 --- a/launcher/DesktopServices.cpp +++ b/launcher/DesktopServices.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0-only /* - * PolyMC - Minecraft Launcher + * Prism Launcher - Minecraft Launcher * Copyright (C) 2022 dada513 <dada513@protonmail.com> * * This program is free software: you can redistribute it and/or modify @@ -33,40 +33,37 @@ * limitations under the License. */ #include "DesktopServices.h" -#include <QDir> +#include <QDebug> #include <QDesktopServices> +#include <QDir> #include <QProcess> -#include <QDebug> /** * This shouldn't exist, but until QTBUG-9328 and other unreported bugs are fixed, it needs to be a thing. */ #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) -#include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> +#include <unistd.h> template <typename T> -bool IndirectOpen(T callable, qint64 *pid_forked = nullptr) +bool IndirectOpen(T callable, qint64* pid_forked = nullptr) { auto pid = fork(); - if(pid_forked) - { - if(pid > 0) + if (pid_forked) { + if (pid > 0) *pid_forked = pid; else *pid_forked = 0; } - if(pid == -1) - { + if (pid == -1) { qWarning() << "IndirectOpen failed to fork: " << errno; return false; } // child - do the stuff - if(pid == 0) - { + if (pid == 0) { // unset all this garbage so it doesn't get passed to the child process qunsetenv("LD_PRELOAD"); qunsetenv("LD_LIBRARY_PATH"); @@ -82,19 +79,14 @@ bool IndirectOpen(T callable, qint64 *pid_forked = nullptr) // die. now. do not clean up anything, it would just hang forever. _exit(status ? 0 : 1); - } - else - { - //parent - assume it worked. + } else { + // parent - assume it worked. int status; - while (waitpid(pid, &status, 0)) - { - if(WIFEXITED(status)) - { + while (waitpid(pid, &status, 0)) { + if (WIFEXITED(status)) { return WEXITSTATUS(status) == 0; } - if(WIFSIGNALED(status)) - { + if (WIFSIGNALED(status)) { return false; } } @@ -104,26 +96,19 @@ bool IndirectOpen(T callable, qint64 *pid_forked = nullptr) #endif namespace DesktopServices { -bool openDirectory(const QString &path, bool ensureExists) +bool openDirectory(const QString& path, [[maybe_unused]] bool ensureExists) { qDebug() << "Opening directory" << path; QDir parentPath; QDir dir(path); - if (!dir.exists()) - { + if (ensureExists && !dir.exists()) { parentPath.mkpath(dir.absolutePath()); } - auto f = [&]() - { - return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); - }; + auto f = [&]() { return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!isSandbox()) - { + if (!isSandbox()) { return IndirectOpen(f); - } - else - { + } else { return f(); } #else @@ -131,20 +116,14 @@ bool openDirectory(const QString &path, bool ensureExists) #endif } -bool openFile(const QString &path) +bool openFile(const QString& path) { qDebug() << "Opening file" << path; - auto f = [&]() - { - return QDesktopServices::openUrl(QUrl::fromLocalFile(path)); - }; + auto f = [&]() { return QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!isSandbox()) - { + if (!isSandbox()) { return IndirectOpen(f); - } - else - { + } else { return f(); } #else @@ -152,41 +131,29 @@ bool openFile(const QString &path) #endif } -bool openFile(const QString &application, const QString &path, const QString &workingDirectory, qint64 *pid) +bool openFile(const QString& application, const QString& path, const QString& workingDirectory, qint64* pid) { qDebug() << "Opening file" << path << "using" << application; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave - if(!isSandbox()) - { - return IndirectOpen([&]() - { - return QProcess::startDetached(application, QStringList() << path, workingDirectory); - }, pid); - } - else - { - return QProcess::startDetached(application, QStringList() << path, workingDirectory, pid); + if (!isSandbox()) { + return IndirectOpen([&]() { return QProcess::startDetached(application, QStringList() << path, workingDirectory); }, pid); + } else { + return QProcess::startDetached(application, QStringList() << path, workingDirectory, pid); } #else return QProcess::startDetached(application, QStringList() << path, workingDirectory, pid); #endif } -bool run(const QString &application, const QStringList &args, const QString &workingDirectory, qint64 *pid) +bool run(const QString& application, const QStringList& args, const QString& workingDirectory, qint64* pid) { qDebug() << "Running" << application << "with args" << args.join(' '); #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!isSandbox()) - { - // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave - return IndirectOpen([&]() - { - return QProcess::startDetached(application, args, workingDirectory); - }, pid); - } - else - { + if (!isSandbox()) { + // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave + return IndirectOpen([&]() { return QProcess::startDetached(application, args, workingDirectory); }, pid); + } else { return QProcess::startDetached(application, args, workingDirectory, pid); } #else @@ -194,20 +161,14 @@ bool run(const QString &application, const QStringList &args, const QString &wor #endif } -bool openUrl(const QUrl &url) +bool openUrl(const QUrl& url) { qDebug() << "Opening URL" << url.toString(); - auto f = [&]() - { - return QDesktopServices::openUrl(url); - }; + auto f = [&]() { return QDesktopServices::openUrl(url); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!isSandbox()) - { + if (!isSandbox()) { return IndirectOpen(f); - } - else - { + } else { return f(); } #else @@ -238,4 +199,4 @@ bool isSandbox() return isSnap() || isFlatpak(); } -} +} // namespace DesktopServices |