diff --git a/plugins/protocols/wayfire-shell.cpp b/plugins/protocols/wayfire-shell.cpp index 3d47173d0..8f95b0c04 100644 --- a/plugins/protocols/wayfire-shell.cpp +++ b/plugins/protocols/wayfire-shell.cpp @@ -448,6 +448,11 @@ class wayfire_shell_protocol_impl : public wf::plugin_interface_t void fini() override { + if (wf::get_core().get_current_state() == wf::compositor_state_t::SHUTDOWN) + { + return; + } + wl_global_destroy(wf_shell->shell_manager); delete wf_shell; } diff --git a/src/core/opengl.cpp b/src/core/opengl.cpp index e498ef2d9..cd0cde975 100644 --- a/src/core/opengl.cpp +++ b/src/core/opengl.cpp @@ -705,7 +705,7 @@ void program_t::free_resources() { for (int i = 0; i < wf::TEXTURE_TYPE_ALL; i++) { - if (this->priv->id[i]) + if (this->priv && this->priv->id[i]) { GL_CALL(glDeleteProgram(priv->id[i])); this->priv->id[i] = 0; diff --git a/src/main.cpp b/src/main.cpp index d08453b6d..c31178b77 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -127,6 +127,16 @@ static void signal_handler(int signal) error = "Fatal error(SIGABRT)"; break; + case SIGINT: + LOGI("Got SIGINT, shutting down"); + wf::get_core().shutdown(); + return; + + case SIGTERM: + LOGI("Got SIGTERM, shutting down"); + wf::get_core().shutdown(); + return; + default: error = "Unknown"; } @@ -324,6 +334,9 @@ int main(int argc, char *argv[]) signal(SIGABRT, signal_handler); #endif + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); + std::set_terminate([] () { std::cout << "Unhandled exception" << std::endl; @@ -420,5 +433,7 @@ int main(int argc, char *argv[]) /* Teardown */ wl_display_destroy_clients(core.display); wl_display_destroy(core.display); + + LOGI("EXIT_SUCCESS"); return EXIT_SUCCESS; }