/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2022 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #include "xenia/base/logging.h" #include "xenia/emulator.h" #include "xenia/kernel/kernel_flags.h" #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/imgui_drawer.h" #include "xenia/ui/window.h" #include "xenia/ui/windowed_app_context.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; xe::be unk2; xe::be status; xe::be unk4; xe::be unk5; }; static_assert(sizeof(X_NUI_DEVICE_STATUS) == 24, "Size matters"); void XamNuiGetDeviceStatus_entry(pointer_t status_ptr) { status_ptr.Zero(); status_ptr->status = 0; // Not connected. } DECLARE_XAM_EXPORT1(XamNuiGetDeviceStatus, kNone, kStub); // UI dword_result_t XamShowNuiTroubleshooterUI_entry(unknown_t unk1, unknown_t unk2, dword_t flag) { /* Notes: - unk1 is 0xFF - possibly user index? - unk2 appear to always be zero. - First calls XamPackageManagerGetExperienceMode and checks if the return is less than zero - If less than zero then returns error message below - else it checks if flag = 0x800000 if it does then call XamNuiGetDeviceStatus. if not return error */ if (cvars::headless) { return 0; } const Emulator* emulator = kernel_state()->emulator(); ui::Window* display_window = emulator->display_window(); ui::ImGuiDrawer* imgui_drawer = emulator->imgui_drawer(); if (display_window && imgui_drawer) { xe::threading::Fence fence; if (display_window->app_context().CallInUIThreadSynchronous([&]() { xe::ui::ImGuiDialog::ShowMessageBox( imgui_drawer, "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_EXPORT1(XamShowNuiTroubleshooterUI, kNone, kStub); dword_result_t XamShowNuiHardwareRequiredUI_entry(unknown_t unk1) { if (unk1 != 0) { return X_ERROR_INVALID_PARAMETER; } return XamShowNuiTroubleshooterUI_entry(0xff, 0, 0x400000); } DECLARE_XAM_EXPORT1(XamShowNuiHardwareRequiredUI, kNone, kImplemented); } // namespace xam } // namespace kernel } // namespace xe DECLARE_XAM_EMPTY_REGISTER_EXPORTS(NUI);