diff --git a/src/core/mutter.c b/src/core/mutter.c index 9d716014a..01041e734 100644 --- a/src/core/mutter.c +++ b/src/core/mutter.c @@ -21,6 +21,7 @@ #include #include +#include #include #include "compositor/meta-plugin-manager.h" @@ -56,6 +57,37 @@ GOptionEntry mutter_options[] = { { NULL } }; + +static gboolean +on_sigterm (gpointer user_data) +{ + MetaContext *context = META_CONTEXT (user_data); + + meta_context_terminate (context); + + return G_SOURCE_REMOVE; +} + +static void +init_signal_handlers (MetaContext *context) +{ + struct sigaction act = { 0 }; + sigset_t empty_mask; + + sigemptyset (&empty_mask); + act.sa_handler = SIG_IGN; + act.sa_mask = empty_mask; + act.sa_flags = 0; + if (sigaction (SIGPIPE, &act, NULL) < 0) + g_warning ("Failed to register SIGPIPE handler: %s", g_strerror (errno)); +#ifdef SIGXFSZ + if (sigaction (SIGXFSZ, &act, NULL) < 0) + g_warning ("Failed to register SIGXFSZ handler: %s", g_strerror (errno)); +#endif + + g_unix_signal_add (SIGTERM, on_sigterm, context); +} + int main (int argc, char **argv) { @@ -73,6 +105,8 @@ main (int argc, char **argv) meta_context_set_plugin_name (context, plugin); + init_signal_handlers (context); + if (!meta_context_setup (context, &error)) { g_printerr ("Failed to setup: %s", error->message);