[gspell/wip/inline-checker] inline-checker: do not have reference cycles



commit 69fb2cd7ff757cae2e40980dbc11455d06727772
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Wed Jan 6 14:12:24 2016 +0100

    inline-checker: do not have reference cycles
    
    Although GtkTextView is a widget, gtk_widget_destroy() is sometimes not
    called in applications because e.g. gtk_notebook_remove_page() is called
    which does a simple g_object_unref(). Even if it is a best-practice to
    call gtk_widget_destroy() when a widget is no longer needed, it is not
    guaranteed that it is the case. So it's better to avoid ref cycles in
    the first place, when easily feasible, which is the case here.
    
    Not having ref cycles was actually a reason to not expose
    GspellInlineCheckerText. Otherwise weak references would have been
    needed, which complicates a little the code since it needs to handle the
    NULL case.

 gspell/gspell-inline-checker-text-buffer.c |    8 +++-----
 gspell/gspell-inline-checker-text.c        |    4 ++--
 2 files changed, 5 insertions(+), 7 deletions(-)
---
diff --git a/gspell/gspell-inline-checker-text-buffer.c b/gspell/gspell-inline-checker-text-buffer.c
index b4e08c2..77c8a72 100644
--- a/gspell/gspell-inline-checker-text-buffer.c
+++ b/gspell/gspell-inline-checker-text-buffer.c
@@ -2,7 +2,7 @@
  * This file is part of gspell, a spell-checking library.
  *
  * Copyright 2002 - Paolo Maggi
- * Copyright 2015 - Sébastien Wilmet
+ * Copyright 2015, 2016 - Sébastien Wilmet
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -324,7 +324,7 @@ check_visible_region (GspellInlineCheckerTextBuffer *spell)
 
        for (l = spell->views; l != NULL; l = l->next)
        {
-               GtkTextView *view = l->data;
+               GtkTextView *view = GTK_TEXT_VIEW (l->data);
                check_visible_region_in_view (spell, view);
        }
 
@@ -1077,7 +1077,7 @@ _gspell_inline_checker_text_buffer_dispose (GObject *object)
        g_clear_object (&spell->highlight_tag);
        g_clear_object (&spell->no_spell_check_tag);
 
-       g_slist_free_full (spell->views, g_object_unref);
+       g_slist_free (spell->views);
        spell->views = NULL;
 
        spell->mark_click = NULL;
@@ -1182,7 +1182,6 @@ _gspell_inline_checker_text_buffer_attach_view (GspellInlineCheckerTextBuffer *s
                                 0);
 
        spell->views = g_slist_prepend (spell->views, view);
-       g_object_ref (view);
 
        check_visible_region_in_view (spell, view);
 }
@@ -1205,7 +1204,6 @@ _gspell_inline_checker_text_buffer_detach_view (GspellInlineCheckerTextBuffer *s
        g_signal_handlers_disconnect_by_data (view, spell);
 
        spell->views = g_slist_remove (spell->views, view);
-       g_object_unref (view);
 }
 
 /* ex:set ts=8 noet: */
diff --git a/gspell/gspell-inline-checker-text.c b/gspell/gspell-inline-checker-text.c
index e461cf6..ce8ed11 100644
--- a/gspell/gspell-inline-checker-text.c
+++ b/gspell/gspell-inline-checker-text.c
@@ -85,7 +85,7 @@ set_view (GspellInlineCheckerText *self,
        g_assert (priv->view == NULL);
        g_assert (priv->inline_checker == NULL);
 
-       priv->view = g_object_ref (view);
+       priv->view = view;
 
        g_signal_connect_object (priv->view,
                                 "notify::buffer",
@@ -151,7 +151,7 @@ _gspell_inline_checker_text_dispose (GObject *object)
                                                                priv->view);
        }
 
-       g_clear_object (&priv->view);
+       priv->view = NULL;
        g_clear_object (&priv->inline_checker);
 
        G_OBJECT_CLASS (_gspell_inline_checker_text_parent_class)->dispose (object);


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