[nautilus] file-undo-manager: initialize singleton explicitly
- From: Ernestas Kulik <ernestask src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] file-undo-manager: initialize singleton explicitly
- Date: Mon, 25 Jul 2016 12:21:42 +0000 (UTC)
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]