From 6aa139281feca7cbe806efffe4ee787891d87d00 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 18 Jun 2019 23:45:14 +0200 Subject: Improved reference tracking for widget disposing. --- src/glibext/gbufferview.c | 38 +++++++++++++++++++++++++++++++++++--- src/glibext/gwidthtracker.c | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c index cfe215d..c59c9e8 100644 --- a/src/glibext/gbufferview.c +++ b/src/glibext/gbufferview.c @@ -143,11 +143,23 @@ static void g_buffer_view_class_init(GBufferViewClass *class) static void g_buffer_view_init(GBufferView *view) { + view->cache = NULL; + + view->highlighted = NULL; + /** * Inversion du statut pour forcer l'actualisation lors de la création. */ view->unrestricted = false; + view->start = NULL; + view->end = NULL; + + view->first = 0; + view->last = 0; + + view->tracker = NULL; + } @@ -165,9 +177,12 @@ static void g_buffer_view_init(GBufferView *view) static void g_buffer_view_dispose(GBufferView *view) { - g_object_unref(G_OBJECT(view->cache)); + g_clear_object(&view->cache); + + g_clear_object(&view->start); + g_clear_object(&view->end); - g_object_unref(G_OBJECT(view->tracker)); + g_clear_object(&view->tracker); G_OBJECT_CLASS(g_buffer_view_parent_class)->dispose(G_OBJECT(view)); @@ -188,7 +203,8 @@ static void g_buffer_view_dispose(GBufferView *view) static void g_buffer_view_finalize(GBufferView *view) { - unref_segment_content_list(view->highlighted); + if (view->highlighted != NULL) + unref_segment_content_list(view->highlighted); G_OBJECT_CLASS(g_buffer_view_parent_class)->finalize(G_OBJECT(view)); @@ -215,6 +231,7 @@ GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted) result = g_object_new(G_TYPE_BUFFER_VIEW, NULL); result->cache = cache; + g_object_ref_sink(G_OBJECT(cache)); g_buffer_view_restrict(result, NULL, NULL); @@ -418,6 +435,9 @@ void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor * else { + g_object_ref_sink(G_OBJECT(start)); + g_object_ref_sink(G_OBJECT(end)); + view->start = start; view->end = end; @@ -822,8 +842,11 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index--; other = g_buffer_cache_find_line_by_index(view->cache, index); + assert(other != NULL); + result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, offsets, caret, cursor); + g_object_unref(G_OBJECT(other)); } @@ -837,8 +860,11 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index++; other = g_buffer_cache_find_line_by_index(view->cache, index); + assert(other != NULL); + result = _g_buffer_view_compute_caret_full(view, caret->x, other, index, options, offsets, caret, cursor); + g_object_unref(G_OBJECT(other)); } @@ -860,8 +886,11 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d index--; other = g_buffer_cache_find_line_by_index(view->cache, index); + assert(other != NULL); + result = _g_buffer_view_compute_caret_full(view, INT_MAX, other, index, options, offsets, caret, cursor); + g_object_unref(G_OBJECT(other)); } @@ -885,8 +914,11 @@ bool g_buffer_view_move_caret(GBufferView *view, bool ctrl, GdkScrollDirection d text_pos = g_buffer_cache_get_text_position(view->cache); other = g_buffer_cache_find_line_by_index(view->cache, index); + assert(other != NULL); + result = _g_buffer_view_compute_caret_full(view, text_pos, other, index, options, offsets, caret, cursor); + g_object_unref(G_OBJECT(other)); } diff --git a/src/glibext/gwidthtracker.c b/src/glibext/gwidthtracker.c index 50b99eb..3d39316 100644 --- a/src/glibext/gwidthtracker.c +++ b/src/glibext/gwidthtracker.c @@ -239,7 +239,7 @@ static void g_width_update_init(GWidthUpdate *update) static void g_width_update_dispose(GWidthUpdate *update) { - g_object_unref(G_OBJECT(update->tracker)); + g_clear_object(&update->tracker); G_OBJECT_CLASS(g_width_update_parent_class)->dispose(G_OBJECT(update)); -- cgit v0.11.2-87-g4458