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)