diff --git a/src/glib-main-loop.cpp b/src/glib-main-loop.cpp index 4fcc0b5..520eed1 100644 --- a/src/glib-main-loop.cpp +++ b/src/glib-main-loop.cpp @@ -14,6 +14,15 @@ static gboolean on_wayland_fd_event(gint fd, GIOCondition condition, gpointer user_data); +static int glib_signal_handler(gpointer raw_glib_loop) +{ + wf::core_shutdown_signal ev; + Glib::RefPtr g_loop = Glib::wrap((GMainLoop*)raw_glib_loop); + g_loop->quit(); + wf::get_core().emit(&ev); + return G_SOURCE_REMOVE; +} + namespace wf { class glib_main_loop_t : public wf::plugin_interface_t @@ -49,6 +58,9 @@ class glib_main_loop_t : public wf::plugin_interface_t g_loop = Glib::MainLoop::create(); wf::get_core().connect(&glib_loop_run); wf::get_core().connect(&glib_loop_quit); + + g_unix_signal_add_full(G_PRIORITY_DEFAULT, SIGTERM, glib_signal_handler, g_loop.get(), NULL); + g_unix_signal_add_full(G_PRIORITY_DEFAULT, SIGINT, glib_signal_handler, g_loop.get(), NULL); } void handle_wayland_fd_in(GIOCondition flag)