From f2e5c27f80c2c427bcefed1e004716ab5cd9c40b Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Aug 24 2020 22:00:41 +0000 Subject: Backport another crasher fix (by Yuri6037) --- diff --git a/0001-calendar-monitor-Turn-completed-signal-into-a-boolea.patch b/0001-calendar-monitor-Turn-completed-signal-into-a-boolea.patch new file mode 100644 index 0000000..a1435fc --- /dev/null +++ b/0001-calendar-monitor-Turn-completed-signal-into-a-boolea.patch @@ -0,0 +1,258 @@ +From 78cb11c64d199b77761ba55bdd3d3e6b0dcb06af Mon Sep 17 00:00:00 2001 +From: Yuri Edward +Date: Mon, 6 Jul 2020 16:27:13 +0200 +Subject: [PATCH] calendar-monitor: Turn "completed" signal into a boolean + property + +And make GcalTimeline decrease the completed calendars counter when +any GcalCalendarMonitor goes from complete to incomplete. + +Fixes https://gitlab.gnome.org/GNOME/gnome-calendar/-/issues/625 +--- + src/core/gcal-calendar-monitor.c | 59 +++++++++++++++++++++++++------- + src/core/gcal-calendar-monitor.h | 2 ++ + src/core/gcal-timeline.c | 24 ++++++------- + 3 files changed, 59 insertions(+), 26 deletions(-) + +diff --git a/src/core/gcal-calendar-monitor.c b/src/core/gcal-calendar-monitor.c +index 6b409fc9..18ce70ab 100644 +--- a/src/core/gcal-calendar-monitor.c ++++ b/src/core/gcal-calendar-monitor.c +@@ -33,6 +33,7 @@ typedef struct + GcalCalendarMonitor *monitor; + GcalEvent *event; + gchar *event_id; ++ gboolean complete; + } IdleData; + + typedef enum +@@ -58,6 +59,7 @@ struct _GcalCalendarMonitor + + GAsyncQueue *messages; + GcalCalendar *calendar; ++ gboolean complete; + + /* + * These fields are only accessed on the monitor thread, and +@@ -92,7 +94,6 @@ enum + EVENT_ADDED, + EVENT_UPDATED, + EVENT_REMOVED, +- COMPLETED, + N_SIGNALS, + }; + +@@ -100,6 +101,7 @@ enum + { + PROP_0, + PROP_CALENDAR, ++ PROP_COMPLETE, + N_PROPS + }; + +@@ -244,12 +246,14 @@ remove_event_in_idle (GcalCalendarMonitor *self, + } + + static void +-complete_in_idle (GcalCalendarMonitor *self) ++set_complete_in_idle (GcalCalendarMonitor *self, ++ gboolean complete) + { + IdleData *idle_data; + + idle_data = g_new0 (IdleData, 1); + idle_data->monitor = g_object_ref (self); ++ idle_data->complete = complete; + + g_main_context_invoke_full (self->main_context, + G_PRIORITY_DEFAULT_IDLE, +@@ -584,7 +588,7 @@ on_client_view_complete_cb (ECalClientView *view, + + self->monitor_thread.populated = TRUE; + +- complete_in_idle (self); ++ set_complete_in_idle (self, TRUE); + + g_debug ("Finished initial loading of calendar '%s'", gcal_calendar_get_name (self->calendar)); + +@@ -652,6 +656,8 @@ create_view (GcalCalendarMonitor *self) + + self->monitor_thread.view = g_steal_pointer (&view); + ++ set_complete_in_idle (self, FALSE); ++ + GCAL_EXIT; + } + +@@ -857,6 +863,19 @@ remove_all_events (GcalCalendarMonitor *self) + } + } + ++static void ++set_complete (GcalCalendarMonitor *self, ++ gboolean complete) ++{ ++ if (self->complete == complete) ++ return; ++ ++ GCAL_TRACE_MSG ("Setting complete to %s", complete ? "TRUE" : "FALSE"); ++ ++ self->complete = complete; ++ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]); ++} ++ + + /* + * Callbacks +@@ -959,7 +978,6 @@ on_calendar_visible_changed_cb (GcalCalendar *calendar, + static gboolean + complete_in_idle_cb (gpointer user_data) + { +- g_autoptr (GcalEvent) event = NULL; + GcalCalendarMonitor *self; + IdleData *idle_data; + +@@ -970,7 +988,8 @@ complete_in_idle_cb (gpointer user_data) + g_assert (idle_data->event == NULL); + g_assert (idle_data->event_id == NULL); + +- g_signal_emit (self, signals[COMPLETED], 0, event); ++ set_complete (self, idle_data->complete); ++ + GCAL_RETURN (G_SOURCE_REMOVE); + } + +@@ -1015,6 +1034,10 @@ gcal_calendar_monitor_get_property (GObject *object, + g_value_set_object (value, self->calendar); + break; + ++ case PROP_COMPLETE: ++ g_value_set_boolean (value, self->complete); ++ break; ++ + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +@@ -1039,6 +1062,7 @@ gcal_calendar_monitor_set_property (GObject *object, + self); + break; + ++ case PROP_COMPLETE: + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +@@ -1078,19 +1102,19 @@ gcal_calendar_monitor_class_init (GcalCalendarMonitorClass *klass) + 1, + GCAL_TYPE_EVENT); + +- signals[COMPLETED] = g_signal_new ("completed", +- GCAL_TYPE_CALENDAR_MONITOR, +- G_SIGNAL_RUN_FIRST, +- 0, NULL, NULL, NULL, +- G_TYPE_NONE, +- 0); +- + properties[PROP_CALENDAR] = g_param_spec_object ("calendar", + "Calendar", +- "Calendar to be monitores", ++ "Calendar to be monitored", + GCAL_TYPE_CALENDAR, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + ++ ++ properties[PROP_COMPLETE] = g_param_spec_boolean ("complete", ++ "Complete", ++ "Whether", ++ FALSE, ++ G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); ++ + g_object_class_install_properties (object_class, N_PROPS, properties); + } + +@@ -1101,6 +1125,7 @@ gcal_calendar_monitor_init (GcalCalendarMonitor *self) + self->thread_context = g_main_context_new (); + self->main_context = g_main_context_ref_thread_default (); + self->messages = g_async_queue_new (); ++ self->complete = FALSE; + } + + GcalCalendarMonitor* +@@ -1198,3 +1223,11 @@ gcal_calendar_monitor_set_filter (GcalCalendarMonitor *self, + if (gcal_calendar_get_visible (self->calendar)) + notify_view_thread (self, FILTER_UPDATED); + } ++ ++gboolean ++gcal_calendar_monitor_is_complete (GcalCalendarMonitor *self) ++{ ++ g_return_val_if_fail (GCAL_IS_CALENDAR_MONITOR (self), FALSE); ++ ++ return self->complete; ++} +diff --git a/src/core/gcal-calendar-monitor.h b/src/core/gcal-calendar-monitor.h +index 402569a3..fb8577c9 100644 +--- a/src/core/gcal-calendar-monitor.h ++++ b/src/core/gcal-calendar-monitor.h +@@ -41,4 +41,6 @@ GcalEvent* gcal_calendar_monitor_get_cached_event (GcalCalendarMo + void gcal_calendar_monitor_set_filter (GcalCalendarMonitor *self, + const gchar *filter); + ++gboolean gcal_calendar_monitor_is_complete (GcalCalendarMonitor *self); ++ + G_END_DECLS +diff --git a/src/core/gcal-timeline.c b/src/core/gcal-timeline.c +index 228575f5..4a757af3 100644 +--- a/src/core/gcal-timeline.c ++++ b/src/core/gcal-timeline.c +@@ -204,17 +204,6 @@ reset_completed_calendars (GcalTimeline *self) + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]); + } + +-static void +-increase_completed_calendars (GcalTimeline *self) +-{ +- self->completed_calendars++; +- +- g_assert (self->completed_calendars <= g_hash_table_size (self->calendars)); +- +- if (is_timeline_complete (self)) +- g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]); +-} +- + static void + add_event_to_subscriber (GcalTimelineSubscriber *subscriber, + GcalEvent *event) +@@ -591,11 +580,20 @@ on_calendar_monitor_event_removed_cb (GcalCalendarMonitor *monitor, + + static void + on_calendar_monitor_completed_cb (GcalCalendarMonitor *monitor, ++ GParamSpec *pspec, + GcalTimeline *self) + { + GCAL_ENTRY; + +- increase_completed_calendars (self); ++ if (gcal_calendar_monitor_is_complete (monitor)) ++ self->completed_calendars++; ++ else ++ self->completed_calendars--; ++ ++ g_assert (self->completed_calendars <= g_hash_table_size (self->calendars)); ++ ++ if (is_timeline_complete (self)) ++ g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPLETE]); + + GCAL_EXIT; + } +@@ -953,7 +951,7 @@ gcal_timeline_add_calendar (GcalTimeline *self, + g_signal_connect (monitor, "event-added", G_CALLBACK (on_calendar_monitor_event_added_cb), self); + g_signal_connect (monitor, "event-updated", G_CALLBACK (on_calendar_monitor_event_updated_cb), self); + g_signal_connect (monitor, "event-removed", G_CALLBACK (on_calendar_monitor_event_removed_cb), self); +- g_signal_connect (monitor, "completed", G_CALLBACK (on_calendar_monitor_completed_cb), self); ++ g_signal_connect (monitor, "notify::complete", G_CALLBACK (on_calendar_monitor_completed_cb), self); + g_hash_table_insert (self->calendars, calendar, g_object_ref (monitor)); + + if (self->range) +-- +2.28.0 + diff --git a/gnome-calendar.spec b/gnome-calendar.spec index 602e100..fd1e65b 100644 --- a/gnome-calendar.spec +++ b/gnome-calendar.spec @@ -6,15 +6,19 @@ Name: gnome-calendar Version: 3.36.2 -Release: 4%{?dist} +Release: 5%{?dist} Summary: Simple and beautiful calendar application designed to fit GNOME 3 License: GPLv3+ URL: https://wiki.gnome.org/Apps/Calendar Source0: https://download.gnome.org/sources/%{name}/3.36/%{name}-%{version}.tar.xz -# These are all backports of crasher fix PRs by mcatanzaro -Patch2: 84.patch +# This is a backport of a crasher fix PR by mcatanzaro +Patch0: 84.patch +# This is another crasher fix, by Yuri6037 +# https://bugzilla.redhat.com/show_bug.cgi?id=1872042 +# https://gitlab.gnome.org/GNOME/gnome-calendar/-/merge_requests/142 +Patch1: 0001-calendar-monitor-Turn-completed-signal-into-a-boolea.patch BuildRequires: gcc BuildRequires: gettext @@ -83,6 +87,9 @@ appstream-util validate-relax --nonet %{buildroot}%{_datadir}/metainfo/org.gnome %{_datadir}/gnome-shell/search-providers/org.gnome.Calendar.search-provider.ini %changelog +* Mon Aug 24 2020 Adam Williamson - 3.36.2-5 +- Backport another crasher fix (by Yuri6037) + * Sat Aug 01 2020 Fedora Release Engineering - 3.36.2-4 - Second attempt - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild