event-widget: Properly unparent preview popover

GcalEventWidget currently doesn't track the preview popover, and
that can easily crash Calendar upon destruction.

Track that, and unparent on dispose.

Closes: https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/986
This commit is contained in:
Georges Basile Stavracas Neto
2023-09-14 12:09:11 -03:00
parent 8d79fe2ffd
commit 77c908b394
+9 -6
View File
@@ -58,6 +58,7 @@ struct _GcalEventWidget
GtkWidget *summary_label;
GtkWidget *vertical_box;
GtkEventController *drag_source;
GtkWidget *preview_popover;
/* internal data */
gboolean clock_format_24h : 1;
@@ -634,6 +635,7 @@ gcal_event_widget_dispose (GObject *object)
{
GcalEventWidget *self = GCAL_EVENT_WIDGET (object);
g_clear_pointer (&self->preview_popover, gtk_widget_unparent);
g_clear_pointer (&self->main_widget, gtk_widget_unparent);
G_OBJECT_CLASS (gcal_event_widget_parent_class)->dispose (object);
@@ -960,20 +962,21 @@ gcal_event_widget_show_preview (GcalEventWidget *self,
gpointer user_data)
{
PreviewData *data;
GtkWidget *event_popover;
GCAL_ENTRY;
g_clear_pointer (&self->preview_popover, gtk_widget_unparent);
data = g_new0 (PreviewData, 1);
data->event_widget = self;
data->callback = callback;
data->user_data = user_data;
event_popover = gcal_event_popover_new (self->context, self->event);
gtk_widget_set_parent (event_popover, GTK_WIDGET (self));
g_signal_connect (event_popover, "closed", G_CALLBACK (on_event_popover_closed_cb), data);
g_signal_connect (event_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data);
gtk_popover_popup (GTK_POPOVER (event_popover));
self->preview_popover = gcal_event_popover_new (self->context, self->event);
gtk_widget_set_parent (self->preview_popover, GTK_WIDGET (self));
g_signal_connect (self->preview_popover, "closed", G_CALLBACK (on_event_popover_closed_cb), data);
g_signal_connect (self->preview_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data);
gtk_popover_popup (GTK_POPOVER (self->preview_popover));
GCAL_EXIT;
}