--- n/duckstation/src/duckstation-qt/qthost.cpp 2026-07-10 08:51:51.000000000 -0000 +++ N/duckstation/src/duckstation-qt/qthost.cpp 2026-07-13 20:10:04.135102447 -0000 @@ -3684,9 +3684,6 @@ // Set theme before creating any windows. UpdateApplicationTheme(); - // Build warning. - AutoUpdaterDialog::warnAboutUnofficialBuild(); - // Setting/folder migrations. ApplyMigrations(); --- n/duckstation/src/duckstation-qt/autoupdaterdialog.h 2026-07-10 08:51:51.000000000 -0000 +++ N/duckstation/src/duckstation-qt/autoupdaterdialog.h 2026-07-13 20:14:13.996494440 -0000 @@ -38,7 +38,6 @@ static QString getTagDisplayName(const std::string_view tag); static std::string getCurrentUpdateTag(); static void cleanupAfterUpdate(); - static void warnAboutUnofficialBuild(); Q_SIGNALS: /// Emitted just before the update check finishes, before any messages are displayed. --- n/duckstation/src/duckstation-qt/autoupdaterdialog.cpp 2026-07-10 08:51:51.000000000 -0000 +++ N/duckstation/src/duckstation-qt/autoupdaterdialog.cpp 2026-07-13 20:19:44.425931670 -0000 @@ -131,123 +131,6 @@ HTTPDownloader::CancelRequestsForOwner(this); } -void AutoUpdaterDialog::warnAboutUnofficialBuild() -{ - // - // To those distributing their own builds or packages of DuckStation, and seeing this message: - // - // DuckStation is licensed under the CC-BY-NC-ND-4.0 license. - // - // This means that you do NOT have permission to re-distribute your own modified builds of DuckStation. - // Modifying DuckStation for personal use is fine, but you cannot distribute builds with your changes. - // As per the CC-BY-NC-ND conditions, you can re-distribute the official builds from https://www.duckstation.org/ and - // https://github.com/stenzek/duckstation, so long as they are left intact, without modification. I welcome and - // appreciate any pull requests made to the official repository at https://github.com/stenzek/duckstation. - // - // I made the decision to switch to a no-derivatives license because of numerous "forks" that were created purely for - // generating money for the person who knocked it off, and always died, leaving the community with multiple builds to - // choose from, most of which were out of date and broken, and endless confusion. Other forks copy/pasted upstream - // changes without attribution, violating copyright. - // - // Thanks, and I hope you understand. - // - -#if !__has_include("scmversion/tag.h") || !UPDATER_RELEASE_IS_OFFICIAL - constexpr const char* CONFIG_SECTION = "UI"; - constexpr const char* CONFIG_KEY = "UnofficialBuildWarningConfirmed"; - if ( -#if !defined(_WIN32) && !defined(__APPLE__) - EmuFolders::AppRoot.starts_with("/home") && // Devbuilds should be in home directory. -#endif - Core::GetBaseBoolSettingValue(CONFIG_SECTION, CONFIG_KEY, false)) - { - return; - } - - constexpr int DELAY_SECONDS = 10; - - const QString message = - QStringLiteral("
If you are a developer and using a local build, you can check the box below and continue.
" - "Otherwise, you should delete this build and download an official release from " - "duckstation.org.
Do you want to exit and " - "open this page now?
"); - - QMessageBox mbox; - mbox.setIcon(QMessageBox::Warning); - mbox.setWindowTitle(QStringLiteral("Unofficial Build Warning")); - mbox.setWindowIcon(QtHost::GetAppIcon()); - mbox.setWindowFlag(Qt::CustomizeWindowHint, true); - mbox.setWindowFlag(Qt::WindowCloseButtonHint, false); - mbox.setTextFormat(Qt::RichText); - mbox.setText(message); - - mbox.addButton(QMessageBox::Yes); - QPushButton* no = mbox.addButton(QMessageBox::No); - const QString orig_no_text = no->text(); - no->setEnabled(false); - - QCheckBox* cb = new QCheckBox(&mbox); - cb->setText(tr("Do not show again")); - mbox.setCheckBox(cb); - - int remaining_time = DELAY_SECONDS; - no->setText(QStringLiteral("%1 [%2]").arg(orig_no_text).arg(remaining_time)); - - QTimer* timer = new QTimer(&mbox); - connect(timer, &QTimer::timeout, &mbox, [no, timer, &remaining_time, &orig_no_text]() { - remaining_time--; - if (remaining_time == 0) - { - no->setText(orig_no_text); - no->setEnabled(true); - timer->stop(); - } - else - { - no->setText(QStringLiteral("%1 [%2]").arg(orig_no_text).arg(remaining_time)); - } - }); - timer->start(1000); - - class EventFilterObj final : public QObject - { - public: - EventFilterObj(int& remaining_time) : m_remaining_time(remaining_time) {} - - bool eventFilter(QObject* watched, QEvent* event) override - { - if (event->type() == QEvent::Close && m_remaining_time > 0) - { - event->ignore(); - return true; - } - - return QObject::eventFilter(watched, event); - } - - private: - int& m_remaining_time; - }; - - EventFilterObj event_filter(remaining_time); - mbox.installEventFilter(&event_filter); - const int res = mbox.exec(); - mbox.removeEventFilter(&event_filter); - - if (res == QMessageBox::Yes) - { - QtUtils::OpenURL(nullptr, "https://duckstation.org/"); - QMetaObject::invokeMethod(qApp, &QApplication::quit, Qt::QueuedConnection); - return; - } - - if (cb->isChecked()) - Core::SetBaseBoolSettingValue(CONFIG_SECTION, CONFIG_KEY, true); -#endif -} - std::vector