From 8b79002a758b74b9a336dce6e3eb721d09fafb45 Mon Sep 17 00:00:00 2001 From: Robert Fewell <14uBobIT@gmail.com> Date: Tue, 23 Mar 2021 09:59:09 +0000 Subject: [PATCH] Bug 798147 - Accounts Page Notes entry crash There were a couple of places that a value was being used after it had been freed so they were fixed. --- .../gnome-utils/gnc-cell-renderer-text-view.c | 2 ++ gnucash/gnome-utils/gnc-cell-view.c | 33 +++++++++++-------- gnucash/gnome-utils/gnc-cell-view.h | 1 + 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/gnucash/gnome-utils/gnc-cell-renderer-text-view.c b/gnucash/gnome-utils/gnc-cell-renderer-text-view.c index 4458484170..367e2ad9a8 100644 --- a/gnucash/gnome-utils/gnc-cell-renderer-text-view.c +++ b/gnucash/gnome-utils/gnc-cell-renderer-text-view.c @@ -89,6 +89,8 @@ gcrtv_editing_done (GtkCellEditable *editable, new_text = gnc_cell_view_get_text (GNC_CELL_VIEW(editable)); + gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(editable)); + g_signal_emit_by_name (cell_tv, "edited", path, new_text); } diff --git a/gnucash/gnome-utils/gnc-cell-view.c b/gnucash/gnome-utils/gnc-cell-view.c index bf82389e55..2a94e5a146 100644 --- a/gnucash/gnome-utils/gnc-cell-view.c +++ b/gnucash/gnome-utils/gnc-cell-view.c @@ -53,9 +53,14 @@ G_DEFINE_TYPE_WITH_CODE (GncCellView, gnc_cell_view, GTK_TYPE_EVENT_BOX, gnc_cell_view_editable_init)) static void -gnc_cell_view_finalize (GObject *gobject) +gnc_cell_view_dispose (GObject *gobject) { - G_OBJECT_CLASS (gnc_cell_view_parent_class)->finalize (gobject); + if (GNC_CELL_VIEW(gobject)->tooltip_id > 0) + { + g_source_remove (GNC_CELL_VIEW(gobject)->tooltip_id); + GNC_CELL_VIEW(gobject)->tooltip_id = 0; + } + G_OBJECT_CLASS (gnc_cell_view_parent_class)->dispose (gobject); } static void @@ -75,6 +80,9 @@ gnc_cell_view_init (GncCellView *cv) gtk_container_add (GTK_CONTAINER(cv), GTK_WIDGET(cv->text_view)); gtk_widget_show (cv->text_view); + cv->focus_out_id = 0; + cv->tooltip_id = 0; + gtk_widget_set_can_focus (GTK_WIDGET(cv->text_view), TRUE); gtk_widget_add_events (GTK_WIDGET(cv), GDK_KEY_PRESS_MASK); gtk_widget_add_events (GTK_WIDGET(cv), GDK_KEY_RELEASE_MASK); @@ -86,7 +94,7 @@ gnc_cell_view_class_init (GncCellViewClass *klass) GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); - gobject_class->finalize = gnc_cell_view_finalize; + gobject_class->dispose = gnc_cell_view_dispose; gobject_class->set_property = gnc_cell_view_set_property; gobject_class->get_property = gnc_cell_view_get_property; @@ -144,11 +152,9 @@ gtk_cell_editable_key_press_event (GtkTextView *text_view, if (key_event->keyval == GDK_KEY_Escape) { cv->editing_canceled = TRUE; + gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv)); - - if (GTK_IS_CELL_EDITABLE(cv)) - gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv)); - + gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv)); return TRUE; } @@ -156,10 +162,6 @@ gtk_cell_editable_key_press_event (GtkTextView *text_view, && (key_event->state & GDK_SHIFT_MASK)) { gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv)); - - if (GTK_IS_CELL_EDITABLE(cv)) - gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv)); - return TRUE; } return FALSE; @@ -184,8 +186,11 @@ gcv_focus_out_event (GtkWidget *widget, GdkEvent *event, GncCellView *cv) static gboolean gcv_remove_tooltip (GncCellView *cv) { - if (GTK_IS_WIDGET(cv->text_view)) + if (cv->tooltip_id > 0) + { gtk_widget_set_tooltip_text (GTK_WIDGET(cv->text_view), NULL); + cv->tooltip_id = 0; + } return FALSE; } @@ -196,8 +201,8 @@ gcv_start_editing (GtkCellEditable *cell_editable, GncCellView *cv = GNC_CELL_VIEW(cell_editable); GtkTextIter siter, eiter; - // Remove the text_view tooltip after 5secs - g_timeout_add (5000, (GSourceFunc) gcv_remove_tooltip, cv); + // Remove the text_view tooltip after 5secs to stop it recuring + cv->tooltip_id = g_timeout_add (5000, (GSourceFunc) gcv_remove_tooltip, cv); gtk_text_buffer_get_bounds (cv->buffer, &siter, &eiter); gtk_text_buffer_select_range (cv->buffer, &eiter, &siter); diff --git a/gnucash/gnome-utils/gnc-cell-view.h b/gnucash/gnome-utils/gnc-cell-view.h index 7f76da6ac5..6fb7a3f1d0 100644 --- a/gnucash/gnome-utils/gnc-cell-view.h +++ b/gnucash/gnome-utils/gnc-cell-view.h @@ -43,6 +43,7 @@ struct _GncCellView GtkTextBuffer *buffer; gulong focus_out_id; + guint tooltip_id; gboolean editing_canceled; };