diff --git a/src/calls-application.c b/src/calls-application.c index f22b448..3147926 100644 --- a/src/calls-application.c +++ b/src/calls-application.c @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -69,6 +70,8 @@ struct _CallsApplication { CallsDBusManager *dbus_manager; char *uri; + guint id_sigterm; + guint id_sigint; }; G_DEFINE_TYPE (CallsApplication, calls_application, GTK_TYPE_APPLICATION); @@ -76,6 +79,15 @@ G_DEFINE_TYPE (CallsApplication, calls_application, GTK_TYPE_APPLICATION); static void start_proper (CallsApplication *self); +static gboolean +on_int_or_term_signal (CallsApplication *self) +{ + g_debug ("Received SIGTERM/SIGINT, shutting down gracefully"); + + g_application_quit (G_APPLICATION (self)); + + return G_SOURCE_REMOVE; +} static gboolean cmd_verbose_cb (const char *option_name, @@ -659,6 +671,9 @@ finalize (GObject *object) { CallsApplication *self = (CallsApplication *) object; + g_clear_handle_id (&self->id_sigterm, g_source_remove); + g_clear_handle_id (&self->id_sigint, g_source_remove); + g_clear_object (&self->call_window); g_clear_object (&self->main_window); g_clear_object (&self->record_store); @@ -731,6 +746,12 @@ calls_application_init (CallsApplication *self) } }; + self->id_sigterm = g_unix_signal_add (SIGTERM, G_SOURCE_FUNC (on_int_or_term_signal), self); + g_source_set_name_by_id (self->id_sigterm, "signal: SIGTERM handler"); + + self->id_sigint = g_unix_signal_add (SIGINT, G_SOURCE_FUNC (on_int_or_term_signal), self); + g_source_set_name_by_id (self->id_sigint, "signal: SIGINT handler"); + g_application_add_main_option_entries (G_APPLICATION (self), options); } diff --git a/src/calls-record-store.c b/src/calls-record-store.c index b6598f1..1461682 100644 --- a/src/calls-record-store.c +++ b/src/calls-record-store.c @@ -666,7 +666,6 @@ dispose (GObject *object) g_list_store_remove_all (G_LIST_STORE (self)); g_clear_object (&self->repository); - close_adapter (self); G_OBJECT_CLASS (calls_record_store_parent_class)->dispose (object); } @@ -678,6 +677,7 @@ finalize (GObject *object) CallsRecordStore *self = CALLS_RECORD_STORE (object); g_free (self->filename); + close_adapter (self); G_OBJECT_CLASS (calls_record_store_parent_class)->finalize (object); }