citra-sdl: use the result of system.RunLoop()

If a shutdown was requested by the application, close the SDL window,
initiating the normal shutdown procedure. This causes a graceful exit
process instead of hanging.
This commit is contained in:
Ian Chamberlain 2022-08-20 20:49:59 -04:00
parent a90b0daebe
commit c634c263db
No known key found for this signature in database
GPG key ID: AE5484D09405AA60
3 changed files with 21 additions and 2 deletions

View file

@ -391,6 +391,8 @@ int main(int argc, char** argv) {
return -1; return -1;
case Core::System::ResultStatus::Success: case Core::System::ResultStatus::Success:
break; // Expected case break; // Expected case
default:
LOG_ERROR(Frontend, "Error while loading ROM: {}", system.GetStatusDetails());
} }
system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL");
@ -437,7 +439,17 @@ int main(int argc, char** argv) {
}); });
while (emu_window->IsOpen()) { while (emu_window->IsOpen()) {
system.RunLoop(); const auto result = system.RunLoop();
switch (result) {
case Core::System::ResultStatus::ShutdownRequested:
emu_window->Close();
break;
case Core::System::ResultStatus::Success:
break;
default:
LOG_ERROR(Frontend, "Error in main run loop: {}", result, system.GetStatusDetails());
}
} }
render_thread.join(); render_thread.join();

View file

@ -104,6 +104,10 @@ bool EmuWindow_SDL2::IsOpen() const {
return is_open; return is_open;
} }
void EmuWindow_SDL2::Close() {
is_open = false;
}
void EmuWindow_SDL2::OnResize() { void EmuWindow_SDL2::OnResize() {
int width, height; int width, height;
SDL_GetWindowSize(render_window, &width, &height); SDL_GetWindowSize(render_window, &width, &height);
@ -134,7 +138,7 @@ void EmuWindow_SDL2::Fullscreen() {
EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) { EmuWindow_SDL2::EmuWindow_SDL2(bool fullscreen) {
// Initialize the window // Initialize the window
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER) < 0) {
LOG_CRITICAL(Frontend, "Failed to initialize SDL2! Exiting..."); LOG_CRITICAL(Frontend, "Failed to initialize SDL2: {}! Exiting...", SDL_GetError());
exit(1); exit(1);
} }

View file

@ -46,6 +46,9 @@ public:
/// Whether the window is still open, and a close request hasn't yet been sent /// Whether the window is still open, and a close request hasn't yet been sent
bool IsOpen() const; bool IsOpen() const;
/// Close the window.
void Close();
/// Creates a new context that is shared with the current context /// Creates a new context that is shared with the current context
std::unique_ptr<GraphicsContext> CreateSharedContext() const override; std::unique_ptr<GraphicsContext> CreateSharedContext() const override;