From 44e1a64f3510622c1ed4650b8563990d809d11b5 Mon Sep 17 00:00:00 2001 From: Gliniak <153369+Gliniak@users.noreply.github.com> Date: Wed, 15 Jul 2026 20:05:41 +0200 Subject: [PATCH] [XAM] Extend UI delay on close. Added delay to headless after notification sent. Created thread to do async notification broadcast on close for headless. This fixes game freeze in 534407FC --- src/xenia/kernel/xam/xam_ui.cc | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/xenia/kernel/xam/xam_ui.cc b/src/xenia/kernel/xam/xam_ui.cc index 7f74f025a..510627d5c 100644 --- a/src/xenia/kernel/xam/xam_ui.cc +++ b/src/xenia/kernel/xam/xam_ui.cc @@ -34,6 +34,8 @@ DEFINE_bool(storage_selection_dialog, false, DECLARE_int32(license_mask); +constexpr std::chrono::milliseconds kUIDelayMillis(200); + namespace xe { namespace kernel { namespace xam { @@ -81,8 +83,11 @@ X_RESULT xeXamDispatchDialog(T* dialog, return result; }; auto post = []() { - xe::threading::Sleep(std::chrono::milliseconds(100)); - kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); + std::jthread t([] { + xe::threading::Sleep(kUIDelayMillis); + kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); + }); + t.detach(); }; if (!overlapped) { pre(); @@ -123,7 +128,7 @@ X_RESULT xeXamDispatchDialogEx( return result; }; auto post = []() { - xe::threading::Sleep(std::chrono::milliseconds(100)); + xe::threading::Sleep(kUIDelayMillis); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); }; if (!overlapped) { @@ -143,10 +148,15 @@ X_RESULT xeXamDispatchHeadless(std::function run_callback, uint32_t overlapped) { auto pre = []() { kernel_state()->BroadcastNotification(kXNotificationSystemUI, true); + xe::threading::Sleep(std::chrono::milliseconds(25)); }; auto post = []() { - xe::threading::Sleep(std::chrono::milliseconds(100)); - kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); + std::jthread t([]() { + xe::threading::Sleep(kUIDelayMillis); + kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); + }); + + t.detach(); }; if (!overlapped) { pre(); @@ -167,7 +177,7 @@ X_RESULT xeXamDispatchHeadlessEx( kernel_state()->BroadcastNotification(kXNotificationSystemUI, true); }; auto post = []() { - xe::threading::Sleep(std::chrono::milliseconds(100)); + xe::threading::Sleep(kUIDelayMillis); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); }; if (!overlapped) { @@ -198,7 +208,7 @@ X_RESULT xeXamDispatchDialogAsync(T* dialog, kernel_state()->xam_state()->xam_dialogs_shown_--; auto run = []() -> void { - xe::threading::Sleep(std::chrono::milliseconds(100)); + xe::threading::Sleep(kUIDelayMillis); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); }; @@ -220,7 +230,7 @@ X_RESULT xeXamDispatchHeadlessAsync(std::function run_callback) { kernel_state()->xam_state()->xam_dialogs_shown_--; auto run = []() -> void { - xe::threading::Sleep(std::chrono::milliseconds(100)); + xe::threading::Sleep(kUIDelayMillis); kernel_state()->BroadcastNotification(kXNotificationSystemUI, false); };