aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog16
-rw-r--r--calendar/gui/gnome-cal.c10
-rw-r--r--calendar/pcs/query.c82
3 files changed, 67 insertions, 41 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 239496f4b0..8ac62c4900 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,5 +1,21 @@
2001-10-31 Federico Mena Quintero <federico@ximian.com>
+ * gui/gnome-cal.c (dn_query_obj_updated_cb): If a query is not in
+ progress, just retag the whole thing. An event may change dates
+ and tag_calendar_by_comp() would not know how to untag the old
+ dates. Fixes bug #10220.
+
+ * pcs/query.c (start_query_cb): Connect to the backend's
+ "obj_updated" and "obj_removed" signals here instead of in
+ query_construct(). If a query is started while another one is
+ notifying of an update, these signal connections would get appened
+ to the running signal (the one that triggered the notification
+ about an update) and the new signal handlers would also get
+ called. We are really not interested in updates before we
+ populate the query, because we'll catch the changes anyways.
+
+2001-10-31 Federico Mena Quintero <federico@ximian.com>
+
Fix bug #13723.
* gui/gnome-cal.h (GnomeCalendarClass): New signals
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 1912068208..98c01e6372 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -303,6 +303,16 @@ dn_query_obj_updated_cb (CalQuery *query, const char *uid,
gcal = GNOME_CALENDAR (data);
priv = gcal->priv;
+ /* If this is an update that is not part of an ongoing query, we have to
+ * retag the whole thing: an event may change dates and the
+ * tag_calendar_by_comp() below would not know how to untag the old
+ * dates.
+ */
+ if (!query_in_progress) {
+ update_query (gcal);
+ return;
+ }
+
status = cal_client_get_object (priv->client, uid, &comp);
switch (status) {
diff --git a/calendar/pcs/query.c b/calendar/pcs/query.c
index 28513d3822..33289ed107 100644
--- a/calendar/pcs/query.c
+++ b/calendar/pcs/query.c
@@ -1265,6 +1265,40 @@ populate_query (Query *query)
priv->state = QUERY_IN_PROGRESS;
}
+/* Callback used when a component changes in the backend */
+static void
+backend_obj_updated_cb (CalBackend *backend, const char *uid, gpointer data)
+{
+ Query *query;
+
+ query = QUERY (data);
+
+ bonobo_object_ref (BONOBO_OBJECT (query));
+
+ match_component (query, uid, FALSE, 0, 0);
+ remove_from_pending (query, uid);
+
+ bonobo_object_unref (BONOBO_OBJECT (query));
+}
+
+/* Callback used when a component is removed from the backend */
+static void
+backend_obj_removed_cb (CalBackend *backend, const char *uid, gpointer data)
+{
+ Query *query;
+ QueryPrivate *priv;
+
+ query = QUERY (data);
+ priv = query->priv;
+
+ bonobo_object_ref (BONOBO_OBJECT (query));
+
+ remove_component (query, uid);
+ remove_from_pending (query, uid);
+
+ bonobo_object_unref (BONOBO_OBJECT (query));
+}
+
/* Idle handler for starting a query */
static gboolean
start_query_cb (gpointer data)
@@ -1284,6 +1318,13 @@ start_query_cb (gpointer data)
populate_query (query);
+ gtk_signal_connect (GTK_OBJECT (priv->backend), "obj_updated",
+ GTK_SIGNAL_FUNC (backend_obj_updated_cb),
+ query);
+ gtk_signal_connect (GTK_OBJECT (priv->backend), "obj_removed",
+ GTK_SIGNAL_FUNC (backend_obj_removed_cb),
+ query);
+
return FALSE;
}
@@ -1307,40 +1348,6 @@ backend_opened_cb (CalBackend *backend, CalBackendOpenStatus status, gpointer da
}
}
-/* Callback used when a component changes in the backend */
-static void
-backend_obj_updated_cb (CalBackend *backend, const char *uid, gpointer data)
-{
- Query *query;
-
- query = QUERY (data);
-
- bonobo_object_ref (BONOBO_OBJECT (query));
-
- match_component (query, uid, FALSE, 0, 0);
- remove_from_pending (query, uid);
-
- bonobo_object_unref (BONOBO_OBJECT (query));
-}
-
-/* Callback used when a component is removed from the backend */
-static void
-backend_obj_removed_cb (CalBackend *backend, const char *uid, gpointer data)
-{
- Query *query;
- QueryPrivate *priv;
-
- query = QUERY (data);
- priv = query->priv;
-
- bonobo_object_ref (BONOBO_OBJECT (query));
-
- remove_component (query, uid);
- remove_from_pending (query, uid);
-
- bonobo_object_unref (BONOBO_OBJECT (query));
-}
-
/**
* query_construct:
* @query: A live search query.
@@ -1388,13 +1395,6 @@ query_construct (Query *query,
priv->default_zone = cal_backend_get_default_timezone (backend);
- gtk_signal_connect (GTK_OBJECT (priv->backend), "obj_updated",
- GTK_SIGNAL_FUNC (backend_obj_updated_cb),
- query);
- gtk_signal_connect (GTK_OBJECT (priv->backend), "obj_removed",
- GTK_SIGNAL_FUNC (backend_obj_removed_cb),
- query);
-
priv->sexp = g_strdup (sexp);
/* Queue the query to be started asynchronously */