diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/core.cpp | 13 | ||||
| -rw-r--r-- | src/core/core.h | 12 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 4 |
3 files changed, 27 insertions, 2 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp index 50d5dab4b..bb268a319 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp | |||
| @@ -421,6 +421,7 @@ struct System::Impl { | |||
| 421 | bool is_async_gpu{}; | 421 | bool is_async_gpu{}; |
| 422 | 422 | ||
| 423 | ExecuteProgramCallback execute_program_callback; | 423 | ExecuteProgramCallback execute_program_callback; |
| 424 | ExitCallback exit_callback; | ||
| 424 | 425 | ||
| 425 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; | 426 | std::array<u64, Core::Hardware::NUM_CPU_CORES> dynarmic_ticks{}; |
| 426 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; | 427 | std::array<MicroProfileToken, Core::Hardware::NUM_CPU_CORES> microprofile_dynarmic{}; |
| @@ -798,6 +799,18 @@ void System::ExecuteProgram(std::size_t program_index) { | |||
| 798 | } | 799 | } |
| 799 | } | 800 | } |
| 800 | 801 | ||
| 802 | void System::RegisterExitCallback(ExitCallback&& callback) { | ||
| 803 | impl->exit_callback = std::move(callback); | ||
| 804 | } | ||
| 805 | |||
| 806 | void System::Exit() { | ||
| 807 | if (impl->exit_callback) { | ||
| 808 | impl->exit_callback(); | ||
| 809 | } else { | ||
| 810 | LOG_CRITICAL(Core, "exit_callback must be initialized by the frontend"); | ||
| 811 | } | ||
| 812 | } | ||
| 813 | |||
| 801 | void System::ApplySettings() { | 814 | void System::ApplySettings() { |
| 802 | if (IsPoweredOn()) { | 815 | if (IsPoweredOn()) { |
| 803 | Renderer().RefreshBaseSettings(); | 816 | Renderer().RefreshBaseSettings(); |
diff --git a/src/core/core.h b/src/core/core.h index 715ab88e7..a796472b2 100644 --- a/src/core/core.h +++ b/src/core/core.h | |||
| @@ -387,6 +387,18 @@ public: | |||
| 387 | */ | 387 | */ |
| 388 | void ExecuteProgram(std::size_t program_index); | 388 | void ExecuteProgram(std::size_t program_index); |
| 389 | 389 | ||
| 390 | /// Type used for the frontend to designate a callback for System to exit the application. | ||
| 391 | using ExitCallback = std::function<void()>; | ||
| 392 | |||
| 393 | /** | ||
| 394 | * Registers a callback from the frontend for System to exit the application. | ||
| 395 | * @param callback Callback from the frontend to exit the application. | ||
| 396 | */ | ||
| 397 | void RegisterExitCallback(ExitCallback&& callback); | ||
| 398 | |||
| 399 | /// Instructs the frontend to exit the application. | ||
| 400 | void Exit(); | ||
| 401 | |||
| 390 | /// Applies any changes to settings to this core instance. | 402 | /// Applies any changes to settings to this core instance. |
| 391 | void ApplySettings(); | 403 | void ApplySettings(); |
| 392 | 404 | ||
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 8c2e2f920..49e9787a4 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -332,10 +332,10 @@ ISelfController::~ISelfController() = default; | |||
| 332 | void ISelfController::Exit(Kernel::HLERequestContext& ctx) { | 332 | void ISelfController::Exit(Kernel::HLERequestContext& ctx) { |
| 333 | LOG_DEBUG(Service_AM, "called"); | 333 | LOG_DEBUG(Service_AM, "called"); |
| 334 | 334 | ||
| 335 | system.Shutdown(); | ||
| 336 | |||
| 337 | IPC::ResponseBuilder rb{ctx, 2}; | 335 | IPC::ResponseBuilder rb{ctx, 2}; |
| 338 | rb.Push(ResultSuccess); | 336 | rb.Push(ResultSuccess); |
| 337 | |||
| 338 | system.Exit(); | ||
| 339 | } | 339 | } |
| 340 | 340 | ||
| 341 | void ISelfController::LockExit(Kernel::HLERequestContext& ctx) { | 341 | void ISelfController::LockExit(Kernel::HLERequestContext& ctx) { |