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));
gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE(editable));
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))
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);

View File

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