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:
@@ -58,6 +58,7 @@ struct _GcalEventWidget
|
|||||||
GtkWidget *summary_label;
|
GtkWidget *summary_label;
|
||||||
GtkWidget *vertical_box;
|
GtkWidget *vertical_box;
|
||||||
GtkEventController *drag_source;
|
GtkEventController *drag_source;
|
||||||
|
GtkWidget *preview_popover;
|
||||||
|
|
||||||
/* internal data */
|
/* internal data */
|
||||||
gboolean clock_format_24h : 1;
|
gboolean clock_format_24h : 1;
|
||||||
@@ -634,6 +635,7 @@ gcal_event_widget_dispose (GObject *object)
|
|||||||
{
|
{
|
||||||
GcalEventWidget *self = GCAL_EVENT_WIDGET (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_clear_pointer (&self->main_widget, gtk_widget_unparent);
|
||||||
|
|
||||||
G_OBJECT_CLASS (gcal_event_widget_parent_class)->dispose (object);
|
G_OBJECT_CLASS (gcal_event_widget_parent_class)->dispose (object);
|
||||||
@@ -960,20 +962,21 @@ gcal_event_widget_show_preview (GcalEventWidget *self,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
PreviewData *data;
|
PreviewData *data;
|
||||||
GtkWidget *event_popover;
|
|
||||||
|
|
||||||
GCAL_ENTRY;
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
g_clear_pointer (&self->preview_popover, gtk_widget_unparent);
|
||||||
|
|
||||||
data = g_new0 (PreviewData, 1);
|
data = g_new0 (PreviewData, 1);
|
||||||
data->event_widget = self;
|
data->event_widget = self;
|
||||||
data->callback = callback;
|
data->callback = callback;
|
||||||
data->user_data = user_data;
|
data->user_data = user_data;
|
||||||
|
|
||||||
event_popover = gcal_event_popover_new (self->context, self->event);
|
self->preview_popover = gcal_event_popover_new (self->context, self->event);
|
||||||
gtk_widget_set_parent (event_popover, GTK_WIDGET (self));
|
gtk_widget_set_parent (self->preview_popover, GTK_WIDGET (self));
|
||||||
g_signal_connect (event_popover, "closed", G_CALLBACK (on_event_popover_closed_cb), data);
|
g_signal_connect (self->preview_popover, "closed", G_CALLBACK (on_event_popover_closed_cb), data);
|
||||||
g_signal_connect (event_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data);
|
g_signal_connect (self->preview_popover, "edit", G_CALLBACK (on_event_popover_edit_cb), data);
|
||||||
gtk_popover_popup (GTK_POPOVER (event_popover));
|
gtk_popover_popup (GTK_POPOVER (self->preview_popover));
|
||||||
|
|
||||||
GCAL_EXIT;
|
GCAL_EXIT;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user