From 6d460818646ce859097751967fe9589f4e7f26f5 Mon Sep 17 00:00:00 2001 From: flow Date: Wed, 19 Oct 2022 21:15:37 -0300 Subject: [PATCH 01/37] Merge pull request #100 from TheEvilSkeleton/improve-approachability --- ...org.prismlauncher.PrismLauncher.desktop.in | 4 ++-- ...rismlauncher.PrismLauncher.metainfo.xml.in | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/program_info/org.prismlauncher.PrismLauncher.desktop.in b/program_info/org.prismlauncher.PrismLauncher.desktop.in index 63a6b586..e608f588 100644 --- a/program_info/org.prismlauncher.PrismLauncher.desktop.in +++ b/program_info/org.prismlauncher.PrismLauncher.desktop.in @@ -7,6 +7,6 @@ Terminal=false Exec=@Launcher_APP_BINARY_NAME@ StartupNotify=true Icon=org.prismlauncher.PrismLauncher -Categories=Game; -Keywords=game;minecraft;launcher;mc; +Categories=Game;ActionGame;AdventureGame;Simulation; +Keywords=game;minecraft;launcher;mc;multimc;polymc; StartupWMClass=PrismLauncher diff --git a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in index 2e10f7be..55965eb7 100644 --- a/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in +++ b/program_info/org.prismlauncher.PrismLauncher.metainfo.xml.in @@ -1,33 +1,35 @@ org.prismlauncher.PrismLauncher - - org.prismlauncher.PrismLauncher - org.prismlauncher.PrismLauncher.desktop - PrismLauncher - PrismLauncher + Prism Launcher + Prism Launcher Contributors A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once CC0-1.0 GPL-3.0-only https://prismlauncher.org/ https://prismlauncher.org/wiki/ + https://github.com/PrismLauncher/PrismLauncher/issues + https://discord.gg/prismlauncher + https://github.com/PrismLauncher/PrismLauncher + https://github.com/PrismLauncher/PrismLauncher/blob/develop/CONTRIBUTING.md + https://hosted.weblate.org/projects/prismlauncher/launcher -

PrismLauncher is a custom launcher for Minecraft that focuses on predictability, long term stability and simplicity.

+

Prism Launcher is a custom launcher for Minecraft that focuses on predictability, long term stability and simplicity.

Features:

  • Easily install game modifications, such as Fabric, Forge and Quilt
  • -
  • Control your java settings
  • +
  • Control your Java settings
  • Manage worlds and resource packs from the launcher
  • See logs and other details easily
  • Kill Minecraft in case of a crash/freeze
  • -
  • Isolate minecraft instances to keep everything clean
  • +
  • Isolate Minecraft instances to keep everything clean
  • Install and update mods directly from the launcher
- The main PrismLauncher window + The main Prism Launcher window https://prismlauncher.org/img/screenshots/LauncherDark.png From 93b8d9e4543bdb588205874f060a43e594e4f388 Mon Sep 17 00:00:00 2001 From: flow Date: Wed, 19 Oct 2022 22:00:23 -0300 Subject: [PATCH 02/37] Merge pull request #123 from MMK21Hub/patch-1 --- .github/workflows/trigger_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml index 476280df..e74e870a 100644 --- a/.github/workflows/trigger_release.yml +++ b/.github/workflows/trigger_release.yml @@ -65,7 +65,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ github.ref }} - name: PrismLauncher ${{ env.VERSION }} + name: Prism Launcher ${{ env.VERSION }} draft: true prerelease: false files: | From 6e94e9bff19ea178df7f30c4c7ac32983154a641 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 20 Oct 2022 09:44:25 +0200 Subject: [PATCH 03/37] Merge pull request #148 from ZombieNub/prismlauncher-rename --- CMakeLists.txt | 2 +- program_info/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a3b74a73..131d3e53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ endif() ##################################### Set Application options ##################################### ######## Set URLs ######## -set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch PrismLauncher's news RSS feed from.") +set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") diff --git a/program_info/README.md b/program_info/README.md index 8fc81a19..5ba2fa32 100644 --- a/program_info/README.md +++ b/program_info/README.md @@ -1,6 +1,6 @@ -# PrismLauncher Program Info +# Prism Launcher Program Info -This is PrismLauncher's program info which contains information about: +This is Prism Launcher's program info which contains information about: - Application name and logo (and branding in general) - Various URLs and API endpoints From de3c33621318d64585ff55155f476fc1976d1c44 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 20 Oct 2022 21:52:24 +0200 Subject: [PATCH 04/37] Merge pull request #184 from Chrono-byte/develop --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- program_info/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index 2970d47d..cecda1df 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -172,7 +172,7 @@ AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AboutDia QString urlText("

%1

