summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErnestas Kulik <ernestask@src.gnome.org>2016-07-25 14:42:38 +0300
committerErnestas Kulik <ernestask@src.gnome.org>2016-07-25 15:21:05 +0300
commitbcf88a7a341e1771025f7d792d5a193a88ec7a6c (patch)
tree4dc85392cab9be7c20e3df61a8f266267a5ba465
parent6064bdcfe5428c481bb7f854b76993fbd958ea15 (diff)
downloadnautilus-bcf88a7a341e1771025f7d792d5a193a88ec7a6c.tar.gz
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
-rw-r--r--src/nautilus-application.c7
-rw-r--r--src/nautilus-file-undo-manager.c53
-rw-r--r--src/nautilus-file-undo-manager.h1
3 files changed, 30 insertions, 31 deletions
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);