From bcf88a7a341e1771025f7d792d5a193a88ec7a6c Mon Sep 17 00:00:00 2001 From: Ernestas Kulik Date: Mon, 25 Jul 2016 14:42:38 +0300 Subject: file-undo-manager: initialize singleton explicitly The current implementation leaks the NautilusFileUndoManager instance, because the code does not unref it anywhere. This commit adds a _new() function to the undo manager and makes NautilusApplication manage its lifetime. https://bugzilla.gnome.org/show_bug.cgi?id=769082 --- src/nautilus-application.c | 7 ++++++ src/nautilus-file-undo-manager.c | 53 +++++++++++++++++----------------------- src/nautilus-file-undo-manager.h | 1 + 3 files changed, 30 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/nautilus-application.c b/src/nautilus-application.c index ab27ab723..675cfd3d7 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -29,6 +29,7 @@ #include "nautilus-application.h" #include "nautilus-dbus-manager.h" +#include "nautilus-file-undo-manager.h" #include "nautilus-freedesktop-dbus.h" #include "nautilus-image-properties-page.h" #include "nautilus-previewer.h" @@ -76,6 +77,8 @@ typedef struct { GList *windows; GHashTable *notifications; + + NautilusFileUndoManager *undo_manager; } NautilusApplicationPrivate; G_DEFINE_TYPE_WITH_PRIVATE (NautilusApplication, nautilus_application, GTK_TYPE_APPLICATION); @@ -551,6 +554,8 @@ nautilus_application_finalize (GObject *object) g_hash_table_destroy (priv->notifications); + g_clear_object (&priv->undo_manager); + G_OBJECT_CLASS (nautilus_application_parent_class)->finalize (object); } @@ -956,6 +961,8 @@ nautilus_application_init (NautilusApplication *self) g_free, NULL); + priv->undo_manager = nautilus_file_undo_manager_new (); + g_application_add_main_option_entries (G_APPLICATION (self), options); nautilus_ensure_extension_points (); diff --git a/src/nautilus-file-undo-manager.c b/src/nautilus-file-undo-manager.c index e3e915fbd..6db605e0f 100644 --- a/src/nautilus-file-undo-manager.c +++ b/src/nautilus-file-undo-manager.c @@ -57,14 +57,16 @@ struct _NautilusFileUndoManagerPrivate static NautilusFileUndoManager *undo_singleton = NULL; -static NautilusFileUndoManager * -get_singleton (void) +NautilusFileUndoManager * +nautilus_file_undo_manager_new (void) { - if (undo_singleton == NULL) { - undo_singleton = g_object_new (NAUTILUS_TYPE_FILE_UNDO_MANAGER, NULL); - g_object_add_weak_pointer (G_OBJECT (undo_singleton), (gpointer) &undo_singleton); + if (undo_singleton != NULL) { + return g_object_ref (undo_singleton); } + undo_singleton = g_object_new (NAUTILUS_TYPE_FILE_UNDO_MANAGER, NULL); + g_object_add_weak_pointer (G_OBJECT (undo_singleton), (gpointer) &undo_singleton); + return undo_singleton; } @@ -198,75 +200,64 @@ do_undo_redo (NautilusFileUndoManager *self, void nautilus_file_undo_manager_redo (GtkWindow *parent_window) { - NautilusFileUndoManager *self = get_singleton (); - - if (self->priv->state != NAUTILUS_FILE_UNDO_MANAGER_STATE_REDO) { - g_warning ("Called redo, but state is %s!", self->priv->state == 0 ? + if (undo_singleton->priv->state != NAUTILUS_FILE_UNDO_MANAGER_STATE_REDO) { + g_warning ("Called redo, but state is %s!", undo_singleton->priv->state == 0 ? "none" : "undo"); return; } - do_undo_redo (self, parent_window); + do_undo_redo (undo_singleton, parent_window); } void nautilus_file_undo_manager_undo (GtkWindow *parent_window) { - NautilusFileUndoManager *self = get_singleton (); - - if (self->priv->state != NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO) { - g_warning ("Called undo, but state is %s!", self->priv->state == 0 ? + if (undo_singleton->priv->state != NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO) { + g_warning ("Called undo, but state is %s!", undo_singleton->priv->state == 0 ? "none" : "redo"); return; } - do_undo_redo (self, parent_window); + do_undo_redo (undo_singleton, parent_window); } void nautilus_file_undo_manager_set_action (NautilusFileUndoInfo *info) { - NautilusFileUndoManager *self = get_singleton (); - DEBUG ("Setting undo information %p", info); - file_undo_manager_clear (self); + file_undo_manager_clear (undo_singleton); if (info != NULL) { - self->priv->info = g_object_ref (info); - self->priv->state = NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO; - self->priv->last_state = NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE; + undo_singleton->priv->info = g_object_ref (info); + undo_singleton->priv->state = NAUTILUS_FILE_UNDO_MANAGER_STATE_UNDO; + undo_singleton->priv->last_state = NAUTILUS_FILE_UNDO_MANAGER_STATE_NONE; } - g_signal_emit (self, signals[SIGNAL_UNDO_CHANGED], 0); + g_signal_emit (undo_singleton, signals[SIGNAL_UNDO_CHANGED], 0); } NautilusFileUndoInfo * nautilus_file_undo_manager_get_action (void) { - NautilusFileUndoManager *self = get_singleton (); - - return self->priv->info; + return undo_singleton->priv->info; } NautilusFileUndoManagerState nautilus_file_undo_manager_get_state (void) { - NautilusFileUndoManager *self = get_singleton (); - - return self->priv->state; + return undo_singleton->priv->state; } gboolean nautilus_file_undo_manager_is_operating () { - NautilusFileUndoManager *self = get_singleton (); - return self->priv->is_operating; + return undo_singleton->priv->is_operating; } NautilusFileUndoManager * nautilus_file_undo_manager_get () { - return get_singleton (); + return undo_singleton; } diff --git a/src/nautilus-file-undo-manager.h b/src/nautilus-file-undo-manager.h index a5e21d796..255f86c2b 100644 --- a/src/nautilus-file-undo-manager.h +++ b/src/nautilus-file-undo-manager.h @@ -68,6 +68,7 @@ struct _NautilusFileUndoManagerClass { GType nautilus_file_undo_manager_get_type (void) G_GNUC_CONST; +NautilusFileUndoManager *nautilus_file_undo_manager_new (void); NautilusFileUndoManager * nautilus_file_undo_manager_get (void); void nautilus_file_undo_manager_set_action (NautilusFileUndoInfo *info); -- cgit v1.2.1