diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 94ef20e9fd..73a58c5b51 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3087,6 +3087,18 @@ bool GUI_App::on_init_inner() d->EndModal(wxID_ABORT); }); +#ifdef __APPLE__ + // A quit request from the Dock, a logout or a restart ends with AppKit calling exit() right after this event, so + // OnExit() and ~GUI_App() never run. Shut the plugins and Python down here as ~GUI_App() does. Left to + // PluginManager's static destructor, the shutdown locks hook state that has already been destroyed and aborts. + wxGetApp().Bind(wxEVT_END_SESSION, [](wxCloseEvent &e) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "received wxEVT_END_SESSION"; + Slic3r::PluginManager::instance().shutdown(); + Slic3r::PythonInterpreter::instance().shutdown(); + e.Skip(); + }); +#endif + // Verify resources path const wxString resources_dir = from_u8(Slic3r::resources_dir()); wxCHECK_MSG(wxDirExists(resources_dir), false,