"); ui->urlLabel->setText(urlText.arg(BuildConfig.LAUNCHER_GIT)); - QString copyText("© 2021-2022 %1"); + QString copyText("© 2022 %1"); ui->copyLabel->setText(copyText.arg(BuildConfig.LAUNCHER_COPYRIGHT)); connect(ui->closeButton, SIGNAL(clicked()), SLOT(close())); diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 62a01231..f6e2ea84 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -14,7 +14,7 @@ set(Launcher_DisplayName "Prism Launcher") set(Launcher_Name "${Launcher_CommonName}" PARENT_SCOPE) set(Launcher_DisplayName "${Launcher_DisplayName}" PARENT_SCOPE) -set(Launcher_Copyright "Prism Launcher Contributors\\n© 2012-2021 MultiMC Contributors") +set(Launcher_Copyright "Prism Launcher Contributors\\n© 2021-2022 PolyMC Contributors \\n© 2012-2021 MultiMC Contributors") set(Launcher_Copyright "${Launcher_Copyright}" PARENT_SCOPE) set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) From ddd319369afb9a8c7ebe46394cca2d9529daf46e Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 21 Oct 2022 15:25:28 +0200 Subject: [PATCH 05/37] Merge pull request #39 from Sebbl0508/mod_dialog_fontsize --- launcher/ui/widgets/ProjectItem.cpp | 39 +++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/launcher/ui/widgets/ProjectItem.cpp b/launcher/ui/widgets/ProjectItem.cpp index 01be88d9..d1ff9dbc 100644 --- a/launcher/ui/widgets/ProjectItem.cpp +++ b/launcher/ui/widgets/ProjectItem.cpp @@ -51,6 +51,8 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o auto remaining_width = rect.width() - icon_width - 2 * icon_x_margin; rect.setRect(rect.x() + icon_width + 2 * icon_x_margin, rect.y(), remaining_width, rect.height()); + int title_height = 0; + { // Title painting auto title = index.data(UserDataTypes::TITLE).toString(); @@ -66,8 +68,10 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o font.setPointSize(font.pointSize() + 2); painter->setFont(font); + title_height = QFontMetrics(font).height(); + // On the top, aligned to the left after the icon - painter->drawText(rect.x(), rect.y() + QFontMetrics(font).height(), title); + painter->drawText(rect.x(), rect.y() + title_height, title); painter->restore(); } @@ -82,17 +86,38 @@ void ProjectItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o // Get first line unconditionally description = cut_text.first().second; + auto num_lines = 1; + // Get second line, elided if needed if (cut_text.size() > 1) { - if (cut_text.size() > 2) - description += opt.fontMetrics.elidedText(cut_text.at(1).second, opt.textElideMode, cut_text.at(1).first); - else - description += cut_text.at(1).second; + // 2.5x so because there should be some margin left from the 2x so things don't get too squishy. + if (rect.height() - title_height <= 2.5 * opt.fontMetrics.height()) { + // If there's not enough space, show only a single line, elided. + description = opt.fontMetrics.elidedText(description, opt.textElideMode, cut_text.at(0).first); + } else { + if (cut_text.size() > 2) { + description += opt.fontMetrics.elidedText(cut_text.at(1).second, opt.textElideMode, cut_text.at(1).first); + } else { + description += cut_text.at(1).second; + } + num_lines += 1; + } } + int description_x = rect.x(); + + + // Have the y-value be set based on the number of lines in the description, to centralize the + // description text with the space between the base and the title. + int description_y = rect.y() + title_height + (rect.height() - title_height) / 2; + if (num_lines == 1) + description_y -= opt.fontMetrics.height() / 2; + else + description_y -= opt.fontMetrics.height(); + // On the bottom, aligned to the left after the icon, and featuring at most two lines of text (with some margin space to spare) - painter->drawText(rect.x(), rect.y() + rect.height() - 2.2 * opt.fontMetrics.height(), remaining_width, - 2 * opt.fontMetrics.height(), Qt::TextWordWrap, description); + painter->drawText(description_x, description_y, remaining_width, + cut_text.size() * opt.fontMetrics.height(), Qt::TextWordWrap, description); } painter->restore(); From c984e9b5d6baa15708df3b3c12c45a78b69580d1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 21 Oct 2022 17:37:09 +0200 Subject: [PATCH 06/37] Merge pull request #202 from Heath123/patch-1 --- launcher/ui/pages/global/LauncherPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index 1e5df5b2..b8431e8c 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -147,7 +147,7 @@ void LauncherPage::on_instDirBrowseBtn_clicked() { QMessageBox warning; warning.setText(tr("You're trying to specify an instance folder " - "which was granted temporaily via Flatpak.\n" + "which was granted temporarily via Flatpak.\n" "This is known to cause problems. " "After a restart the launcher might break, " "because it will no longer have access to that directory.\n\n" From 58bd449db8fa2df8ab7c76b6af3aa8e1a4bc1ae2 Mon Sep 17 00:00:00 2001 From: txtsd Date: Fri, 21 Oct 2022 22:12:48 +0530 Subject: [PATCH 07/37] Merge pull request #197 from PrismLauncher/renovate/actions-cache-3.x --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 04c34754..b30388d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -126,7 +126,7 @@ jobs: - name: Retrieve ccache cache (Windows) if: runner.os == 'Windows' && inputs.build_type == 'Debug' - uses: actions/cache@v3.0.2 + uses: actions/cache@v3.0.11 with: path: '${{ github.workspace }}\.ccache' key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} From 04e8982d3348ef535ae30a1218da9766b98cc699 Mon Sep 17 00:00:00 2001 From: txtsd Date: Fri, 21 Oct 2022 22:13:09 +0530 Subject: [PATCH 08/37] Merge pull request #198 from PrismLauncher/renovate/hendrikmuhs-ccache-action-1.x --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b30388d7..b6400791 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -104,7 +104,7 @@ jobs: - name: Setup ccache if: runner.os != 'Windows' && inputs.build_type == 'Debug' - uses: hendrikmuhs/ccache-action@v1.2.1 + uses: hendrikmuhs/ccache-action@v1.2.3 with: key: ${{ matrix.os }}-qt${{ matrix.qt_ver }} From 25b0ec6eff2364c1c0704c749951730033fc162d Mon Sep 17 00:00:00 2001 From: flow Date: Fri, 21 Oct 2022 19:04:35 -0300 Subject: [PATCH 09/37] Merge pull request #147 from Minion3665/enhancement/update-nix-derivation --- nix/NIX.md | 65 ++++++++++++++++++++++++++++++++++++++++++------- nix/default.nix | 12 ++++----- 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/nix/NIX.md b/nix/NIX.md index e57d5be7..980d20e8 100644 --- a/nix/NIX.md +++ b/nix/NIX.md @@ -1,21 +1,59 @@ -# How to import +# Running on Nix -To import with flakes use +## Putting it in your system configuration + +### On flakes-enabled nix + +#### Directly installing + +The `prismlauncher` flake provides a package which you can install along with +the rest of your packages ```nix +# In your flake.nix: { inputs = { prismlauncher.url = "github:PrismLauncher/PrismLauncher"; }; - -... - - nixpkgs.overlays = [ inputs.prismlauncher.overlay ]; ## Within configuration.nix - environment.systemPackages = with pkgs; [ prismlauncher ]; ## } ``` -To import without flakes use channels: +```nix +# And in your system configuration: +environment.systemPackages = [ prismlauncher.packages.${pkgs.system}.prismlauncher ]; + +# Or in your home-manager configuration: +home.packages = [ prismlauncher.packages.${pkgs.system}.prismlauncher ]; +``` + +#### Using the overlay + +Alternatively, you can overlay the prismlauncher version in nixpkgs which will +allow you to install using `pkgs` as you normally would while also using the +latest version + +```nix +# In your flake.nix: +{ + inputs = { + prismlauncher.url = "github:PrismLauncher/PrismLauncher"; + }; +} +``` + +```nix +# And in your system configuration: +nixpkgs.overlays = [ inputs.prismlauncher.overlay ]; +environment.systemPackages = [ pkgs.prismlauncher ]; + +# Or in your home-manager configuration: +config.nixpkgs.overlays = [ inputs.prismlauncher.overlay ]; +home.packages = [ pkgs.prismlauncher ]; +``` + +### Without flakes-enabled nix + +#### Using channels ```sh nix-channel --add https://github.com/PrismLauncher/PrismLauncher/archive/master.tar.gz prismlauncher @@ -23,9 +61,10 @@ nix-channel --update prismlauncher nix-env -iA prismlauncher ``` -or alternatively you can use +#### Using the overlay ```nix +# In your configuration.nix: { nixpkgs.overlays = [ (import (builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz")).overlay @@ -34,3 +73,11 @@ or alternatively you can use environment.systemPackages = with pkgs; [ prismlauncher ]; } ``` + +## Running ad-hoc + +If you're on a flakes-enabled nix you can run the launcher in one-line + +```sh +nix run github:PrismLauncher/PrismLauncher +``` diff --git a/nix/default.nix b/nix/default.nix index c8b4f7cc..c7fc7576 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -59,20 +59,20 @@ stdenv.mkDerivation rec { # Copy libnbtplusplus rm -rf source/libraries/libnbtplusplus mkdir source/libraries/libnbtplusplus - cp -a ${libnbtplusplus}/* source/libraries/libnbtplusplus - chmod a+r+w source/libraries/libnbtplusplus/* + ln -s ${libnbtplusplus}/* source/libraries/libnbtplusplus + chmod -R +r+w source/libraries/libnbtplusplus # Copy tomlplusplus rm -rf source/libraries/tomlplusplus mkdir source/libraries/tomlplusplus - cp -a ${tomlplusplus}/* source/libraries/tomlplusplus - chmod a+r+w source/libraries/tomlplusplus/* + ln -s ${tomlplusplus}/* source/libraries/tomlplusplus + chmod -R +r+w source/libraries/tomlplusplus ''; cmakeFlags = [ "-GNinja" "-DLauncher_QT_VERSION_MAJOR=${lib.versions.major qtbase.version}" ] ++ lib.optionals enableLTO [ "-DENABLE_LTO=on" ] - ++ lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ]; + ++ lib.optionals (msaClientID != "") [ "-DLauncher_MSA_CLIENT_ID=${msaClientID}" ]; # we have to check if the system is NixOS before adding stdenv.cc.cc.lib (#923) postInstall = '' @@ -96,6 +96,6 @@ stdenv.mkDerivation rec { ''; platforms = platforms.unix; license = licenses.gpl3Only; - maintainers = with maintainers; [ starcraft66 kloenk ]; + maintainers = with maintainers; [ minion3665 Scrumplex ]; }; } From a74fdc588cce0f7b41c4910c3777636deaf7dbfc Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 12:44:20 +0200 Subject: [PATCH 10/37] Merge pull request #185 from flowln/fix_blocked_mods_crash --- launcher/modplatform/flame/FileResolvingTask.cpp | 6 +++++- launcher/ui/dialogs/ProgressDialog.cpp | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 1e7f5559..0b2431f7 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -66,7 +66,11 @@ void Flame::FileResolvingTask::netJobFinished() } index++; } - connect(job, &NetJob::finished, this, &Flame::FileResolvingTask::modrinthCheckFinished); + connect(job, &NetJob::finished, this, + [this, &job] { + modrinthCheckFinished(); + job->deleteLater(); + }); job->start(); } diff --git a/launcher/ui/dialogs/ProgressDialog.cpp b/launcher/ui/dialogs/ProgressDialog.cpp index 68dd4d17..05269f62 100644 --- a/launcher/ui/dialogs/ProgressDialog.cpp +++ b/launcher/ui/dialogs/ProgressDialog.cpp @@ -136,11 +136,13 @@ void ProgressDialog::onTaskStarted() {} void ProgressDialog::onTaskFailed(QString failure) { reject(); + hide(); } void ProgressDialog::onTaskSucceeded() { accept(); + hide(); } void ProgressDialog::changeStatus(const QString& status) From d40a18d6c5b440b494fe610178c863a3d42e8992 Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 22 Oct 2022 10:18:58 -0300 Subject: [PATCH 11/37] Merge pull request #218 from getchoo/change-jars-path --- CMakeLists.txt | 2 +- buildconfig/BuildConfig.cpp.in | 1 + buildconfig/BuildConfig.h | 1 + launcher/Application.cpp | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 131d3e53..97bad31b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -249,7 +249,7 @@ if(UNIX AND APPLE) elseif(UNIX) set(BINARY_DEST_DIR "bin") set(LIBRARY_DEST_DIR "lib${LIB_SUFFIX}") - set(JARS_DEST_DIR "share/jars") + set(JARS_DEST_DIR "share/${Launcher_APP_BINARY_NAME}") set(LAUNCHER_DESKTOP_DEST_DIR "share/applications" CACHE STRING "Path to the desktop file directory") set(LAUNCHER_METAINFO_DEST_DIR "share/metainfo" CACHE STRING "Path to the metainfo directory") set(LAUNCHER_ICON_DEST_DIR "share/icons/hicolor/scalable/apps" CACHE STRING "Path to the scalable icon directory") diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index 50e5e8a4..b8fa5133 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -42,6 +42,7 @@ Config::Config() { // Name and copyright LAUNCHER_NAME = "@Launcher_Name@"; + LAUNCHER_APP_BINARY_NAME = "@Launcher_APP_BINARY_NAME@"; LAUNCHER_DISPLAYNAME = "@Launcher_DisplayName@"; LAUNCHER_COPYRIGHT = "@Launcher_Copyright@"; LAUNCHER_DOMAIN = "@Launcher_Domain@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index ef384ed2..13ccdaa1 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -44,6 +44,7 @@ class Config { public: Config(); QString LAUNCHER_NAME; + QString LAUNCHER_APP_BINARY_NAME; QString LAUNCHER_DISPLAYNAME; QString LAUNCHER_COPYRIGHT; QString LAUNCHER_DOMAIN; diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 6ffec1ae..97f757f7 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1571,7 +1571,7 @@ QString Application::getJarPath(QString jarFile) { QStringList potentialPaths = { #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) - FS::PathCombine(m_rootPath, "share/jars"), + FS::PathCombine(m_rootPath, "share/" + BuildConfig.LAUNCHER_APP_BINARY_NAME), #endif FS::PathCombine(m_rootPath, "jars"), FS::PathCombine(applicationDirPath(), "jars") From 75abf2c124908af093cb4cf629407b04b38c70a8 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 15:31:46 +0200 Subject: [PATCH 12/37] Merge pull request #225 from Scrumplex/fix-segfault-fileresolver --- launcher/modplatform/flame/FileResolvingTask.cpp | 14 ++++++-------- launcher/modplatform/flame/FileResolvingTask.h | 3 ++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index 0b2431f7..c50abb8f 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -12,6 +12,8 @@ bool Flame::FileResolvingTask::abort() bool aborted = true; if (m_dljob) aborted &= m_dljob->abort(); + if (m_checkJob) + aborted &= m_checkJob->abort(); return aborted ? Task::abort() : false; } @@ -40,7 +42,7 @@ void Flame::FileResolvingTask::netJobFinished() setProgress(1, 3); int index = 0; // job to check modrinth for blocked projects - auto job = new NetJob("Modrinth check", m_network); + m_checkJob = new NetJob("Modrinth check", m_network); blockedProjects = QMap(); auto doc = Json::requireDocument(*result); auto array = Json::requireArray(doc.object()["data"]); @@ -60,19 +62,15 @@ void Flame::FileResolvingTask::netJobFinished() out.resolved = true; }); - job->addNetAction(dl); + m_checkJob->addNetAction(dl); blockedProjects.insert(&out, output); } } index++; } - connect(job, &NetJob::finished, this, - [this, &job] { - modrinthCheckFinished(); - job->deleteLater(); - }); + connect(m_checkJob.get(), &NetJob::finished, this, &Flame::FileResolvingTask::modrinthCheckFinished); - job->start(); + m_checkJob->start(); } void Flame::FileResolvingTask::modrinthCheckFinished() { diff --git a/launcher/modplatform/flame/FileResolvingTask.h b/launcher/modplatform/flame/FileResolvingTask.h index f71b87ce..8fc17ea9 100644 --- a/launcher/modplatform/flame/FileResolvingTask.h +++ b/launcher/modplatform/flame/FileResolvingTask.h @@ -30,8 +30,9 @@ protected slots: private: /* data */ shared_qobject_ptr m_network; Flame::Manifest m_toProcess; - std::shared_ptr result; + std::shared_ptr result; NetJob::Ptr m_dljob; + NetJob::Ptr m_checkJob; void modrinthCheckFinished(); From 2eb81739511d4cff2e753b7e2d807f06f54e6f73 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 22 Oct 2022 15:31:53 +0200 Subject: [PATCH 13/37] Merge pull request #224 from jamierocks/atl-abort-close-optional-mods-dialog --- launcher/modplatform/atlauncher/ATLPackInstallTask.cpp | 7 ++++++- launcher/modplatform/atlauncher/ATLPackInstallTask.h | 2 +- .../atlauncher/AtlUserInteractionSupportImpl.cpp | 7 +++++-- .../modplatform/atlauncher/AtlUserInteractionSupportImpl.h | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp index a553eafd..68d75943 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.cpp @@ -736,7 +736,12 @@ void PackInstallTask::downloadMods() QVector selectedMods; if (!optionalMods.isEmpty()) { setStatus(tr("Selecting optional mods...")); - selectedMods = m_support->chooseOptionalMods(m_version, optionalMods); + auto mods = m_support->chooseOptionalMods(m_version, optionalMods); + if (!mods.has_value()) { + emitAborted(); + return; + } + selectedMods = mods.value(); } setStatus(tr("Downloading mods...")); diff --git a/launcher/modplatform/atlauncher/ATLPackInstallTask.h b/launcher/modplatform/atlauncher/ATLPackInstallTask.h index ed4436f0..78cd87fb 100644 --- a/launcher/modplatform/atlauncher/ATLPackInstallTask.h +++ b/launcher/modplatform/atlauncher/ATLPackInstallTask.h @@ -62,7 +62,7 @@ public: /** * Requests a user interaction to select which optional mods should be installed. */ - virtual QVector chooseOptionalMods(PackVersion version, QVector mods) = 0; + virtual std::optional> chooseOptionalMods(PackVersion version, QVector mods) = 0; /** * Requests a user interaction to select a component version from a given version list diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp index 03196685..c68e40ba 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp @@ -43,10 +43,13 @@ AtlUserInteractionSupportImpl::AtlUserInteractionSupportImpl(QWidget *parent) : { } -QVector AtlUserInteractionSupportImpl::chooseOptionalMods(ATLauncher::PackVersion version, QVector mods) +std::optional> AtlUserInteractionSupportImpl::chooseOptionalMods(ATLauncher::PackVersion version, QVector mods) { AtlOptionalModDialog optionalModDialog(m_parent, version, mods); - optionalModDialog.exec(); + auto result = optionalModDialog.exec(); + if (result == QDialog::Rejected) { + return {}; + } return optionalModDialog.getResult(); } diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h index aa22fc73..3b37c9be 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h +++ b/launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h @@ -47,7 +47,7 @@ public: private: QString chooseVersion(Meta::VersionListPtr vlist, QString minecraftVersion) override; - QVector chooseOptionalMods(ATLauncher::PackVersion version, QVector mods) override; + std::optional> chooseOptionalMods(ATLauncher::PackVersion version, QVector mods) override; void displayMessage(QString message) override; private: From cac800bfd8dfb049b3ee50f57208a3985eb86acc Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 22 Oct 2022 12:19:58 -0300 Subject: [PATCH 14/37] Merge pull request #233 from jamierocks/atl-fix-aborting-installs --- .../ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp index 004fdc57..9138dcbb 100644 --- a/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp +++ b/launcher/ui/pages/modplatform/atlauncher/AtlOptionalModDialog.cpp @@ -331,7 +331,7 @@ AtlOptionalModDialog::AtlOptionalModDialog(QWidget* parent, ATLauncher::PackVers connect(ui->clearAllButton, &QPushButton::clicked, listModel, &AtlOptionalModListModel::clearAll); connect(ui->installButton, &QPushButton::clicked, - this, &QDialog::close); + this, &QDialog::accept); } AtlOptionalModDialog::~AtlOptionalModDialog() { From c08b632b518b35f8ac3150799a149c7fa090616e Mon Sep 17 00:00:00 2001 From: flow Date: Sat, 22 Oct 2022 13:14:26 -0300 Subject: [PATCH 15/37] Merge pull request #234 from AliceDTRH/fix/dedupejava --- launcher/java/JavaUtils.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/launcher/java/JavaUtils.cpp b/launcher/java/JavaUtils.cpp index 040fe821..6c0c60cd 100644 --- a/launcher/java/JavaUtils.cpp +++ b/launcher/java/JavaUtils.cpp @@ -379,7 +379,9 @@ QList JavaUtils::FindJavaPaths() } } - return addJavasFromEnv(candidates); + candidates = addJavasFromEnv(candidates); + candidates.removeDuplicates(); + return candidates; } #elif defined(Q_OS_MAC) @@ -402,7 +404,9 @@ QList JavaUtils::FindJavaPaths() javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Home/bin/java"); javas.append(systemLibraryJVMDir.absolutePath() + "/" + java + "/Contents/Commands/java"); } - return addJavasFromEnv(javas); + javas = addJavasFromEnv(javas); + javas.removeDuplicates(); + return javas; } #elif defined(Q_OS_LINUX) @@ -448,7 +452,9 @@ QList JavaUtils::FindJavaPaths() scanJavaDir("/opt/jdks"); // flatpak scanJavaDir("/app/jdk"); - return addJavasFromEnv(javas); + javas = addJavasFromEnv(javas); + javas.removeDuplicates(); + return javas; } #else QList JavaUtils::FindJavaPaths() From 35e792c5de3ad0144bbe8353998bdcf0bc62fcc4 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sun, 23 Oct 2022 02:07:29 +0200 Subject: [PATCH 16/37] Merge pull request #240 from jn64/fix/version-label-width --- launcher/ui/dialogs/AboutDialog.ui | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/launcher/ui/dialogs/AboutDialog.ui b/launcher/ui/dialogs/AboutDialog.ui index e0429321..4a9eef08 100644 --- a/launcher/ui/dialogs/AboutDialog.ui +++ b/launcher/ui/dialogs/AboutDialog.ui @@ -87,14 +87,11 @@ - + IBeamCursor - - Qt::AlignCenter - Qt::TextSelectableByMouse @@ -167,7 +164,7 @@ - + IBeamCursor @@ -183,7 +180,7 @@ - + IBeamCursor @@ -199,7 +196,7 @@ - + IBeamCursor @@ -215,7 +212,7 @@ - + IBeamCursor From fcef6321fcbaac0303e57cf14de975bf11ebad70 Mon Sep 17 00:00:00 2001 From: flow Date: Sun, 23 Oct 2022 14:28:33 -0300 Subject: [PATCH 17/37] Merge pull request #228 from bensuperpc/change_cast --- launcher/GZip.cpp | 4 ++-- launcher/HoeDown.h | 2 +- launcher/tasks/Task.cpp | 2 +- libraries/LocalPeer/src/LocalPeer.cpp | 2 +- libraries/katabasis/src/DeviceFlow.cpp | 2 +- libraries/murmur2/src/MurmurHash2.cpp | 6 +++--- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/launcher/GZip.cpp b/launcher/GZip.cpp index 067104cf..e36dc8a4 100644 --- a/launcher/GZip.cpp +++ b/launcher/GZip.cpp @@ -72,7 +72,7 @@ bool GZip::unzip(const QByteArray &compressedBytes, QByteArray &uncompressedByte uncompLength *= 2; } - strm.next_out = (Bytef *)(uncompressedBytes.data() + strm.total_out); + strm.next_out = reinterpret_cast((uncompressedBytes.data() + strm.total_out)); strm.avail_out = uncompLength - strm.total_out; // Inflate another chunk. @@ -129,7 +129,7 @@ bool GZip::zip(const QByteArray &uncompressedBytes, QByteArray &compressedBytes) { compressedBytes.resize(compressedBytes.size() * 2); } - zs.next_out = (Bytef *) (compressedBytes.data() + offset); + zs.next_out = reinterpret_cast((compressedBytes.data() + offset)); temp = zs.avail_out = compressedBytes.size() - offset; ret = deflate(&zs, Z_FINISH); offset += temp - zs.avail_out; diff --git a/launcher/HoeDown.h b/launcher/HoeDown.h index b9e06ffb..cb62de6c 100644 --- a/launcher/HoeDown.h +++ b/launcher/HoeDown.h @@ -42,7 +42,7 @@ public: } void put(QByteArray input) { - hoedown_buffer_put(buf, (uint8_t *) input.data(), input.size()); + hoedown_buffer_put(buf, reinterpret_cast(input.data()), input.size()); } const uint8_t * data() const { diff --git a/launcher/tasks/Task.cpp b/launcher/tasks/Task.cpp index b4babdd4..9ea1bb26 100644 --- a/launcher/tasks/Task.cpp +++ b/launcher/tasks/Task.cpp @@ -153,7 +153,7 @@ QString Task::describe() auto name = objectName(); if(name.isEmpty()) { - out << QString("0x%1").arg((quintptr)this, 0, 16); + out << QString("0x%1").arg(reinterpret_cast(this), 0, 16); } else { diff --git a/libraries/LocalPeer/src/LocalPeer.cpp b/libraries/LocalPeer/src/LocalPeer.cpp index 3c3d8b4c..b7149c40 100644 --- a/libraries/LocalPeer/src/LocalPeer.cpp +++ b/libraries/LocalPeer/src/LocalPeer.cpp @@ -210,7 +210,7 @@ void LocalPeer::receiveConnection() return; } - while (socket->bytesAvailable() < (int)sizeof(quint32)) + while (socket->bytesAvailable() < static_cast(sizeof(quint32))) { socket->waitForReadyRead(); } diff --git a/libraries/katabasis/src/DeviceFlow.cpp b/libraries/katabasis/src/DeviceFlow.cpp index ba1d121d..f78fd620 100644 --- a/libraries/katabasis/src/DeviceFlow.cpp +++ b/libraries/katabasis/src/DeviceFlow.cpp @@ -445,7 +445,7 @@ void DeviceFlow::onRefreshError(QNetworkReply::NetworkError error, QNetworkReply if(refreshReply) { refreshReply->deleteLater(); } - qDebug() << "DeviceFlow::onRefreshFinished: Error" << (int)error << " - " << errorString; + qDebug() << "DeviceFlow::onRefreshFinished: Error" << static_cast(error) << " - " << errorString; } } diff --git a/libraries/murmur2/src/MurmurHash2.cpp b/libraries/murmur2/src/MurmurHash2.cpp index b625efb1..c13608f0 100644 --- a/libraries/murmur2/src/MurmurHash2.cpp +++ b/libraries/murmur2/src/MurmurHash2.cpp @@ -55,12 +55,12 @@ uint32_t MurmurHash2(std::ifstream&& file_stream, std::size_t buffer_size, std:: // Mix 4 bytes at a time into the hash if (index == 0) - FourBytes_MurmurHash2((unsigned char*)&data, info); + FourBytes_MurmurHash2(reinterpret_cast(&data), info); } } while (!file_stream.eof()); // Do one last bit shuffle in the hash - FourBytes_MurmurHash2((unsigned char*)&data, info); + FourBytes_MurmurHash2(reinterpret_cast(&data), info); delete[] buffer; @@ -72,7 +72,7 @@ void FourBytes_MurmurHash2(const unsigned char* data, IncrementalHashInfo& prev) { if (prev.len >= 4) { // Not the final mix - uint32_t k = *(uint32_t*)data; + uint32_t k = *reinterpret_cast(data); k *= m; k ^= k >> r; From e28480a8e49532184e2f93df98626cb943af33e5 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 24 Oct 2022 11:13:42 +0200 Subject: [PATCH 18/37] Merge pull request #274 from Protrikk/patch-1 --- launcher/ui/themes/DarkTheme.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/themes/DarkTheme.cpp b/launcher/ui/themes/DarkTheme.cpp index 07a2efd2..48231b53 100644 --- a/launcher/ui/themes/DarkTheme.cpp +++ b/launcher/ui/themes/DarkTheme.cpp @@ -31,7 +31,7 @@ QPalette DarkTheme::colorScheme() darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(47,163,198)); - darkPalette.setColor(QPalette::Highlight, QColor(145,205,92)); + darkPalette.setColor(QPalette::Highlight, QColor(150,219,89)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); darkPalette.setColor(QPalette::PlaceholderText, Qt::darkGray); return fadeInactive(darkPalette, fadeAmount(), fadeColor()); From 2f5393b9d05da98a098be5bfb215b0fb68c3fb77 Mon Sep 17 00:00:00 2001 From: flow Date: Mon, 24 Oct 2022 11:09:23 -0300 Subject: [PATCH 19/37] Merge pull request #281 from Scrumplex/fix-nsis-displayname --- program_info/win_install.nsi.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/program_info/win_install.nsi.in b/program_info/win_install.nsi.in index 1c1f29da..0cd7ea11 100644 --- a/program_info/win_install.nsi.in +++ b/program_info/win_install.nsi.in @@ -4,7 +4,7 @@ Unicode true -Name "@Launcher_CommonName@" +Name "@Launcher_DisplayName@" InstallDir "$LOCALAPPDATA\Programs\@Launcher_CommonName@" InstallDirRegKey HKCU "Software\@Launcher_CommonName@" "InstallDir" RequestExecutionLevel user @@ -113,7 +113,7 @@ VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "@Launcher_VERSION_NAME4@ ;-------------------------------- ; The stuff to install -Section "@Launcher_CommonName@" +Section "@Launcher_DisplayName@" SectionIn RO From 0eaff2214545b168f657baa6e42aaaaa664956a1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 24 Oct 2022 23:00:02 +0200 Subject: [PATCH 20/37] Merge pull request #283 from flowln/fix_abort_on_autosearch --- .../modplatform/helpers/NetworkModAPI.cpp | 1 + launcher/ui/pages/modplatform/ModModel.cpp | 25 ++++++++++++------- launcher/ui/pages/modplatform/ModModel.h | 1 + 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/launcher/modplatform/helpers/NetworkModAPI.cpp b/launcher/modplatform/helpers/NetworkModAPI.cpp index 866e7540..7633030e 100644 --- a/launcher/modplatform/helpers/NetworkModAPI.cpp +++ b/launcher/modplatform/helpers/NetworkModAPI.cpp @@ -15,6 +15,7 @@ void NetworkModAPI::searchMods(CallerType* caller, SearchArgs&& args) const QObject::connect(netJob, &NetJob::started, caller, [caller, netJob] { caller->setActiveJob(netJob); }); QObject::connect(netJob, &NetJob::failed, caller, &CallerType::searchRequestFailed); + QObject::connect(netJob, &NetJob::aborted, caller, &CallerType::searchRequestAborted); QObject::connect(netJob, &NetJob::succeeded, caller, [caller, response] { QJsonParseError parse_error{}; QJsonDocument doc = QJsonDocument::fromJson(*response, &parse_error); diff --git a/launcher/ui/pages/modplatform/ModModel.cpp b/launcher/ui/pages/modplatform/ModModel.cpp index 49766fa6..ed58eb32 100644 --- a/launcher/ui/pages/modplatform/ModModel.cpp +++ b/launcher/ui/pages/modplatform/ModModel.cpp @@ -267,18 +267,25 @@ void ListModel::searchRequestFailed(QString reason) .arg(m_parent->displayName()) .arg(tr("API version too old!\nPlease update %1!").arg(BuildConfig.LAUNCHER_DISPLAYNAME))); } + + jobPtr.reset(); + searchState = Finished; +} + +void ListModel::searchRequestAborted() +{ + if (searchState != ResetRequested) + qCritical() << "Search task in ModModel aborted by an unknown reason!"; + + // Retry fetching jobPtr.reset(); - if (searchState == ResetRequested) { - beginResetModel(); - modpacks.clear(); - endResetModel(); + beginResetModel(); + modpacks.clear(); + endResetModel(); - nextSearchOffset = 0; - performPaginatedSearch(); - } else { - searchState = Finished; - } + nextSearchOffset = 0; + performPaginatedSearch(); } void ListModel::infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index) diff --git a/launcher/ui/pages/modplatform/ModModel.h b/launcher/ui/pages/modplatform/ModModel.h index a58c7c55..d2636d87 100644 --- a/launcher/ui/pages/modplatform/ModModel.h +++ b/launcher/ui/pages/modplatform/ModModel.h @@ -51,6 +51,7 @@ class ListModel : public QAbstractListModel { public slots: void searchRequestFinished(QJsonDocument& doc); void searchRequestFailed(QString reason); + void searchRequestAborted(); void infoRequestFinished(QJsonDocument& doc, ModPlatform::IndexedPack& pack, const QModelIndex& index); From 2652f3745338cf7401e282e886f9af7897442678 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Tue, 25 Oct 2022 11:29:14 +0200 Subject: [PATCH 21/37] Merge pull request #206 from flowln/changelog_height_fix --- launcher/ui/dialogs/ModUpdateDialog.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/launcher/ui/dialogs/ModUpdateDialog.cpp b/launcher/ui/dialogs/ModUpdateDialog.cpp index 4171586e..cedd4a96 100644 --- a/launcher/ui/dialogs/ModUpdateDialog.cpp +++ b/launcher/ui/dialogs/ModUpdateDialog.cpp @@ -366,33 +366,28 @@ void ModUpdateDialog::appendMod(CheckUpdateTask::UpdatableMod const& info) auto changelog = new QTreeWidgetItem(changelog_item); auto changelog_area = new QTextBrowser(); + QString text = info.changelog; switch (info.provider) { case ModPlatform::Provider::MODRINTH: { HoeDown h; // HoeDown bug?: \n aren't converted to
- auto text = h.process(info.changelog.toUtf8()); + text = h.process(info.changelog.toUtf8()); // Don't convert if there's an HTML tag right after (Qt rendering weirdness) text.remove(QRegularExpression("(\n+)(?=<)")); text.replace('\n', "
"); - changelog_area->setHtml(text); break; } - case ModPlatform::Provider::FLAME: { - changelog_area->setHtml(info.changelog); + default: break; - } } + changelog_area->setHtml(text); changelog_area->setOpenExternalLinks(true); - changelog_area->setLineWrapMode(QTextBrowser::LineWrapMode::NoWrap); + changelog_area->setLineWrapMode(QTextBrowser::LineWrapMode::WidgetWidth); changelog_area->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded); - // HACK: Is there a better way of achieving this? - auto font_height = QFontMetrics(changelog_area->font()).height(); - changelog_area->setMaximumHeight((changelog_area->toPlainText().count(QRegularExpression("\n|
")) + 2) * font_height); - ui->modTreeWidget->setItemWidget(changelog, 0, changelog_area); ui->modTreeWidget->addTopLevelItem(item_top); From 549b5a648861df8df79ede0c0d12a4a5d8115b47 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Tue, 25 Oct 2022 20:15:31 +0200 Subject: [PATCH 22/37] Merge pull request #231 from tobimori/patch-1 --- .github/workflows/build.yml | 1 + CMakeLists.txt | 6 +++--- program_info/CMakeLists.txt | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b6400791..ac701c1e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -251,6 +251,7 @@ jobs: cd ${{ env.INSTALL_DIR }} chmod +x "PrismLauncher.app/Contents/MacOS/prismlauncher" sudo codesign --sign - --deep --force --entitlements "../program_info/App.entitlements" --options runtime "PrismLauncher.app/Contents/MacOS/prismlauncher" + mv "PrismLauncher.app" "Prism Launcher.app" tar -czf ../PrismLauncher.tar.gz * - name: Make Sparkle signature (macOS) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97bad31b..94af61f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,14 +222,14 @@ if(UNIX AND APPLE) set(APPS "\${CMAKE_INSTALL_PREFIX}/${Launcher_Name}.app") # Mac bundle settings - set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_Name}") - set(MACOSX_BUNDLE_INFO_STRING "${Launcher_Name}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.") + set(MACOSX_BUNDLE_BUNDLE_NAME "${Launcher_DisplayName}") + set(MACOSX_BUNDLE_INFO_STRING "${Launcher_DisplayName}: A custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once.") set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.prismlauncher.${Launcher_Name}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_NAME}") set(MACOSX_BUNDLE_ICON_FILE ${Launcher_Name}.icns) - set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2021-2022 ${Launcher_Copyright}") + set(MACOSX_BUNDLE_COPYRIGHT "© 2022 ${Launcher_Copyright_Mac}") set(MACOSX_SPARKLE_UPDATE_PUBLIC_KEY "v55ZWWD6QlPoXGV6VLzOTZxZUggWeE51X8cRQyQh6vA=") set(MACOSX_SPARKLE_UPDATE_FEED_URL "https://prismlauncher.org/feed/appcast.xml") diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index f6e2ea84..61949e13 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -15,6 +15,7 @@ set(Launcher_Name "${Launcher_CommonName}" PARENT_SCOPE) set(Launcher_DisplayName "${Launcher_DisplayName}" PARENT_SCOPE) set(Launcher_Copyright "Prism Launcher Contributors\\n© 2021-2022 PolyMC Contributors \\n© 2012-2021 MultiMC Contributors") +set(Launcher_Copyright_Mac "Prism Launcher Contributors, © 2021-2022 PolyMC Contributors and © 2012-2021 MultiMC Contributors" PARENT_SCOPE) set(Launcher_Copyright "${Launcher_Copyright}" PARENT_SCOPE) set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) From 9ec78372751ac57273a5382f2c2028d20050505a Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 27 Oct 2022 22:53:15 +0200 Subject: [PATCH 23/37] Merge pull request #318 from TheLastRar/manifest-platform Fix: Don't specify x86 in manifest --- program_info/prismlauncher.manifest.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/program_info/prismlauncher.manifest.in b/program_info/prismlauncher.manifest.in index 1d764445..6f4467c7 100644 --- a/program_info/prismlauncher.manifest.in +++ b/program_info/prismlauncher.manifest.in @@ -10,7 +10,7 @@ - + Custom Minecraft launcher for managing multiple installs. From 9c4455ca03fc1b5f57132c74c12125d2d66d7192 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Fri, 28 Oct 2022 07:54:17 +0200 Subject: [PATCH 24/37] Merge pull request #301 from DioEgizio/clang-attempt feat(actions): use clang32 for building on windows --- .github/workflows/build.yml | 11 +++++------ launcher/FileSystem.cpp | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac701c1e..ca82d3d8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,12 +30,12 @@ jobs: - os: windows-2022 name: "Windows-Legacy" - msystem: mingw32 + msystem: clang32 qt_ver: 5 - os: windows-2022 name: "Windows" - msystem: mingw32 + msystem: clang32 qt_ver: 6 - os: macos-12 @@ -89,6 +89,7 @@ jobs: update: true install: >- git + mingw-w64-x86_64-binutils pacboy: >- toolchain:p cmake:p @@ -99,7 +100,6 @@ jobs: qt${{ matrix.qt_ver }}-imageformats:p quazip-qt${{ matrix.qt_ver }}:p ccache:p - nsis:p ${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }} - name: Setup ccache @@ -194,7 +194,7 @@ jobs: if: runner.os == 'Windows' shell: msys2 {0} run: | - cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -G Ninja + cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja - name: Configure CMake (Linux) if: runner.os == 'Linux' @@ -281,7 +281,7 @@ jobs: cd ${{ env.INSTALL_DIR }} if [ "${{ matrix.qt_ver }}" == "5" ]; then - cp /mingw32/bin/libcrypto-1_1.dll /mingw32/bin/libssl-1_1.dll ./ + cp /clang32/bin/libcrypto-1_1.dll /clang32/bin/libssl-1_1.dll ./ fi - name: Package (Windows, portable) @@ -293,7 +293,6 @@ jobs: - name: Package (Windows, installer) if: runner.os == 'Windows' - shell: msys2 {0} run: | cd ${{ env.INSTALL_DIR }} makensis -NOCD "${{ github.workspace }}/${{ env.BUILD_DIR }}/program_info/win_install.nsi" diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 39e68c20..76cfccb0 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -401,6 +401,7 @@ bool overrideFolder(QString overwritten_path, QString override_path) std::error_code err; fs::copy_options opt = copy_opts::recursive | copy_opts::overwrite_existing; + // FIXME: hello traveller! Apparently std::copy does NOT overwrite existing files on GNU libstdc++ on Windows? fs::copy(toStdString(override_path), toStdString(overwritten_path), opt, err); if (err) { From ed28234cfb435a8b1693867bb1fdda86ae57dfa7 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 28 Oct 2022 13:40:52 +0200 Subject: [PATCH 25/37] Merge pull request #319 from Scrumplex/fix-avoid-mr-segfault --- .../modrinth/ModrinthPackIndex.cpp | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp index 3e53becb..ae45e096 100644 --- a/launcher/modplatform/modrinth/ModrinthPackIndex.cpp +++ b/launcher/modplatform/modrinth/ModrinthPackIndex.cpp @@ -1,20 +1,20 @@ // SPDX-License-Identifier: GPL-3.0-only /* -* PolyMC - Minecraft Launcher -* Copyright (c) 2022 flowln -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, version 3. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -*/ + * PolyMC - Minecraft Launcher + * Copyright (c) 2022 flowln + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "ModrinthPackIndex.h" #include "ModrinthAPI.h" @@ -35,7 +35,7 @@ void Modrinth::loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) pack.provider = ModPlatform::Provider::MODRINTH; pack.name = Json::requireString(obj, "title"); - + pack.slug = Json::ensureString(obj, "slug", ""); if (!pack.slug.isEmpty()) pack.websiteUrl = "https://modrinth.com/mod/" + pack.slug; @@ -59,23 +59,23 @@ void Modrinth::loadIndexedPack(ModPlatform::IndexedPack& pack, QJsonObject& obj) void Modrinth::loadExtraPackData(ModPlatform::IndexedPack& pack, QJsonObject& obj) { pack.extraData.issuesUrl = Json::ensureString(obj, "issues_url"); - if(pack.extraData.issuesUrl.endsWith('/')) + if (pack.extraData.issuesUrl.endsWith('/')) pack.extraData.issuesUrl.chop(1); pack.extraData.sourceUrl = Json::ensureString(obj, "source_url"); - if(pack.extraData.sourceUrl.endsWith('/')) + if (pack.extraData.sourceUrl.endsWith('/')) pack.extraData.sourceUrl.chop(1); pack.extraData.wikiUrl = Json::ensureString(obj, "wiki_url"); - if(pack.extraData.wikiUrl.endsWith('/')) + if (pack.extraData.wikiUrl.endsWith('/')) pack.extraData.wikiUrl.chop(1); pack.extraData.discordUrl = Json::ensureString(obj, "discord_url"); - if(pack.extraData.discordUrl.endsWith('/')) + if (pack.extraData.discordUrl.endsWith('/')) pack.extraData.discordUrl.chop(1); auto donate_arr = Json::ensureArray(obj, "donation_urls"); - for(auto d : donate_arr){ + for (auto d : donate_arr) { auto d_obj = Json::requireObject(d); ModPlatform::DonationData donate; @@ -104,7 +104,7 @@ void Modrinth::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, auto obj = versionIter.toObject(); auto file = loadIndexedPackVersion(obj); - if(file.fileId.isValid()) // Heuristic to check if the returned value is valid + if (file.fileId.isValid()) // Heuristic to check if the returned value is valid unsortedVersions.append(file); } auto orderSortPredicate = [](const ModPlatform::IndexedVersion& a, const ModPlatform::IndexedVersion& b) -> bool { @@ -116,7 +116,8 @@ void Modrinth::loadIndexedPackVersions(ModPlatform::IndexedPack& pack, pack.versionsLoaded = true; } -auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_type, QString preferred_file_name) -> ModPlatform::IndexedVersion +auto Modrinth::loadIndexedPackVersion(QJsonObject& obj, QString preferred_hash_type, QString preferred_file_name) + -> ModPlatform::IndexedVersion { ModPlatform::IndexedVersion file; @@ -141,6 +142,12 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_t auto files = Json::requireArray(obj, "files"); int i = 0; + if (files.empty()) { + // This should not happen normally, but check just in case + qWarning() << "Modrinth returned an unexpected empty list of files:" << obj; + return {}; + } + // Find correct file (needed in cases where one version may have multiple files) // Will default to the last one if there's no primary (though I think Modrinth requires that // at least one file is primary, idk) @@ -167,7 +174,7 @@ auto Modrinth::loadIndexedPackVersion(QJsonObject &obj, QString preferred_hash_t file.fileName = Json::requireString(parent, "filename"); file.is_preferred = Json::requireBoolean(parent, "primary") || (files.count() == 1); auto hash_list = Json::requireObject(parent, "hashes"); - + if (hash_list.contains(preferred_hash_type)) { file.hash = Json::requireString(hash_list, preferred_hash_type); file.hash_type = preferred_hash_type; From 0617b431908cf7daffbeccf7f22ef36d7f7c918b Mon Sep 17 00:00:00 2001 From: txtsd Date: Fri, 28 Oct 2022 18:43:32 +0530 Subject: [PATCH 26/37] Merge pull request #322 from DioEgizio/64bit-it --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca82d3d8..dd2c0599 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,7 @@ jobs: - os: windows-2022 name: "Windows" - msystem: clang32 + msystem: clang64 qt_ver: 6 - os: macos-12 From 5bcb6962c4e5e356d3f7eb39aec20a6eca142146 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Fri, 28 Oct 2022 21:54:10 +0200 Subject: [PATCH 27/37] chore: bump version Signed-off-by: Sefa Eyeoglu --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 94af61f3..abdbb20c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,7 +77,7 @@ set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRIN ######## Set version numbers ######## set(Launcher_VERSION_MAJOR 5) -set(Launcher_VERSION_MINOR 0) +set(Launcher_VERSION_MINOR 1) set(Launcher_VERSION_NAME "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}") set(Launcher_VERSION_NAME4 "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.0.0") From 9337ec670636c77dfe09035cc5921d0dc3fd07d3 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 29 Oct 2022 00:35:48 +0200 Subject: [PATCH 28/37] Merge pull request #173 from Scrumplex/fix-icons --- launcher/resources/OSX/scalable/launcher.svg | 14 ++- launcher/resources/flat/scalable/launcher.svg | 14 ++- launcher/resources/iOS/scalable/launcher.svg | 14 ++- .../resources/multimc/scalable/launcher.svg | 14 ++- .../resources/pe_blue/scalable/launcher.svg | 14 ++- .../pe_colored/scalable/launcher.svg | 14 ++- .../resources/pe_dark/scalable/launcher.svg | 14 ++- .../resources/pe_light/scalable/launcher.svg | 14 ++- program_info/genicons.sh | 86 ++++++++++++------ program_info/prismlauncher.ico | Bin 102134 -> 372526 bytes 10 files changed, 132 insertions(+), 66 deletions(-) diff --git a/launcher/resources/OSX/scalable/launcher.svg b/launcher/resources/OSX/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/OSX/scalable/launcher.svg +++ b/launcher/resources/OSX/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/flat/scalable/launcher.svg b/launcher/resources/flat/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/flat/scalable/launcher.svg +++ b/launcher/resources/flat/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/iOS/scalable/launcher.svg b/launcher/resources/iOS/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/iOS/scalable/launcher.svg +++ b/launcher/resources/iOS/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/multimc/scalable/launcher.svg b/launcher/resources/multimc/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/multimc/scalable/launcher.svg +++ b/launcher/resources/multimc/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_blue/scalable/launcher.svg b/launcher/resources/pe_blue/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/pe_blue/scalable/launcher.svg +++ b/launcher/resources/pe_blue/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_colored/scalable/launcher.svg b/launcher/resources/pe_colored/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/pe_colored/scalable/launcher.svg +++ b/launcher/resources/pe_colored/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_dark/scalable/launcher.svg b/launcher/resources/pe_dark/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/pe_dark/scalable/launcher.svg +++ b/launcher/resources/pe_dark/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/launcher/resources/pe_light/scalable/launcher.svg b/launcher/resources/pe_light/scalable/launcher.svg index 69dd84b1..aeee8433 100644 --- a/launcher/resources/pe_light/scalable/launcher.svg +++ b/launcher/resources/pe_light/scalable/launcher.svg @@ -37,17 +37,21 @@ https://github.com/PrismLauncher/PrismLauncher - - - CC BY-SA 4.0 - - Prism Launcher + + + + + + + + + diff --git a/program_info/genicons.sh b/program_info/genicons.sh index bfe756d8..42592c4e 100755 --- a/program_info/genicons.sh +++ b/program_info/genicons.sh @@ -1,39 +1,73 @@ -#/bin/bash +#!/bin/bash -# ICO +svg2png() { + input_file="$1" + output_file="$2" + width="$3" + height="$4" -inkscape -w 16 -h 16 -o prismlauncher_16.png org.prismlauncher.PrismLauncher.svg -inkscape -w 24 -h 24 -o prismlauncher_24.png org.prismlauncher.PrismLauncher.svg -inkscape -w 32 -h 32 -o prismlauncher_32.png org.prismlauncher.PrismLauncher.svg -inkscape -w 48 -h 48 -o prismlauncher_48.png org.prismlauncher.PrismLauncher.svg -inkscape -w 64 -h 64 -o prismlauncher_64.png org.prismlauncher.PrismLauncher.svg -inkscape -w 128 -h 128 -o prismlauncher_128.png org.prismlauncher.PrismLauncher.svg + inkscape -w "$width" -h "$height" -o "$output_file" "$input_file" +} -convert prismlauncher_128.png prismlauncher_64.png prismlauncher_48.png prismlauncher_32.png prismlauncher_24.png prismlauncher_16.png prismlauncher.ico +sipsresize() { + input_file="$1" + output_file="$2" + width="$3" + height="$4" -rm -f prismlauncher_*.png + sips -z "$width" "$height" "$input_file" --out "$output_file" +} -inkscape -w 1024 -h 1024 -o prismlauncher_1024.png org.prismlauncher.PrismLauncher.bigsur.svg +if command -v "inkscape" && command -v "icotool"; then + # Windows ICO + d=$(mktemp -d) -mkdir prismlauncher.iconset + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_16.png" 16 16 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_24.png" 24 24 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_32.png" 32 32 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_48.png" 48 48 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_64.png" 64 64 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_128.png" 128 128 + svg2png org.prismlauncher.PrismLauncher.svg "$d/prismlauncher_256.png" 256 256 -sips -z 16 16 prismlauncher_1024.png --out prismlauncher.iconset/icon_16x16.png -sips -z 32 32 prismlauncher_1024.png --out prismlauncher.iconset/icon_16x16@2x.png -sips -z 32 32 prismlauncher_1024.png --out prismlauncher.iconset/icon_32x32.png -sips -z 64 64 prismlauncher_1024.png --out prismlauncher.iconset/icon_32x32@2x.png -sips -z 128 128 prismlauncher_1024.png --out prismlauncher.iconset/icon_128x128.png -sips -z 256 256 prismlauncher_1024.png --out prismlauncher.iconset/icon_128x128@2x.png -sips -z 256 256 prismlauncher_1024.png --out prismlauncher.iconset/icon_256x256.png -sips -z 512 512 prismlauncher_1024.png --out prismlauncher.iconset/icon_256x256@2x.png -sips -z 512 512 prismlauncher_1024.png --out prismlauncher.iconset/icon_512x512.png -cp prismlauncher_1024.png prismlauncher.iconset/icon_512x512@2x.png + rm prismlauncher.ico && icotool -o prismlauncher.ico -c \ + "$d/prismlauncher_256.png" \ + "$d/prismlauncher_128.png" \ + "$d/prismlauncher_64.png" \ + "$d/prismlauncher_48.png" \ + "$d/prismlauncher_32.png" \ + "$d/prismlauncher_24.png" \ + "$d/prismlauncher_16.png" +else + echo "ERROR: Windows icons were NOT generated!" >&2 + echo "ERROR: requires inkscape and icotool in PATH" +fi -iconutil -c icns prismlauncher.iconset +if command -v "inkscape" && command -v "sips" && command -v "iconutil"; then + # macOS ICNS + d=$(mktemp -d) -rm -f prismlauncher_*.png -rm -rf prismlauncher.iconset + d="$d/prismlauncher.iconset" + mkdir -p "$d" + + svg2png org.prismlauncher.PrismLauncher.bigsur.svg "$d/icon_512x512@2x.png" 1024 1024 + sipsresize "$d/icon_512x512@2.png" "$d/icon_16x16.png" 16 16 + sipsresize "$d/icon_512x512@2.png" "$d/icon_16x16@2.png" 32 32 + sipsresize "$d/icon_512x512@2.png" "$d/icon_32x32.png" 32 32 + sipsresize "$d/icon_512x512@2.png" "$d/icon_32x32@2.png" 64 64 + sipsresize "$d/icon_512x512@2.png" "$d/icon_128x128.png" 128 128 + sipsresize "$d/icon_512x512@2.png" "$d/icon_128x128@2.png" 256 256 + sipsresize "$d/icon_512x512@2.png" "$d/icon_256x256.png" 256 256 + sipsresize "$d/icon_512x512@2.png" "$d/icon_256x256@2.png" 512 512 + iconutil -c icns "$d" +else + echo "ERROR: macOS icons were NOT generated!" >&2 + echo "ERROR: requires inkscape, sips and iconutil in PATH" +fi + +# replace icon in themes for dir in ../launcher/resources/*/scalable do - cp -v org.prismlauncher.PrismLauncher.svg $dir/launcher.svg + cp -v org.prismlauncher.PrismLauncher.svg "$dir/launcher.svg" done diff --git a/program_info/prismlauncher.ico b/program_info/prismlauncher.ico index e4529f93807cd8f40c25820338e2821dc35105cf..2f0fa67ff6be7681f76aa8ccbdfedabcef766b72 100644 GIT binary patch literal 372526 zcmeHw2VfM}nZJnRILYObTrU5_xl0b;U2>N@Cl|+nX)+QnfGSl5j6nqpRRpF8?NXL% z3Agv!sDA(Nt#($kvpc)9yEC&hqqi`c_U65>yx;fQ z_uljJYUA~a7x}gEdd=(4ul>+#99|m?ru!ea@mht?e0@##?|69~{`1RTZ@kfb|K*>& zydK8C?Dg7fru$!dc`Z(V+3VF;o9}1+#LKJOXD@sG5}%X!V}FR>XTR+AXG{YhczOMx z`8m1u^1_$&Md?^&0VR zHii`xDGfv=Kqa7P3AF3pyCdQ}lZAPLd*jg_&n*12uWz9($e7o2)LV*XjuJ;DKqX)$ zf!ALT`B6Kc;1De94>4G`b+&_lvn@b7P%zhTM9jR9Q8?3#{-^|~1e7X)c5nClU3=eP z17iKIExdD|3Bf;8KbX@i`EFXzph2Veg;+WQ85iTJMPV%*-n zGx%rh0G{jd_+qyINSvWge^dfg0-lmUJKrF0#CI+pP4;lk_s&K9v)cv-=lG2Z@)Z9x zT`GarC;?MHzTLJxALiN5-NipsCm?+Uc!WUniZiWIC6s3>0f{AG_`#dq0>co$XW1Bb z=UOcMGj;&aXVd(W!wd!kt~y13R0322B1oVO_TvX3&I{eax~*>|z(3PAC_+0hg!&PP zpnV!eYn1?l`vP0o72}zN_-E|Ed141>eW0~wVam5F5+Ln+9KSy)2FC5hAp`!K?SNnM zIodzqN=~5Pv?d9>=^NY&@hVw)&$R`z;h*s__DeoFujhzftx2bpS1JKV5-|Db?&IQ9 z>U-Jo&)9)p$%p3oCHXj#3w=)|pk)dC{q5fWix|(w!=>?ickP1*@o(xM7?GFem-Kfn z>zMLJCBT(HJMW->L+oWCejD7yush#-9{YURy{8h;k_7&*OW)rh zUKim}=MHYg`c@(MXT}O@(GDz{(__qUw4`&&3zdLzK3=!rWW?=bv9K#fJPN}Or^&QXv3R)oxq)*?`{ClzS>}-4r z$A7aOAY+Dfte_PlNS!Rd(Jk;#h(nL{={sWsRDpl?3?#owcYQqte|dguaQ}_k5KDqQV)Oa+Qq#5rcZDT;#km{JD$WlH*FQ- zpXnQTIL9wJ#o!z9WA)?|N~zW)V49a#!o`(Z?p2I`qaDDxMOVoDBD(H?){v!ae*W$o z+#a#>omz0tN2l8H-?Hw&h+}x|t?XPwsZ+ZII{Nzk9x+4w_8R#xrKacF!M|w_1Ha^4 zx|fOCQKmfl+qDb&X}fO0(-7Ow)r4b)X&ir>8gVU@X073W`M_uf`z>dE zz`lJGgQ(wtGGL{6Do9=5w1@Xybi=>JzmW=2YsY!djt9zFiSRM)TN!-$rjYX$$C;=(QP zZR-DX^sJt=3G!0j`-N;7jwYlS37G2oSGA09N4#kP|BL&_I>Nc5_qS-9KryhCoDiI& z^Jm0)|CW*c9pPKxd;jBmCI)qoJOk1MJR*TNeEa+oF`a>jQ+woU*$${3 z|EoTT5{PZ1KY)<1jd>FS*X}n2{n{g$lqM>P1aMvb!HDBKTE?;~yr~)g^ZZA^_OZQ% zVA_Q+fp_-m{Xdi>Gtx+9lRyXWfd6QX{rW;}ftvCEdGv=a;977!z!*0fC)kx5^k>;J zEKNuh3HbW@{t$6b*4wNRiiOq~PObRQ?41C+b%B!O-!zW!9NPqj?MZ&Gh>|&JB$7&? zL$}^t5X{W?mY(%Mxh!UdS&n|C9bbP0Y=8 z7R#=LS0nzH3>e;mNlPDJIi5F>{=q$|egE0zj7mQgT>@`*3+{*c|E4P#XwBcK5&yX# z_muqbKb<#yg4VWX47KcstNz|1Cn6Z_+XjwEoi*pA+9$PBTA;GkvNn<2VehJ5&K_@ zjfK`2pPKN$A?5=mV&6o#a&K=y(00sqvJv+0#137CBNN-6H8!962arQ?5X#8B69XQNDZ zp*=5F`jzN6q4e|wP<}`#&Tcj_}`K&)|y^|{P#q|wUhk| zjp#QxrM0#P$lANO4j&!U_WB4QSV`_g^vpKTr||S~D$5!hc2(S<_2X<9)8!hDTbp0i@24 zSfhRX9&GP(ZJmR?OmZZqZ??2|KtfA;yzp_8zA`U;pIG+J^yuxhZ<*7TC!XJE^maLCI3nBbmu z=o7Vq|1M$rTn78>bEiHdp#8f8s2z~N4tVzpf$@`PLH>6~Y~r4=0c_lJuP>b`g6#{x zfCU4_OJWD+1&n|l;}p53m))}3Nk1RnxVF#e2dma4vM|rW|5n|%TERbJ{stTO7T2LV z=ol0W?Yq;y0dD`CEB8Lwwx5-@7>=JfZ5Q`K@Xy$Tl1s&~YuQ(j*DWuV}*in?+pGKJ5Y*tU}x4Q$ml!H?fO7w?|3=)@KKDN`6_)dEc#}wJ=~k$&CNBa zejn1#p}L+HIOoH^>3Ns_A47-t2T?m9&<=Edzn`(5fAG+8r*Q8I{uw)P`TRv=yCA*K zSeNa<=0ugP>E)&ma?b29ShkVd#%I;{E!zIg&ogp$@2b5H;2oAa-WmKeVLSIpfcEe7 zr*?qH4s?9C4~*7Lhwl#@a|!qE;Gb;=a_6mcx}PvBnoH_?z zO=$=N2`2IF9CIdyh%au#gb@jTJ+VPK=-{&;$Ico5}o;OqGxz>=@V z*uk~Ae0LB=ze@x7FLM|F%=ex9je_>?hqb!8fPY97to&@FsJLhB02jkz+#lQVJuHiw zYGnt~aSxxJ%G|@pHkJjH^X&FR?k59a`4`C!FfA1O#&DO_jDNDe2V%F5!LL~7PPqSj z`*-?j-VP8yT{4!(_Sa)@E7n;IyxWSSyu2K~`*J%hz&0G?SNvtnAW?9}#+(wacVZiV z-OAx&;+~1?Ie=Fiwc3Dg;rc&_g?X!ZLdQeLfM`wj4UoP);=AMQSe`33!4`JKd`5f+ zh!4@?kR-M2;Um~aE}tocBP(=*v89A^-5w3!&K(F#MQP(ZY7gk&Qfv9& zHC!L&F203+-??uxba*dBwRXU-|4>->#n-aop0Ne?Fe}Bo3x{^X_i5_f(}&oDW}n?8 zQOkI{;{sb#`>7WHVfsX&_!T7_`Vw~vj>o>uT6LrJri*1G@~pVg2$LSde4aXIFH)kg-*-+P%eb-rp2aaP4H9p-X5A_6?AE z#=(lN4@4)Vz`p!L9>Kk*%73a^K_+n31E? ztF`?14%0361pb*cyWl+I4n36TOYA=&5lAFNpu?~(G}$~J6G-Jn+dcL~?!dlL5+X_LMI5Bd^^MJB?IUHOVA^Vzn+ z3Vxk&~|R$*N{I`T;E|g=jDoxaeMJSRU`g= zBMd)gFsAr3`lxpd_(&9A;-Rsl;lM%n=H!cwaeMJG7*qPW?D7RTx@w}^bpbLj_shkR zu+Xh}xsH7H#C@N2GUjEq*?^7%b-z_S?m6vy6F$#4I6NA* z?%1m;+%tBFi!U|YUp{pd4$L1exGu02=jE>0AnLqad-ZkE-z~_Q@b7BFKl=W+XYi!f zv(cB>&bq|y(Z6uq#7{ityUSqMowFM7Zi~k9(qcIA#T?j!{&{@!batA2c3oV1OLQDN zD(Cs%r~FNA`0p}s!aHikJ)7<>JoAh@bngwBOIEA0%xBvRTi8<5v-8+D$n_aw_R^7Z zUM@dY#cvy=Z_{^E8~(k+^?lhmQu}q60b|U27Lm68mtWuA*@xL%9HBfE%N8i5)wPW5E{he{oqO4ULG=Y7s;Gfuq)BC@M)$3%Omuump zC$)Xif1oz}=a=l*i~@@-*PjAsGEreh!fd5V9IuMS_?EZ_5TSh4F91-02lv z!_|j>-B>a3rnERxW~sl;uch`s+rDf$v`(A&->M&}HvD%9)lF6!cEzA);hJwXQ}%1A z{!i>ce!+H);y+cVLj2DX18+);PD9-l3@( zO2e)g^z1+2+CF>E;!>{gYR5dA{tLzDG>U)ST-D(}T)#{VyeTOT9Mgn?!gI9#ueiRy z3Lti%yrK*iY}ISg1}s(^{=0^yu2&Lv#h|5U|m+qLVIs7lk)vr+> z{&kzhz?_oe2u+$z@vqRbpRrw^<)vv3|Cw8L8&!w@Q2h=iVOI=VK1y9k@vm_FZ_Hn+ zIs9kj>T^|xe-ZZm6$7(k#xZ8bN{WAl-MRx{14Y1Rsv?lq+!-#Y4+fjYpl;!I!wD+E9c$EztJN8zgHXny~B0K z#KfKw;+nr=GcErWUjFYZ*s4YRA66UwyM*Zqlz>?=X;}Q(7K(p`cfBPc_m<0Od3Alyqn@*;rKsx_InNDUwwOk zAnq=Ti9IF6wJB#G#lOPwf3oO^2JxSIUVY`iu0#o#6_bXXod+oX6^{SY7fxsp|GG;m z#D9gD*i%AWyY?NW_*Xdo&tE>RMf{hj5dT+|fLSqV*#Et@=KgAN{?EnY^V-AzR$Yba z@E@wXDJJ%m5Z8AHPtx*V;pP9uk|OQlKUa56efU@I-oLKek^_eeDE<|W|H~y8wTOS! z?E#D!d*CY0l=|JFqo*kTm5%??OIpPLUA2|}-eJ1OO2x6ObR9W%n&MyK_%A6d)*}8N zstx~$u^Lx#rqu6_ouK$v`aB_x;{S;X@&8<@IChn;lLcpK`LFQuzpT7ei{<}Q72?0% zRh%jHJFTt#sm1ZX^71k*;=fjf_-|4wj$Nhe^ywm6{wuuvC+(BWT+OWk+@LD_8w@{i z6=O>N?#vmAf2Fto34IH;PS9K(0Klt_YHR?-zvAl&MMan3&YipP?AbH8e*HSA0oOul zOe(2@#FA=F9bN$H!9N-*EXQg6AJ^BnwdR&5pPf5*5h^RMLSthiFu$gzCa9{af~!}r zYQhdAX$<>l%hXl>Z^l3E|5F(LOG?V&#fujV?5)nkCOmlXK-D&&4D0_|EBlcjHTM6} z@jr#&|Ki1Bc>MT@72f$C)Ya9&?c29iX$MLxDz%7zHIDyL{~r(I|NQxjaP#JEKA1av z{`BcnxOVNDs_Z~aDK7B{HcJ_TkLj&Bue_!!7;9|KZ>;I~o|I;;;&i|FO zpZ~&z%kc2wBWGdlbokoZT5MC?RID8+s<@)X_Wv!l)&IL{as7`&ClooJcjLw_z-qdz zznYpFMfMGxFV`gg)wljfn2xUhC2{?~0?WGk`g&P$&rXc=4Lp4K5d8@%6;mHLTX9u` z<$qPB>dOBx9bNxZBK%*vR05=LUMW9fgYMnCrwAKRs7d@+m#Pr|bp3CU@lSkq@85r* z6xdtQ@%;I7xN+l#NA1AT@@twa{}W29)wupQ-Ty-*{FCv#Yu9dA`0QGNPeBi=tE)Zc zOMI~Wy5{hY{(nX4EC1>KUt;wCmzENr-C6~qTNo+Cm)H}11N+KvXb%5L#norjhkv^N zr#tv3ZTzaLYGGhga46zSeCN&`+1doV%5Q28|5*MPstx~i|8Lj)|IVMkgueH86pU!s zNRw-xac-IR@Sjv%bzE)u_YT(`Q}S9KuFy7r#b(LI{~4cM_Pkuzkfz+Pz{vFNBRW71kqfE+q#$T3c5C7QyKcG7Nhv~joGL~JT zZA$v*qT=7#dAY8kO}SqYU*cQ0Zi(7Au)gfB7R&$rD#ZUjS1_jJZ^q7CDGL7GotLXz zM7u_rnDdOYO7Ce7|5*O-Q62t6^*fY|WmjnXD0QJ*_&;~<0+w~2_1Sd|q0)av`UW09 ze(d%<<9THdHHZJi(weQR!+)4=vnv==@;9MLb6m!Mv(N4`>4Bv36x^L>Jhk+Z_V8a) zovl9nr><8rmR+H(N5mAT@h{iBT$RJ#ihQz8p)2!@Q%as_5dT%5sSp3U<*r~%$=`T~ z>!GmloFE&(`0Qe}mj2w3fHU)q%gQTYg!b0{g~Zb8C2GUJcW7#clCkV6ZTSZruK`e2 zRta@=o|~8J2HX_+Dd`({^yrbpdB*3oIrk6iGgb4{hW{?1x>>GbOv&GUvn`*u{J(s; zR8jMC6$xfHh$8ch?fDWP*5KSf<67p$)zejo|H(?mv8%K#TC>Fp|72e7y?giF$l3H$ zXC%Nk&p4<2mImAYxQ|h3wO(!bM|_QS6=O>NE@jqgGyX{%|N3?H%*%BKV@eN8+5}|J zBKEq(E6TJt_D{#Y`RN@KkEdJ~LTR1dKk^$`EX3rILqqcJ;B6|6S= zcMjLR>nz5U7~XsE1PIQY4H3te8nI9CPmYfYm&2h4mz4&ER!2`kNfRWQuut%BJTlP^ zYOxW2s-@hq4o^!4dEX*ztEzt{rz4F1VE3XjjP9)h|?_xIUq zb-;C#VY0Q^rtcdej={W*bKKH8NZ9*~w4YU7A4n>B`ggVAzuTY*e-ezfFdZl0R6!v;)V~+cywb z{P;iAhX0NOb-z^-riIYr6FsT9jepXzuFu80t$WfZkay=CPWH zeYPzieFKSS)z>D7xm@*Ywc+14!ti4um{UR+?+^44IBymVJ+ee_nQzMmkY{Nn+u(7X za`xts7LD@7{tTBuUa>=Xna{?(#r48^h|7HriI>!42Mk5OBBn;>O{Yh}I#_F46XxGZcFR-d#Q|9FfR-@MJ7NN{%;ht*`;?|+xK!Kv` z0;=2lm$6sgVY&r>lQHq`YfLdkuJ3Hh2owaF8=gtQ@;T184zkmh@?n6e{`0( zWj+`C=6f<;xEcKh&MVRmoMZ5$wlm`UJ5ONTR+`=e^$;+777RJ;ejA^SZ=u&SFK>aH z&mReeK&uUR?{O2Pe=Tj9Z^k{hUa+tZ;{=*l8(%2y+2P0-LGG^ya7eB>tv&~FAo=^GTg_lz`lX+71KBHC4(om zopBFR^>xX>iYXmH^RszGWG9?U@PJlW8c6Y5BL(RaPBW-r*IBHm|XaOZ_E@Jv}1wd z>iR-$Ldy9s;LPJIny>p`zSaa&6j;|6TxVE~eFH~j^d&B??$6*!ZRf7xsc%b-fA+jw zp;%LLxXjXBaIdyXb9UeX_UmVDQ(hZiFzz{Z2%|5t4D*bWN}hC58}1o;yM^ojAQk@K z9;~-HFIUOf7D^kLTfE`gA$Zn+POmEe)xKzgye*F)HTgQkrq>Ccv*Ri*<@_#gf%Nl? z<11=jW$>i7b4W+ozyjh2w=}--Cj~)i8b3 zRY-}dFdic&J<=5Z&9+9mdB!ii0NSVx_iTC*`{iQc|J`H*40K{%uAEqvGOg62jd1*- zdgc?96g`9VNjJ>6XYfDnqbm?M?}avP0JaZ|^Nf#++BZ4e-^P`;a=U zxt`C)yVZ4c1tiRRrg<9>i}Q@#_a&}b!N!sruf4-k$Gd`m$ z7sRc1-j_J3q^1WOOKQ9px(--3;MPwT$;Ov>2LAX0lWw5z<=gU7;;cOKD$b_0fa6x zX1M+KX?W3CCt7`g;QsraPhe_t%UB+RV|UKU`iHHm4q&zm=u4ci%i%oZ>s%bE_1-&F zx78N@-y1g-1}R`(u9ETWDs5!l5#mGSPCsGwlLn*j&Xf`Em-n{p#JFKsAU;jIh}7xhk5S1=o3r+f*8C)acGG{Psu|FHsuPFtb5R!>i{>jj(x@!khTE! zN1gOko~P-y*dDpCEhwE~l@LGYd26%*XX4Y~4-7t9!#Tca(a$0amgZ6{wqVf{vJiwz z)BJro!jAg5m5m2x*6&QpgrBzt%yW4R$sH21B7By&TwNB$Xa2V9uK@1x1hnVwc*?zzr)Tf z|2>w+2WXiruN{yR*UqFhV$x%+)&Y*i&VT-zJuI}=cZU6jA0qxg#e=p7&|gmuTj&fX z$9Wh!LKN$U6TNg4-7yI z+>;sytu=l*@$5=kqetFWWgVc|m#^Ui*K$4miYA>iHFt}x7=8ECA~56*VM9B*yFg2x?yVH zv%^iKO8U9UclevuhEu8dbp?-}_$GOx!uJkJuixIej~0giy@QIW z51$*rl<`v>BX~KYaA^wSlvUiY-YlYPfPp_YabM#-4F$>eAM36vq z!HPd3X7jX&Td{cJVoNReGVLAoUHtso{}CZ8(kMJ70rVTfb%r7lFLbQX##o_R@Xn=^ z>>U(0SF*i>?#5*_45fZNo&v4-=?*%(_@7MugAHPpomz;8iz_wVj~Xrdcp%QvrTu&2 zqfa?8Mx0vqMpWUlgId6@7(A#6?^d+pcwnM^P=PEMtiNG1Vn6GRm*9YWU} zQ|9`ARyema-Z&=F?Y)EU56`Ge#&tP%HIGn+n zQo|-0Tv{uv9@iMmh{=LqC^BNlR|OnBLL{~ceu{e&8PE>2 zioJ@JjA^H6BWs26?;TV}>iVs9pAC-yN#%(~oLc%Pv;#ZbtzRqsd#5mFryouU@qBD! z?;xC?yDwp0?dvMfj+A^4Nx;-5s8BkNU8PS6xD}Iz#2M9OoozBt_`0#K@1cA{lhuv{ zNSgrhH60Jl%_k5OdrF9FOv3dSv6=NVKAZ#ppq(5@IZ=WHB9AZn1GWj)q8-r8{v=Ak ztXMRRkE+ZaA9dwFl#o{_4ce6e`Ve-&IR)RlTIW{McVc1B!|@zTi7NBfZjPgzDNzEZ zzJXFD;n`VQJd9hn_8%S>RdF>Xs(gr-7qn4g{-88zUjk&U0c;b*AnsH-zfh(4e>6V2 zBE=9<@nh}hFv_7CBoKXg#ji}h#H#WeP#ON~u*}aI^I_?4)Q~4Ajjc}tM!$i=tZZlN z;hqYw9{gA4rF?XSj^npJNU4(Jh=S#v5YvY}g=?YdssR5524q)&vF%W{QNApUExjX%o}U-UDz z>z&e1CBT+I#PLP1BCeO>Q70F^9i^in{MV&KRxBMGQSmBUX7rj$Kx-0+IJM+8#AOy9 z9$$-40r+o9iK@&V8&UQrt?8NaLnUBO0z*$Pdp*j-V+EeYe`Vg-$jUeE$%wwA641H? za4o{lSQp55R9Bbcy+`mLS#e}sRAqOq>y`3HCE$z%A`6xU;yPq!q`)~}oHFD8^w`L< zKxbq^!%_*fDhZG=!{&9!3i&WA=5tx_A6app`03NJyjGQyDYNcKKqfmNG5(7v?%l}* z^xM`h0RtF*V5|?E%sM4zxzEHU5&kbw+_(0eOZgX50>lnP7A_qac{1xfgIzJsqT(Ox z`Qsxi2GYGW#MC^Ei%NhcftGfGD02%$!hazx?^!ycmsA2WNFeHDmN%|Ll#BHMm)9e6 z2mj-u$`7VQmj}tfDouh)fJ%Tz0@x;a)8t3wv_GK>_-`=!>ruZQ9&OOaR05unKvdz% ze=+S{B6uw#C-DCW=i_CJkEnRfGu+WssRXD5gh(K%B=Z&1ykm!b1Oo71Nao=hVs8Fa zNZK?El>n81awK5#Ena|q1b1wW7x3W!&iKg61>=TQbW#o{loBcdDgjp|5R#q!680DN zKpU_svM}p5V+&aLzm3H|1W7NTw!PuAQN9W$ELuZsq zDgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dgi11 zDgi11Dgi11Dgi11Dgi11Dgi11Dgi11Dghz^pg%b!@c0+@Q!})&`@YG`YqGrnkG;I? zCXnyt^^(2s9ps1x^4^C(0!-d60r}*;9RkQ}J6Y10yd46J$=e|y-xxhV0nM*@2{0wk zOMoePUIHqa_<1B?VBXu#1E_oEH`$g7UNCRHyxQ7&U)l2h6**eQc8`dad!P4ZX-T0o;EDjz0~*d&jY2P<2?VPBag zoX>vRa&4Ay%OlGxQ~EsQn;GCC-<(BkN}r_EwmAVF_RI`cT2j?=XJRnF<%#8$i9vVY z8!TgOxie|l)9+gd;$Ah&m;1EkUK8(mv!}^K*m*yh2!OtC$q<|?O~{AWJedp>eb3Q) z%dHQ=2bE8YKsZ-aJ~V$&d~iU)x~2F)e9-y@D@RyfPDb&xX892I0W4+0zH1%t4Q!U# z*9vK0<+EvGUyIbftYpW@zBaXQ9kq`gwXbDjB9)&SvS7cx({ZmL0zh3Hq?#+sFbIudNBRAkPMY7UbC=u&rhM zRs>GAd~Zb{=QWo=4tZ88W+}HhCXNK#a^vR^IGOw2G7qxy9uqLXMRgW^i_CkAJZME8 zrlM06fW?3E)ZIOn?tx{H9FI`?@(3^CoX1fH!#) z0sP4~+adnsjdsXR@wxij($H!8=s82zRK1&_nJrl&3VBu`SzS% zBMtLNQ`B=cSJ$@g?drd!Y^a{=H}cb&?Et=BoyJM-R6{WJOC>fBx;Zt`zcD0+{QZ0xgZ?z?&Hu6`YTFQNXKGNIboheYd$g7Q@R?m@j# zXXTFcCf0iy^l!`un-jxM=jr`>3lc&r4D_aN@E@`NW~*3w6&jBm`d=PC4E9V2FdlpL z0ekW$1pH4cRIyE#N&iiI-(Umk>$y;!i5X66{ipejfNf*@n)PqW2X%WU24)-_7yOSl zh0;nMVn2Nl>as#ieL5SL)cRi=F_f!&_Wkv|iGf2}iMq{fzR@l4Pwjnzb~vjmDZ)#s z|MZ{)*p(X0*0=3zeZanb6N6qi3rM3EzP`Rc#=g7hsK+`fbm>Z*QtCfDcA#y2o9Y5g zoxpUi-8(UG+V&*BSG1`9_T7WKqJA#8q9ZB4kxKuI`o%hPj#^1%9=w;~vKx zVPMnIk`?hI}c94e$<0`M0j2y84bmvCzJI zU*jA~d-zh?yLW>J!OXdf;K0FSaQ5s4sHmubi)YTmjwRW!FihvP{x^K|fz!GYqEDe= zb{T?UL)I`@kdxY&xqaO4rOpFg!%~NLML8Ldka6&qUj*iXV8!PH|BxtHv}`RD6rMHe zo#>v?Kgk2+C@U$2{hx1ztf2-$`Cvisc*xTSdQAUcr4NQhUyp;#T%GaA$kh##UjMqK zX8oJ;L6-rep+k>Bip&E&`hEzROIE|_)8{SpZcG16J}56Qhl87U!_p5Y+sy}?lR`bB z`z^D>VcEuy&3b3_kLQI_>)$&}cZjQh=Du^EL}>p`e?{bjcY+2%`l6LkSa{B+-tFn1 z$p>YnWw2+>x3DnOx?ETq8Y8>zw@>c}Yu3cu(mV6)fYka&U0-4JZS#z>>J%6Q?Yj5z zNIvNFUO$*PJq?Z>E3~V3A^KeiNPQ;t`Ph*<*q47uklvlq zKa&qGoH_@ar>}suk)n<7+0Qc*1AvtAi&- z=-!t~|K6dxC@YBRgFOPA#jAwLh^So6*MKb+|re=t) zf2O@?tQ$l_drn_+(pUo=KXF%;)^*Jc_0tV`0Rxdu<)A{Q890s z4^q>l(tnq5-AbwS&&1og|7dut=U^apJkoE=#;O$8Qt6+G_w=?kfOGv|%bak?%C^~O zD{5X?kfY0zO8;HMbsHHyNqtV4xm0r9ONoC*|Kz+YZ-uBjw#2(-I}yi#K9@}YVft-S z>z#@Ja~yw>0`J^7*?N-d`sms3WYa(9jV;pYU-uoOAF0m=j|l6(=jzkhd#QBJj`woO zMLG4qM=Jey3DXrwt#=ZCw}BJj^qC^f;J>1x92Rb!AWI&=F`%PT=^u4-Sq}XNel%Sc z-4k2E#;KIo%XiL{MgN((sploszx}aaf&D&?^3VsP(ln?4b$ilf(Z7^qz^Jzyj&vu+ z`(fi3XiooM>|ZR4{;~ddMKb({rrr@lzmDQan6yN5`rq{3a#{3`_`fch{=;?m9qCSt z_aCE=g|qc|SHnwL=CkAe`oL;g^pE(zEtUS!_wTV7`gIgX>ZfZor~jP8>*dn_eW~=1 zdaHJ%J2Bo*N?WHn{ck(+g5X4 zME|(AiCp^sWRdjxFDkkOckkYVXV0F&_3PJx-By$0dPCVANGz$Au=n+1!$&a{ngaeI8`^8Q!1POuS%wWM{9qG)GsL1|4Xbg-qnml+KUe#KE(cnN{9Af zM(HD&@Ly9dq5fs@{|t(mVYmPH(xnnf%6M1v0jX!+yLZoS9?+FMmP!BBMN;WsF8^8vGpFhX4=!R83D91TK$t6`X>A&WfRQkuV-y`!sNEv_q z`b~>ITgjE_MgrWv9ehMLmQs?l&Kq3VBKJE`3)KM zUy~!5{$-s1nVy{kq>iojAL&c}{K6C2^q*K-y+JDd%Q64Ed+cNg*)SiX3YJ0sy$fnr zKO8*Y2yvP95VyV-5>C~~kq?$hrGIY;*MIOHJOP3;XG6rXr4U(=Wj>Zy?1vYP?)T%$ zossGq0J6VpgxHMwmIL!a{FWDxcu~rHP&H2~{dW!3&k(!+$2(jHe$!^aknb0pbYnBRJ|5fT@&FwfOJ>ppHx9V8roDr%XK zP*Rm5mHxYir$&o`f1hC!VZhonh&*X&>)HC|yB>f3OSo8dLm~~j9&OppCYWLm^DMnv zlnMAe{)-ooa8{%;p|~niGX009`n#k5w+HJXaNaB!dc=9Xv-1O~8?L*05NaCueR*8h zq;p?BLlVBsZ?5BU_3G3;+Kjl|=aArb-JqtYRQm4{qI<(t{rAvMgTeb239|KUUE8}( zJhKM!?wo^0xd(qRi;&@_qZgZC+;U;IUT|K>!ZINr>jtj+ik8*o2dx}T48hzGcGy9qwsXs3Q>$JPtZ2cNlCH;B1h^=qm0@73%B zF31P8Tf_wDvwW^gWjt5ELhhrmov^q(5AM}gIjc^=;h#KefX$!Xhta9``0Ms!=$;iv z{AO$~o)=suQ@I zfBR#Y6n_O$qAH9>!l%z<%L8!>vAwwcIV4`T-(E~8t*K!2B-I&xzz*~2|NWGyFlhHe zNo~C?o!fdg^6Wa;f3L``_F_Xr6CBO2f*BuQHS3+x|LEjfvgzMkW~{(6;UItAAgQ=o z^8H`D!}ZI!`tKe$2|_oeD?;zwyfEh6=f-~IMko3WNOkh;i5i$a{<@Xk8U2%U;_a?w|FT_s z&`{q5Cl6M`T)ln0GkIWa+*OE8uk%PAh&A;kCtPUB2T7$>A2E88>P+^3^d6{d^q)Bs zh8*DUvz0=JV#GNA*8EqkiA0dGHe{b3?}h4DNVudaPvo)z7vtyG zy}_dnk32Tk2@10^JfTB((iEasp<%`jzXoyhrEU+_t^IHg{DVi7EFjT{lUaRGANSqS ziJadG)veHQBU2wpVgs;__h@)}Lzn;+csxi{;mUuBELi%roO*OMEunf98gAUMN{FBP zT+}=emtMa)Wr&ZgmvUImB6{-lH%HSXkrrr3Jv2vH}O%|e~lNv&6*@e9?bE8#{=cB(yC zhhsW3Jl2;ZM+PvZG34~J|HAs=PN6!IGMp=V75dHCn5z&suhy|0$gJNVn^7y-zU?xq z)~Te7^}~X!N-6d0C~l#;bT!<_@%QcN{|2_{hBzfOjRnT~;ZLy-*?@ZTNFTDRdKLQJ zxM*w-&bDd~)?r_9M%1V9j~Y{_%j`s)TKcER!e!eW;Z^MSLiOlQxX~kTx7dL6`n|(5 zYya0}L23L$oZHbCbu3$%;ErCM`8ILpvy*Z28~SKmeWI`zQk4Cph?C2bF&{h@8}Hos zoYA3cVJoZ0M^zX`g{& zYDA^Ki|o`(qRjxEi>d{86A9thMw>b-LI z=$OmW&8-)Se;Q4*1U@*L`Ez3*k^}!E2l~HF`fgH(T>ob(S9MCjSWhfmIs|ROIa~IC zNB@^oqAQYVy-uAvw@Ee5Rf#NE))UKyT+9b%{}Yz}Yf~aCa>hrM_we$PX8%N+bkT>h zOTgH#T(C4U>cHx?DN*GM(Z)xNioT{9Upv_aN)x0Kpc0@Gpc0@Gpc0@Gpb}7x1k8)z zhe+`_soI{BeleOeyi=U!ec z3i8Q4ivn`XilC|a-W-8xL+!Rqgq6+j%@i4$@68l7-Z;UX%<=)7$q2-<=U}CoU;bZ_-^u`2O(HoWG z=-$j7i4i&U^nGPBXU%_6AoQLk5GoIc`N7lqmz%yL{BhrN@yx|L7+Ug!(ct8_+#Bsh zWy`(Mp0E-y+8b5^K4?z>TEZJ|TM{tYGjoK-=vWrQWDm^|`ZRxUj?i?=L}-f63~5tz z0456CGU2)Q+!P`68X%vL%qkCzGG~<+Mv8n|!W$!C-I55*)R5;Gftea|j})~fXY-F! z-T}8fRXJ$zL>le82md$nyBd!dgm30B z@z2QN#oV4FR;KxX{9m4+QHnI%c?bPld!L{zpJ&hZOZrbKXp$q& z4!-`cBA<)!sAcoZz2@Pckwfj=ULzK&2^a0!1^u*Lx1bc{^9h$%TlWt5XXH?m)-!q5 zr@`ZtJg=}#JD=bXwz4`ldf&JXrZ42(749xnX!iudMC-{3zY zU;BjcCM1kA{C_=S0K>Db^PxSdev-|5$1x{l@B?9TzT$PriJxV_KgltJfyR zIx7R*4{B@Iu+*lGL9x)jdtcGy5EM2H)~w$Ir%xBb*|Qg*qM`!I%gf>5H+iruYN`eQ zi~Gg8%=@m%!LT7~7%a$1h0I)CjFf96JEaBU9=x;g0f4i8Nmy!2IGyh>a zAlF^`kA}B;40K8cU3>J0S!s)*px}%J-?sQ?@Zli@naU> z4F9@D!+ygLh01{Jg~H{Xec!21610D(ze71hC#1l>{6jYRw#PpshmxYxaBR&KhcehX zwGVu@I?fi~Ezh=(`@K;9JBR4sV)JY3x=UCpbPW6m+WYpllEZt!gJIR$jduAK!apO2 zqVIDdf0lI_xO;LCe6b`N7Hk>c!lyaUn{{t|m!31egHZmvgpKcEi)UNUx(pbHwqYo= z^KI_aiXEwgqsIyb@y^9R!>_G#dGRGUzHVl7UYHmFU(f#lmTYEY+>+lG?3i9Dg86nv|7>|2-Le!`Y)E#fZ!Z4}a#Q;V<=;C@H^d&VeD4k% zE|8r6izP))^G;;3V5@GhaQ^l2d_3|!_x)g!)4V&A|6B4vIV{{d(PQm@d1%rc+4x_RH`i(YGq>teg!1nlnmU1xPrm0Lj7pP@|FwJOJI#Maj!rL> z|1P1r$$WhBJs&b=zHI!j-<#<)|LNPN%@)ePceu{L$0y(Op<~jW;=icq65PFe51u`H z2G_4&hZg(Z+!nHTKdbbiEBmNV7RFCANr%&P9wQE*#NOgh# zgpwM;^&hl<34C^r?|JvZ6V3LIV7#*ODl{~-VB8U}eD8^EAbID?l`CdBj4Y{gUjN0_ zg6qGowttSFI0FRZ&!6*SoR3dO&l?&V;NHD^aIxZw^Sqak{ncv(w|`t||Gtwv1+vc{ za>Rz)@3$1ZfP~{uotHsrmEiWTGyNYvQ4^uxsx-j;p^W>4FR$1SFB94rg2TNKQ2BnCRK|kyKnGxc|dDJhdYq&Y9=l1N9Ivdln2mV!cQ9$7k2W z$w%c}7F@nRSJ4C$RyUY=H}4z2unyvP8utk1<(rX5(&Z;_39bKh8KiH^@M-JZLq81$ z?_K0@U-*pDop8Ul+GV~U*8r^9ZG&&_zKP3lujKq^c4gqq9?GwW7=DC&H*tCI9yb|6 zH>Eq|o4p=I-04-YFj9lW}zLR|W$73F7j5!G}3)Mdf#~%Oa zM)reWJ{KZRG-I62pU`W9iTryPpb^V6z8`sY_CyVQnsNB3$+WdHPUUqB*j z|8(TvsqqiOKN^|*aW8@R{~oKgzutLPhsA~8y4#py1v&8<{M`JaMV54 zeViWu>Y<+=KRAEU6QTNbHk__#BW%O{+R6UxbM@CP_-3u$0ZE3()^?AJe>?YaE73;g zKO04K>demoh9BTMLo1x+%h~X3UTs|)_ZpcmV6PEA8Dusrb7%d^sOB|x1g*K{Ebk<| zEuOj09PG8hmp`5j&!}_5|Dh$fVBO}=NNb@h{5krD%d4$>p1mgc_=e$`_2*+2)QY-J zv2kDU!lhG?pIS#eIrH8YzqX!zJc_l~0$*OwsISGkks-tYKWfpQxL469miz_R8am<( zkM_da;+5}N;*4ruo#P%;hZE-2zAi4ewqrBe#=@mZ$k!u#ya{>7$E&U9&E=uxKD=cA z)VPeg1b1wlZ7v-@WvyfH@*aq`__X(I#6)v>XxvM1SUPxo9eUgYuoJG+dQynKxnb<_ zYU|y&m@5#QR(m2Qz0TwQ&lWiZ*CE4lA_Vz!YL63JJlc771J|^Q2?+s3`M< z=a-Luf{Td4tWR+Nm)orTe`|bX#Y{Elb3T4~pJRCuvu|z3@zIrk#|1!I&HPthdC(Ug zkpN#`96o>17XRR{(zN7(p?N6;TyrKoVmmUHbuTk&Wzj{Jzzi-H~vg|GVAR{Tk@3WN7jjW1CIzi%EzS<2F}AN!DIGZ|Ae-@A1LI-o81Ebr@e2`mpG@!Jg1&DkEkB6znI%2 zkz{Q}{r>h&;J@;%1;C=8nFE7s0E}Gw>HCTQ;%O#c_YL`(Y3^eccODaSZ-ag#A8Eak zpOU%j^ZSharQCe{(a-OdcHM$UBaIIjI{D6g^s}DdPxnh2ooxt_tZ$JmpTBnt?uN7$ z@zKkD&Z3jaKUU|@h7Ns#^TdkxO!9x9otBu_WKOs#k2i5?w0G}_eye$a69ckEp8MU# zG}rTZ0=V0^n6_DmX5({X9XRgUSunzBqS0{`%buPPn0gkND8+q6{r8lfwIoz)Q{(@ZH*N*5%AI+V%=(czkIv!G{X2O{>&2z08 zS=&0>qTAwGc{%LQSpbW^bv)M+=UQ!ZL_hji?zf=TG{>0xEIVf(Z=PZEVL_`2%iL#& z&+NA=_m(+>se2vMuRFq})zm=P#cT zMt`pUq$Bz<|6kzJYU}>M;gh1#f1&uiK>Bs(9MO-omf510`|R-1Q=-v-x#XfC`ZKmo zz9tv_&ddY4P+n=*$CL4O#dE16`rXYxjE}!F^LWmd3-(<*5>kJ7d$1l>?A;CZBFtkUe!m+EY9QgF0H6Kh zD#!H)d-b<)J@lM39R}}j_EBG4o(InwYOUld^ucrdblG;3ANo@CHQ$TA=Eb(>85nI) zakazx8|IbIY~>d+k7Qs@rj?KR$g}I<(1T*3B%8yXEpLLF3S^A!EC?j(H{9;nwpacHZJzsJ@&U9t52Uzyx+D6T_M^Rd z9Jc5u&!P&J0h#CWsP3s1`88Dykh9?dqzbN^ln^v&Hp))KY5RI zP3NP{+2H+70P05<)u(a;p`fJhWG-G5$h3w;ZT;7J9Uh=OXSfoMVHz8jGP;M$d*9p*o7PFkTcophMWy};MwSoglF_)YD?}biB}Vz^NITso{0$X z4+cZOB`>dLcPHyJdO4wgnU|MR&U|z-d@y{O`K&bY&B%d~3kI~58zVq6wr}ugBx7!-aoEPR zUL(Jq*K?F)^Qk)e`u*OPFA!%O*tieKoF0jy*;L}o^QKSWr^xGb!Y}vWq|eCX`N|I> zX74wI{LCG7W4b|@UL`k8_Pwq2aU8k9G>&{DZ(`sOXK5gQSGacXCU!b}*S6BP9tRH0 z-EZjinh-indtyA|OON}Un|?-c0_@gVt@%&J607!146r-S-0uC5Dctz&-S;072g{?T zF*-M%ze)(R8hd5?8+RX$_W(PvN$to!0?<2VQDt385a ze#@h$!IA+nylJz>QE%8vzjMf_pP2ina2&K_Ks2t=YPnXekAFBU%35n)i<*ollJvsD^B-g{j9`z0Hm%-o_%W9TTWe@^888+)^c-xIMck+faQKMz*c6jK zb1uDj9*(Y>XruvU4NJcoV>O1e=v)0CxaoHunEGck|D3VagbDm>wK3^(&pA6XtkPx1 zOEYpO{E3^scUa2b_|l)VG@Ex!i<>TUzx(*tyy@HW7qPd7@xnFVI-UOhf^GciZ_&5s z^4~Q)^=&@>m#ockI{ohock-s6nKRXgn|_y2eK)@Jm#)pVO5f2qTuvGP*h73-l{Yti zq4MV&N8_$}^-cM0{;`j;r&jWJl>g41y8xx7WIa0maRIXC)cyPSp&aeOmu2?Sud(u1 zvWLH^tG|RNPK;x{z;Udl=lIwB8d3Jd3V*ijkMFQaFko#OM4ns7ruhCPp%rNAn9H@^9<4_ z-+<9cH~IT5v&fo5Pa&ze`mU|C$unFlXcjjud-vnde+je4TdswYH06oizTdbtwNv=g zC(oVjpJw$#82jYL4!;I*^DXDxoB9w1_cxP%g2=*U+wAeqyyK=%?z!VA*zdY^*n;Oy z*NGzvmIh%uSD3VHoo%I0#zErdy{JaMZwyawaJv4<)=$*ImH&u+KXWkc=R(s*nx2mu zeS1dyB5ONV9ADH~wZ!ql~R=du)hoQk&_UKr;^CSK;uir?67%Lq;^%$pR@ zll`r|YqDSGn?6BnnfSP8Zu~9n!ob{J`rcOU4|ZDZeFFzze0KN4WXEr#-S;?8@86#t zCv)97AbJe8>v-py5MS@H6K6v9q$QB%H_|AZoKgKO+H|Bni~B^?f4<@)tM#IAE%f}Z z1I9Km?KZYtB4S6w_MOfCsid89`rrxJGG&@o+~#&$j&3tUH*>~1QV~;6>fA3GI=mYK zz5xSq{}jtM64MSM=X3kMhW*pSVB3uTuyTD8yIpXGiI+KJ+!ajx#&f6+zRuliRsUzl zPp;3LIslnDR(pz+F!3^HTr2vfMf}*-wB@tNjsJ3~OnUs_he zmP_;X)(OULWQKNfb`(EfyQsLr+7~gYr1~B^Ze#p5liaOm_|hwYkzE4YTXwGWfEep&hRy|Gha(DnsD>g@%ODvb8t)}O-CCS$!l zZWY#%kF~5-i*;q|{27|Mm)$NQbr9wtzCzcZJuoM6>l(I$R+!g6GS`dazaZ_Brw!

