From 555668c928408f0b27cb22a8225b9d3b55a5b57d Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Wed, 26 Apr 2000 01:08:06 +0000 Subject: Renamed from backend_destroy_cb. Now we use it for the "last_client_gone" 2000-04-25 Federico Mena Quintero * pcs/cal-factory.c (backend_last_client_gone_cb): Renamed from backend_destroy_cb. Now we use it for the "last_client_gone" signal from the backend. Also, unref the backend to destroy it. (add_backend): Connect to the "last_client_gone" signal of the backend. (cal_factory_get_n_backends): New function to query the number of running backends. * pcs/cal-backend.c (cal_backend_class_init): Register the new "last_client_gone" signal. It is emitted when the last Cal client goes away. It is used to notify the factory when a backend may be safely destroyed. (cal_destroy_cb): Emit the "last_client_gone" signal when the last client disconnects from the backend. svn path=/trunk/; revision=2619 --- calendar/pcs/cal-backend.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'calendar/pcs/cal-backend.c') diff --git a/calendar/pcs/cal-backend.c b/calendar/pcs/cal-backend.c index 4d0e659037..364a4670c6 100644 --- a/calendar/pcs/cal-backend.c +++ b/calendar/pcs/cal-backend.c @@ -61,12 +61,20 @@ typedef struct { +/* Signal IDs */ +enum { + LAST_CLIENT_GONE, + LAST_SIGNAL +}; + static void cal_backend_class_init (CalBackendClass *class); static void cal_backend_init (CalBackend *backend); static void cal_backend_destroy (GtkObject *object); static GtkObjectClass *parent_class; +static guint cal_backend_signals[LAST_SIGNAL]; + /** @@ -112,6 +120,16 @@ cal_backend_class_init (CalBackendClass *class) parent_class = gtk_type_class (GTK_TYPE_OBJECT); + cal_backend_signals[LAST_CLIENT_GONE] = + gtk_signal_new ("last_client_gone", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (CalBackendClass, last_client_gone), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, cal_backend_signals, LAST_SIGNAL); + object_class->destroy = cal_backend_destroy; } @@ -128,7 +146,8 @@ cal_backend_init (CalBackend *backend) priv->format = CAL_VCAL; } -static void save_to_vcal (CalBackend *backend, char *fname) +static void +save_to_vcal (CalBackend *backend, char *fname) { FILE *fp; CalBackendPrivate *priv = backend->priv; @@ -174,7 +193,6 @@ static void save_to_vcal (CalBackend *backend, char *fname) cleanStrTbl (); } - /* Saves a calendar */ static void save (CalBackend *backend) @@ -547,12 +565,11 @@ cal_destroy_cb (GtkObject *object, gpointer data) priv->clients = g_list_remove_link (priv->clients, l); g_list_free_1 (l); - /* When all clients go away, the backend can go away, too. Commit - * suicide here. + /* When all clients go away, notify the parent factory about it so that + * it may decide whether to kill the backend or not. */ - if (!priv->clients) - gtk_object_unref (GTK_OBJECT (backend)); + gtk_signal_emit (GTK_OBJECT (backend), cal_backend_signals[LAST_CLIENT_GONE]); } /** -- cgit v1.2.3