diff --git a/src/desktop/noo_canvas.cpp b/src/desktop/noo_canvas.cpp index ddb38eb9..6f9d7db4 100644 --- a/src/desktop/noo_canvas.cpp +++ b/src/desktop/noo_canvas.cpp @@ -70,6 +70,14 @@ NooCanvas::NooCanvas(NooFrame *frame): CANVAS_CLASS(frame, wxID_ANY, CANVAS_PARA } NooCanvas::~NooCanvas() { +#ifdef USE_GL_CANVAS + // Clean up OpenGL context to prevent crashes + if (context) { + SetCurrent(*context); + glFinish(); + delete context; + } +#endif // Free the framebuffer if it was allocated if (frame->mainFrame) delete[] framebuffer; diff --git a/src/desktop/noo_frame.cpp b/src/desktop/noo_frame.cpp index 4445123b..6ef7f04e 100644 --- a/src/desktop/noo_frame.cpp +++ b/src/desktop/noo_frame.cpp @@ -271,6 +271,19 @@ NooFrame::NooFrame(NooApp *app, int id, std::string path, NooFrame *partner): loadRomPath(path); } +NooFrame::~NooFrame() { + // Clean up joystick and timer if they exist + if (timer) { + timer->Stop(); + delete timer; + timer = nullptr; + } + if (joystick) { + delete joystick; + joystick = nullptr; + } +} + void NooFrame::Refresh() { // Override the refresh function to also update the FPS counter wxFrame::Refresh(); @@ -800,10 +813,16 @@ void NooFrame::dropFiles(wxDropFilesEvent &event) { } void NooFrame::close(wxCloseEvent &event) { - // Properly shut down the emulator + // Properly shut down the emulator and cleanup (mainFrame ? this : partner)->stopCore(true); app->removeFrame(id); canvas->finish(); - if (partner) delete partner; + + // Clean up partner frame if it exists + if (partner) { + delete partner; + partner = nullptr; + } + event.Skip(true); } diff --git a/src/desktop/noo_frame.h b/src/desktop/noo_frame.h index 956042dc..39a7ed16 100644 --- a/src/desktop/noo_frame.h +++ b/src/desktop/noo_frame.h @@ -37,6 +37,7 @@ class NooFrame: public wxFrame { bool running = false; NooFrame(NooApp *app, int id = 0, std::string path = "", NooFrame *partner = nullptr); + ~NooFrame(); void Refresh(); void startCore(bool full);