diff --git a/src/xenia/kernel/xam/xam_nui.cc b/src/xenia/kernel/xam/xam_nui.cc index 90123d12b..f8655d7ee 100644 --- a/src/xenia/kernel/xam/xam_nui.cc +++ b/src/xenia/kernel/xam/xam_nui.cc @@ -12,12 +12,16 @@ #include "xenia/kernel/kernel_state.h" #include "xenia/kernel/util/shim_utils.h" #include "xenia/kernel/xam/xam_private.h" +#include "xenia/ui/imgui_dialog.h" +#include "xenia/ui/window.h" #include "xenia/xbox.h" namespace xe { namespace kernel { namespace xam { +extern std::atomic xam_dialogs_shown_; + struct X_NUI_DEVICE_STATUS { xe::be unk0; xe::be unk1; @@ -34,6 +38,31 @@ void XamNuiGetDeviceStatus(pointer_t status_ptr) { } DECLARE_XAM_EXPORT(XamNuiGetDeviceStatus, ExportTag::kStub); +dword_result_t XamShowNuiTroubleshooterUI(unknown_t unk1, unknown_t unk2, + unknown_t unk3) { + // unk1 is 0xFF - possibly user index? + // unk2, unk3 appear to always be zero. + + if (FLAGS_headless) { + return 0; + } + + auto display_window = kernel_state()->emulator()->display_window(); + xe::threading::Fence fence; + display_window->loop()->PostSynchronous([&]() { + xe::ui::ImGuiDialog::ShowMessageBox( + display_window, "NUI Troubleshooter", + "The game has indicated there is a problem with NUI (Kinect).") + ->Then(&fence); + }); + ++xam_dialogs_shown_; + fence.Wait(); + --xam_dialogs_shown_; + + return 0; +} +DECLARE_XAM_EXPORT(XamShowNuiTroubleshooterUI, ExportTag::kStub); + void RegisterNuiExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) {}