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:
parent
a90b0daebe
commit
c634c263db
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Reference in New Issue