ol&v!0pbHjkGtsBcQlsT;+OpWK_) z{js~=4ZB`tY*(=Te=_Qy#HBZc*ovEZhU@D54##lUGP2>G+3}O>q-j-TEi}SMZhRWp zwa-i%9FX(i#kA`iv2%if8)ya zhiBIQ1IC{ieRvg)O;!}*nlcH7n42P$@2*f|`3+`jFSv!r6u>dC$vFPi7RR`L;Z^DN zidVkZOM(s(mV86LC2^3rjB#Szq#j0whhD?OTn}?nqFuZ9e;vm_{)kaH^?UQ};Qzz< z!dtPdY{GJ#99!q~N_OZIhI?rJ8pjA$;&;Ze7*f`n>ji$v^*N*aF5hnm`n4@$+WQ8F zWBB{z8}`9`zxu-nrd+{0Hsd4YjC4bb7BJWGq<;I~Q++j6S1aM@lgB zJ#3%W_tB~^k_Iqw5MRhHxLz=`S7KEBSo7R6Qtn+odj^gyOMzX6-mrdoOmn%Kqo2Wi zkG{BznKCXk$#NeZcDcE3Cwt$U)CJ7<=!?9P`TnESg%)Ka`}+;(56kq~&fhj=gT3!< zm3wnaADH{#u&i6oe9xwTNXmSuu(7|z-G`51`sF9)@6lG9=_m3d<(A*H8SvqO#gJaQ z10J({D<4-i!on@s2ekytlV;!BCiKxZ%kTa1Q$hysU1+fuA@Obe{OTdt^7#Xp5Puco z(q6RK^wo7uaR+M#G4zu&+VDZP{CpU@G-|BbkMKckMngFJTjn~laMk}qd$S4;^Ll{H z_h{1^<7YknEM_j)%)d+=*)P!|Key3Ez&q_ hz~1A>IL2Q2ikDaZOI}`vHntD)j)Wm$$v5QN{|~PZ9Vq|+ literal 102134 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 H688T9&?`5g From 34687049b1b09ddcaff2efa14d42ae17121c1ad1 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Sat, 29 Oct 2022 16:15:34 +0200 Subject: [PATCH 29/37] Merge pull request #338 from Scrumplex/fix-credits-1 --- launcher/ui/dialogs/AboutDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/dialogs/AboutDialog.cpp b/launcher/ui/dialogs/AboutDialog.cpp index cecda1df..52d6baef 100644 --- a/launcher/ui/dialogs/AboutDialog.cpp +++ b/launcher/ui/dialogs/AboutDialog.cpp @@ -97,7 +97,7 @@ QString getCreditsHtml() stream << "
\n"; stream << "

" << QObject::tr("With thanks to", "About Credits") << "

\n"; - stream << QString("

Boba %1

\n") .arg(getWebsite("https://cmdplusv.neocities.org/")); + stream << QString("

Boba %1

\n") .arg(getWebsite("https://bobaonline.neocities.org/")); stream << QString("

Davi Rafael %1

\n") .arg(getWebsite("https://auti.one/")); stream << QString("

Fulmine %1

\n") .arg(getWebsite("https://www.fulmine.xyz/")); stream << QString("

ely %1

\n") .arg(getGitHub("elyrodso")); From 392bf7a97bd52b02d06d1d2fb77f3e0970b4a4ea Mon Sep 17 00:00:00 2001 From: txtsd Date: Sun, 30 Oct 2022 01:51:14 +0530 Subject: [PATCH 30/37] Merge pull request #342 from fn2006/prism-svg-fix --- buildconfig/BuildConfig.cpp.in | 1 + buildconfig/BuildConfig.h | 1 + launcher/Application.cpp | 2 +- program_info/CMakeLists.txt | 7 ++++--- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index b8fa5133..1262ce8e 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -49,6 +49,7 @@ Config::Config() LAUNCHER_CONFIGFILE = "@Launcher_ConfigFile@"; LAUNCHER_GIT = "@Launcher_Git@"; LAUNCHER_DESKTOPFILENAME = "@Launcher_DesktopFileName@"; + LAUNCHER_SVGFILENAME = "@Launcher_SVGFileName@"; USER_AGENT = "@Launcher_UserAgent@"; USER_AGENT_UNCACHED = USER_AGENT + " (Uncached)"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 13ccdaa1..4a309073 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -51,6 +51,7 @@ class Config { QString LAUNCHER_CONFIGFILE; QString LAUNCHER_GIT; QString LAUNCHER_DESKTOPFILENAME; + QString LAUNCHER_SVGFILENAME; /// The major version number. int VERSION_MAJOR; diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 97f757f7..18d92389 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1165,7 +1165,7 @@ void Application::setIconTheme(const QString& name) QIcon Application::getThemedIcon(const QString& name) { if(name == "logo") { - return QIcon(":/org.prismlauncher.PrismLauncher.svg"); // FIXME: Make this a BuildConfig variable + return QIcon(":/" + BuildConfig.LAUNCHER_SVGFILENAME); } return QIcon::fromTheme(name); } diff --git a/program_info/CMakeLists.txt b/program_info/CMakeLists.txt index 61949e13..f064e098 100644 --- a/program_info/CMakeLists.txt +++ b/program_info/CMakeLists.txt @@ -21,11 +21,12 @@ set(Launcher_Domain "prismlauncher.org" PARENT_SCOPE) set(Launcher_UserAgent "${Launcher_CommonName}/${Launcher_VERSION_NAME}" PARENT_SCOPE) set(Launcher_ConfigFile "prismlauncher.cfg" PARENT_SCOPE) set(Launcher_Git "https://github.com/PrismLauncher/PrismLauncher" PARENT_SCOPE) -set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_DesktopFileName "org.prismlauncher.PrismLauncher.desktop") +set(Launcher_SVGFileName "org.prismlauncher.PrismLauncher.svg") -set(Launcher_Desktop "program_info/org.prismlauncher.PrismLauncher.desktop" PARENT_SCOPE) +set(Launcher_Desktop "program_info/${Launcher_DesktopFileName}" PARENT_SCOPE) set(Launcher_MetaInfo "program_info/org.prismlauncher.PrismLauncher.metainfo.xml" PARENT_SCOPE) -set(Launcher_SVG "program_info/org.prismlauncher.PrismLauncher.svg" PARENT_SCOPE) +set(Launcher_SVG "program_info/${Launcher_SVGFileName}" PARENT_SCOPE) set(Launcher_Branding_ICNS "program_info/prismlauncher.icns" PARENT_SCOPE) set(Launcher_Branding_ICO "program_info/prismlauncher.ico") set(Launcher_Branding_ICO "${Launcher_Branding_ICO}" PARENT_SCOPE) From a4ba8d8288673982e59bd542586282e5c072671b Mon Sep 17 00:00:00 2001 From: flow Date: Sun, 30 Oct 2022 16:52:36 -0700 Subject: [PATCH 31/37] Merge pull request #353 from FayneAldan/accounts-consistency --- launcher/ui/MainWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index 0fab0202..eac8fa48 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -527,7 +527,7 @@ public: menuBar->addMenu(foldersMenu); - profileMenu = menuBar->addMenu(tr("&Profiles")); + profileMenu = menuBar->addMenu(tr("&Accounts")); profileMenu->setSeparatorsCollapsible(false); profileMenu->addAction(actionManageAccounts); @@ -1032,7 +1032,7 @@ void MainWindow::retranslateUi() accountMenuButton->setText(profileLabel); } else { - accountMenuButton->setText(tr("Profiles")); + accountMenuButton->setText(tr("Accounts")); } if (m_selectedInstance) { @@ -1375,7 +1375,7 @@ void MainWindow::defaultAccountChanged() // Set the icon to the "no account" icon. accountMenuButton->setIcon(APPLICATION->getThemedIcon("noaccount")); - accountMenuButton->setText(tr("Profiles")); + accountMenuButton->setText(tr("Accounts")); } bool MainWindow::eventFilter(QObject *obj, QEvent *ev) From 664d4e701ee6cb47b1effdccfc8513585c980a69 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Mon, 31 Oct 2022 07:51:13 +0100 Subject: [PATCH 32/37] Merge pull request #352 from TheLastRar/Win-setDarkWinTitlebar-10OrGreater --- launcher/Application.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 18d92389..1d422549 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -62,6 +62,7 @@ #ifdef Q_OS_WIN #include "ui/WinDarkmode.h" +#include #endif #include "ui/setupwizard/SetupWizard.h" @@ -1142,7 +1143,7 @@ void Application::setApplicationTheme(const QString& name, bool initial) auto & theme = (*themeIter).second; theme->apply(initial); #ifdef Q_OS_WIN - if (m_mainWindow) { + if (m_mainWindow && IsWindows10OrGreater()) { if (QString::compare(theme->id(), "dark") == 0) { WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); } else { @@ -1383,10 +1384,13 @@ MainWindow* Application::showMainWindow(bool minimized) m_mainWindow->restoreState(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowState").toByteArray())); m_mainWindow->restoreGeometry(QByteArray::fromBase64(APPLICATION->settings()->get("MainWindowGeometry").toByteArray())); #ifdef Q_OS_WIN - if (QString::compare(settings()->get("ApplicationTheme").toString(), "dark") == 0) { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); - } else { - WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + if (IsWindows10OrGreater()) + { + if (QString::compare(settings()->get("ApplicationTheme").toString(), "dark") == 0) { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), true); + } else { + WinDarkmode::setDarkWinTitlebar(m_mainWindow->winId(), false); + } } #endif if(minimized) From 7a5a4de6eaeafc6894ec9ecc0e394435a751c41c Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Mon, 31 Oct 2022 08:43:43 +0100 Subject: [PATCH 33/37] Merge pull request #354 from Scrumplex/translations-maybe Improve display names of certain languages --- launcher/translations/TranslationsModel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/launcher/translations/TranslationsModel.cpp b/launcher/translations/TranslationsModel.cpp index 2f57de3a..20aa6d04 100644 --- a/launcher/translations/TranslationsModel.cpp +++ b/launcher/translations/TranslationsModel.cpp @@ -83,6 +83,12 @@ struct Language else if(key == "es_UY") { result = u8"español de Latinoamérica"; } + else if(key == "en@pirate") { + result = u8"Tongue of the High Seas"; + } + else if(key == "en@uwu") { + result = u8"Cute Engwish"; + } else { result = locale.nativeLanguageName(); } From 63a3dd19192021a4ee80ae9b7c5d0048b6c7e99c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Mon, 31 Oct 2022 22:56:07 +0100 Subject: [PATCH 34/37] Merge pull request #351 from Scrumplex/fix-trash --- launcher/Application.cpp | 9 --------- launcher/Application.h | 2 -- launcher/DesktopServices.cpp | 19 ++++++++++++++----- launcher/DesktopServices.h | 2 ++ launcher/FileSystem.cpp | 4 ++++ launcher/ui/MainWindow.cpp | 12 +++++------- launcher/ui/pages/global/LauncherPage.cpp | 3 ++- 7 files changed, 27 insertions(+), 24 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index 1d422549..59ba469f 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1125,15 +1125,6 @@ std::vector Application::getValidApplicationThemes() return ret; } -bool Application::isFlatpak() -{ - #ifdef Q_OS_LINUX - return QFile::exists("/.flatpak-info"); - #else - return false; - #endif -} - void Application::setApplicationTheme(const QString& name, bool initial) { auto systemPalette = qApp->palette(); diff --git a/launcher/Application.h b/launcher/Application.h index 34ad8c15..c674c41d 100644 --- a/launcher/Application.h +++ b/launcher/Application.h @@ -116,8 +116,6 @@ public: QIcon getThemedIcon(const QString& name); - bool isFlatpak(); - void setIconTheme(const QString& name); std::vector getValidApplicationThemes(); diff --git a/launcher/DesktopServices.cpp b/launcher/DesktopServices.cpp index c29cbe7d..302eaf96 100644 --- a/launcher/DesktopServices.cpp +++ b/launcher/DesktopServices.cpp @@ -119,7 +119,7 @@ bool openDirectory(const QString &path, bool ensureExists) return QDesktopServices::openUrl(QUrl::fromLocalFile(dir.absolutePath())); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -140,7 +140,7 @@ bool openFile(const QString &path) return QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -158,7 +158,7 @@ bool openFile(const QString &application, const QString &path, const QString &wo 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(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen([&]() { @@ -178,7 +178,7 @@ bool run(const QString &application, const QStringList &args, const QString &wor { qDebug() << "Running" << application << "with args" << args.join(' '); #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { // FIXME: the pid here is fake. So if something depends on it, it will likely misbehave return IndirectOpen([&]() @@ -203,7 +203,7 @@ bool openUrl(const QUrl &url) return QDesktopServices::openUrl(url); }; #if defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) - if(!APPLICATION->isFlatpak()) + if(!isFlatpak()) { return IndirectOpen(f); } @@ -216,4 +216,13 @@ bool openUrl(const QUrl &url) #endif } +bool isFlatpak() +{ +#ifdef Q_OS_LINUX + return QFile::exists("/.flatpak-info"); +#else + return false; +#endif +} + } diff --git a/launcher/DesktopServices.h b/launcher/DesktopServices.h index 1c081da4..21c9cae0 100644 --- a/launcher/DesktopServices.h +++ b/launcher/DesktopServices.h @@ -33,4 +33,6 @@ namespace DesktopServices * Open the URL, most likely in a browser. Maybe. */ bool openUrl(const QUrl &url); + + bool isFlatpak(); } diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index 76cfccb0..aaa75e6f 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -44,6 +44,7 @@ #include #include #include +#include "DesktopServices.h" #if defined Q_OS_WIN32 #include @@ -228,6 +229,9 @@ bool trash(QString path, QString *pathInTrash = nullptr) #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) return false; #else + // FIXME: Figure out trash in Flatpak. Qt seemingly doesn't use the Trash portal + if (DesktopServices::isFlatpak()) + return false; return QFile::moveToTrash(path, pathInTrash); #endif } diff --git a/launcher/ui/MainWindow.cpp b/launcher/ui/MainWindow.cpp index eac8fa48..6fd50d33 100644 --- a/launcher/ui/MainWindow.cpp +++ b/launcher/ui/MainWindow.cpp @@ -335,11 +335,10 @@ public: all_actions.append(&actionSettings); actionUndoTrashInstance = TranslatedAction(MainWindow); - connect(actionUndoTrashInstance, SIGNAL(triggered(bool)), MainWindow, SLOT(undoTrashInstance())); actionUndoTrashInstance->setObjectName(QStringLiteral("actionUndoTrashInstance")); actionUndoTrashInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "&Undo Last Instance Deletion")); actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); - actionUndoTrashInstance->setShortcut(QKeySequence("Ctrl+Z")); + actionUndoTrashInstance->setShortcut(QKeySequence::Undo); all_actions.append(&actionUndoTrashInstance); actionClearMetadata = TranslatedAction(MainWindow); @@ -1003,6 +1002,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow } } + connect(ui->actionUndoTrashInstance.operator->(), &QAction::triggered, this, &MainWindow::undoTrashInstance); + setSelectedInstanceById(APPLICATION->settings()->get("SelectedInstance").toString()); // removing this looks stupid @@ -1114,11 +1115,6 @@ void MainWindow::showInstanceContextMenu(const QPoint &pos) connect(actionDeleteGroup, SIGNAL(triggered(bool)), SLOT(deleteGroup())); actions.append(actionDeleteGroup); } - - QAction *actionUndoTrashInstance = new QAction("Undo last trash instance", this); - connect(actionUndoTrashInstance, SIGNAL(triggered(bool)), SLOT(undoTrashInstance())); - actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); - actions.append(actionUndoTrashInstance); } QMenu myMenu; myMenu.addActions(actions); @@ -1814,6 +1810,7 @@ void MainWindow::deleteGroup() void MainWindow::undoTrashInstance() { APPLICATION->instances()->undoTrashInstance(); + ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); } void MainWindow::on_actionViewInstanceFolder_triggered() @@ -1920,6 +1917,7 @@ void MainWindow::on_actionDeleteInstance_triggered() auto id = m_selectedInstance->id(); if (APPLICATION->instances()->trashInstance(id)) { + ui->actionUndoTrashInstance->setEnabled(APPLICATION->instances()->trashedSomething()); return; } diff --git a/launcher/ui/pages/global/LauncherPage.cpp b/launcher/ui/pages/global/LauncherPage.cpp index b8431e8c..ad00b7d3 100644 --- a/launcher/ui/pages/global/LauncherPage.cpp +++ b/launcher/ui/pages/global/LauncherPage.cpp @@ -49,6 +49,7 @@ #include #include "Application.h" #include "BuildConfig.h" +#include "DesktopServices.h" #include "ui/themes/ITheme.h" #include @@ -143,7 +144,7 @@ void LauncherPage::on_instDirBrowseBtn_clicked() ui->instDirTextBox->setText(cooked_dir); } } - else if(APPLICATION->isFlatpak() && raw_dir.startsWith("/run/user")) + else if(DesktopServices::isFlatpak() && raw_dir.startsWith("/run/user")) { QMessageBox warning; warning.setText(tr("You're trying to specify an instance folder " From a39390b8b44ed40acfd15e7b8d3ff7e7af6b48c8 Mon Sep 17 00:00:00 2001 From: DioEgizio <83089242+DioEgizio@users.noreply.github.com> Date: Tue, 1 Nov 2022 08:17:14 +0100 Subject: [PATCH 35/37] Merge pull request #359 from Chrono-byte/develop --- launcher/ui/pages/global/APIPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher/ui/pages/global/APIPage.ui b/launcher/ui/pages/global/APIPage.ui index 1ae788c7..d56a9ef6 100644 --- a/launcher/ui/pages/global/APIPage.ui +++ b/launcher/ui/pages/global/APIPage.ui @@ -179,7 +179,7 @@ - Enter a custom client ID for Microsoft Authentication here. + Enter a custom client ID for Microsoft Authentication here. Qt::RichText From 7f6515dbe4609b3981ecc3fd9a9ced5d67306e20 Mon Sep 17 00:00:00 2001 From: timoreo Date: Tue, 1 Nov 2022 09:55:43 +0100 Subject: [PATCH 36/37] Merge pull request #329 from flowln/only_safe_workarounds --- .../modplatform/flame/FileResolvingTask.cpp | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/launcher/modplatform/flame/FileResolvingTask.cpp b/launcher/modplatform/flame/FileResolvingTask.cpp index c50abb8f..25b56fbd 100644 --- a/launcher/modplatform/flame/FileResolvingTask.cpp +++ b/launcher/modplatform/flame/FileResolvingTask.cpp @@ -3,6 +3,8 @@ #include "Json.h" #include "net/Upload.h" +#include "modplatform/modrinth/ModrinthPackIndex.h" + Flame::FileResolvingTask::FileResolvingTask(const shared_qobject_ptr& network, Flame::Manifest& toProcess) : m_network(network), m_toProcess(toProcess) {} @@ -84,18 +86,21 @@ void Flame::FileResolvingTask::modrinthCheckFinished() { delete bytes; continue; } + QJsonDocument doc = QJsonDocument::fromJson(*bytes); auto obj = doc.object(); - auto array = Json::requireArray(obj,"files"); - for (auto file: array) { - auto fileObj = Json::requireObject(file); - auto primary = Json::requireBoolean(fileObj,"primary"); - if (primary) { - out->url = Json::requireUrl(fileObj,"url"); - qDebug() << "Found alternative on modrinth " << out->fileName; - break; - } + auto file = Modrinth::loadIndexedPackVersion(obj); + + // If there's more than one mod loader for this version, we can't know for sure + // which file is relative to each loader, so it's best to not use any one and + // let the user download it manually. + if (file.loaders.size() <= 1) { + out->url = file.downloadUrl; + qDebug() << "Found alternative on modrinth " << out->fileName; + } else { + out->resolved = false; } + delete bytes; } //copy to an output list and filter out projects found on modrinth From 32b526b7296f830012b74b125add1332e43cc02b Mon Sep 17 00:00:00 2001 From: timoreo Date: Tue, 1 Nov 2022 09:56:16 +0100 Subject: [PATCH 37/37] Merge pull request #333 from flowln/fix_atl_packs_post_modpack_update --- launcher/FileSystem.cpp | 32 ++++++++++++++++++++------------ tests/FileSystem_test.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp index aaa75e6f..4026d6c1 100644 --- a/launcher/FileSystem.cpp +++ b/launcher/FileSystem.cpp @@ -183,6 +183,21 @@ bool copy::operator()(const QString& offset) if (!m_followSymlinks) opt |= copy_opts::copy_symlinks; + // Function that'll do the actual copying + auto copy_file = [&](QString src_path, QString relative_dst_path) { + if (m_blacklist && m_blacklist->matches(relative_dst_path)) + return; + + auto dst_path = PathCombine(dst, relative_dst_path); + ensureFilePathExists(dst_path); + + fs::copy(toStdString(src_path), toStdString(dst_path), opt, err); + if (err) { + qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); + qDebug() << "Source file:" << src_path; + qDebug() << "Destination file:" << dst_path; + } + }; // We can't use copy_opts::recursive because we need to take into account the // blacklisted paths, so we iterate over the source directory, and if there's no blacklist @@ -194,20 +209,13 @@ bool copy::operator()(const QString& offset) auto src_path = source_it.next(); auto relative_path = src_dir.relativeFilePath(src_path); - if (m_blacklist && m_blacklist->matches(relative_path)) - continue; - - auto dst_path = PathCombine(dst, relative_path); - ensureFilePathExists(dst_path); - - fs::copy(toStdString(src_path), toStdString(dst_path), opt, err); - if (err) { - qWarning() << "Failed to copy files:" << QString::fromStdString(err.message()); - qDebug() << "Source file:" << src_path; - qDebug() << "Destination file:" << dst_path; - } + copy_file(src_path, relative_path); } + // If the root src is not a directory, the previous iterator won't run. + if (!fs::is_directory(toStdString(src))) + copy_file(src, ""); + return err.value() == 0; } diff --git a/tests/FileSystem_test.cpp b/tests/FileSystem_test.cpp index 47a963b0..21270f6f 100644 --- a/tests/FileSystem_test.cpp +++ b/tests/FileSystem_test.cpp @@ -183,6 +183,32 @@ slots: f(); } + void test_copy_single_file() + { + QTemporaryDir tempDir; + tempDir.setAutoRemove(true); + + { + QString file = QFINDTESTDATA("testdata/FileSystem/test_folder/pack.mcmeta"); + + qDebug() << "From:" << file << "To:" << tempDir.path(); + + QDir target_dir(FS::PathCombine(tempDir.path(), "pack.mcmeta")); + qDebug() << tempDir.path(); + qDebug() << target_dir.path(); + FS::copy c(file, target_dir.filePath("pack.mcmeta")); + c(); + + auto filter = QDir::Filter::Files; + + for (auto entry: target_dir.entryList(filter)) { + qDebug() << entry; + } + + QVERIFY(target_dir.entryList(filter).contains("pack.mcmeta")); + } + } + void test_getDesktop() { QCOMPARE(FS::getDesktopDir(), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));