Qt: Lock system when automatic updater shows

Prevents messyness when launching in fullscreen+big picture.
This commit is contained in:
Stenzek 2025-03-08 15:22:23 +10:00
parent e25f287d60
commit 8bffd9725e
No known key found for this signature in database
2 changed files with 44 additions and 16 deletions

View File

@ -271,10 +271,33 @@ void AutoUpdaterDialog::httpPollTimerPoll()
}
}
void AutoUpdaterDialog::queueUpdateCheck(bool display_message)
void AutoUpdaterDialog::lockAndExec()
{
m_display_messages = display_message;
// pause+unfullscreen system. annoyingly, need to reparent if we were fullscreen
MainWindow::SystemLock lock = g_main_window->pauseAndLockSystem();
QWidget* prev_parent = qobject_cast<QWidget*>(parent());
const bool needs_parent_change = (prev_parent && lock.getDialogParent() != prev_parent);
if (needs_parent_change)
{
setParent(lock.getDialogParent());
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
// ensure we're at the front
QTimer::singleShot(20, Qt::TimerType::CoarseTimer, this, SLOT(raise()));
}
const int result = exec();
if (needs_parent_change)
setParent(prev_parent);
// cancel resume if we're exiting anyway
if (result)
lock.cancelResume();
}
void AutoUpdaterDialog::queueUpdateCheck(bool display_errors)
{
#ifdef UPDATE_CHECKER_SUPPORTED
if (!ensureHttpReady())
{
@ -282,8 +305,11 @@ void AutoUpdaterDialog::queueUpdateCheck(bool display_message)
return;
}
m_http->CreateRequest(LATEST_TAG_URL, std::bind(&AutoUpdaterDialog::getLatestTagComplete, this, std::placeholders::_1,
std::placeholders::_2, std::placeholders::_4));
m_http->CreateRequest(LATEST_TAG_URL,
[this, display_errors](s32 status_code, const Error& error, const std::string& content_type,
std::vector<u8> response) {
getLatestTagComplete(status_code, error, std::move(response), display_errors);
});
#else
emit updateCheckCompleted();
#endif
@ -304,7 +330,8 @@ void AutoUpdaterDialog::queueGetLatestRelease()
#endif
}
void AutoUpdaterDialog::getLatestTagComplete(s32 status_code, const Error& error, std::vector<u8> response)
void AutoUpdaterDialog::getLatestTagComplete(s32 status_code, const Error& error, std::vector<u8> response,
bool display_errors)
{
#ifdef UPDATE_CHECKER_SUPPORTED
const std::string selected_tag(getCurrentUpdateTag());
@ -337,26 +364,29 @@ void AutoUpdaterDialog::getLatestTagComplete(s32 status_code, const Error& error
}
else
{
if (m_display_messages)
if (display_errors)
{
QMessageBox::information(this, tr("Automatic Updater"),
tr("No updates are currently available. Please try again later."));
}
emit updateCheckCompleted();
return;
}
}
if (m_display_messages)
if (display_errors)
reportError(fmt::format("{} release not found in JSON", selected_tag));
}
else
{
if (m_display_messages)
if (display_errors)
reportError("JSON is not an array");
}
}
else
{
if (m_display_messages)
if (display_errors)
reportError(fmt::format("Failed to download latest tag info: {}", error.GetDescription()));
}
@ -412,7 +442,7 @@ void AutoUpdaterDialog::getLatestReleaseComplete(s32 status_code, const Error& e
queueGetChanges();
// We have to defer this, because it comes back through the timer/HTTP callback...
QMetaObject::invokeMethod(this, "exec", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "lockAndExec", Qt::QueuedConnection);
}
else
{
@ -522,8 +552,6 @@ void AutoUpdaterDialog::downloadUpdateClicked()
return;
m_ui.downloadAndInstall->setEnabled(false);
m_display_messages = true;
std::optional<bool> download_result;
QtModalProgressCallback progress(this);
progress.SetTitle(tr("Automatic Updater").toUtf8().constData());
@ -573,7 +601,7 @@ void AutoUpdaterDialog::downloadUpdateClicked()
{
// updater started. since we're a modal on the main window, we have to queue this.
QMetaObject::invokeMethod(g_main_window, "requestExit", Qt::QueuedConnection, Q_ARG(bool, true));
done(0);
done(1);
}
else
{

View File

@ -40,11 +40,12 @@ Q_SIGNALS:
void updateCheckCompleted();
public Q_SLOTS:
void queueUpdateCheck(bool display_message);
void queueUpdateCheck(bool display_errors);
void queueGetLatestRelease();
private Q_SLOTS:
void httpPollTimerPoll();
void lockAndExec();
void downloadUpdateClicked();
void skipThisUpdateClicked();
@ -58,7 +59,7 @@ private:
bool updateNeeded() const;
std::string getCurrentUpdateTag() const;
void getLatestTagComplete(s32 status_code, const Error& error, std::vector<u8> response);
void getLatestTagComplete(s32 status_code, const Error& error, std::vector<u8> response, bool display_errors);
void getLatestReleaseComplete(s32 status_code, const Error& error, std::vector<u8> response);
void queueGetChanges();
@ -80,6 +81,5 @@ private:
QString m_download_url;
int m_download_size = 0;
bool m_display_messages = false;
bool m_update_will_break_save_states = false;
};