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.
This commit is contained in:
Robert Fewell 2021-03-23 09:59:09 +00:00
parent 27435b1038
commit 8b79002a75
3 changed files with 22 additions and 14 deletions

View File

@ -89,6 +89,8 @@ gcrtv_editing_done (GtkCellEditable *editable,
new_text = gnc_cell_view_get_text (GNC_CELL_VIEW(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); g_signal_emit_by_name (cell_tv, "edited", path, new_text);
} }

View File

@ -53,9 +53,14 @@ G_DEFINE_TYPE_WITH_CODE (GncCellView, gnc_cell_view, GTK_TYPE_EVENT_BOX,
gnc_cell_view_editable_init)) gnc_cell_view_editable_init))
static void 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 static void
@ -75,6 +80,9 @@ gnc_cell_view_init (GncCellView *cv)
gtk_container_add (GTK_CONTAINER(cv), GTK_WIDGET(cv->text_view)); gtk_container_add (GTK_CONTAINER(cv), GTK_WIDGET(cv->text_view));
gtk_widget_show (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_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_PRESS_MASK);
gtk_widget_add_events (GTK_WIDGET(cv), GDK_KEY_RELEASE_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); GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
GtkWidgetClass *widget_class = GTK_WIDGET_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->set_property = gnc_cell_view_set_property;
gobject_class->get_property = gnc_cell_view_get_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) if (key_event->keyval == GDK_KEY_Escape)
{ {
cv->editing_canceled = TRUE; cv->editing_canceled = TRUE;
gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv)); gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv));
gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv));
if (GTK_IS_CELL_EDITABLE(cv))
gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(cv));
return TRUE; return TRUE;
} }
@ -156,10 +162,6 @@ gtk_cell_editable_key_press_event (GtkTextView *text_view,
&& (key_event->state & GDK_SHIFT_MASK)) && (key_event->state & GDK_SHIFT_MASK))
{ {
gtk_cell_editable_editing_done (GTK_CELL_EDITABLE(cv)); 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 TRUE;
} }
return FALSE; return FALSE;
@ -184,8 +186,11 @@ gcv_focus_out_event (GtkWidget *widget, GdkEvent *event, GncCellView *cv)
static gboolean static gboolean
gcv_remove_tooltip (GncCellView *cv) 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); gtk_widget_set_tooltip_text (GTK_WIDGET(cv->text_view), NULL);
cv->tooltip_id = 0;
}
return FALSE; return FALSE;
} }
@ -196,8 +201,8 @@ gcv_start_editing (GtkCellEditable *cell_editable,
GncCellView *cv = GNC_CELL_VIEW(cell_editable); GncCellView *cv = GNC_CELL_VIEW(cell_editable);
GtkTextIter siter, eiter; GtkTextIter siter, eiter;
// Remove the text_view tooltip after 5secs // Remove the text_view tooltip after 5secs to stop it recuring
g_timeout_add (5000, (GSourceFunc) gcv_remove_tooltip, cv); cv->tooltip_id = g_timeout_add (5000, (GSourceFunc) gcv_remove_tooltip, cv);
gtk_text_buffer_get_bounds (cv->buffer, &siter, &eiter); gtk_text_buffer_get_bounds (cv->buffer, &siter, &eiter);
gtk_text_buffer_select_range (cv->buffer, &eiter, &siter); gtk_text_buffer_select_range (cv->buffer, &eiter, &siter);

View File

@ -43,6 +43,7 @@ struct _GncCellView
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
gulong focus_out_id; gulong focus_out_id;
guint tooltip_id;
gboolean editing_canceled; gboolean editing_canceled;
}; };