[nautilus] file-undo-manager: initialize singleton explicitly



commit bcf88a7a341e1771025f7d792d5a193a88ec7a6c
Author: Ernestas Kulik <ernestask src gnome org>
Date:   Mon Jul 25 14:42:38 2016 +0300

    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(-)
---
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index ab27ab7..675cfd3 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 e3e915f..6db605e 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 a5e21d7..255f86c 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]