[evolution-patches] [calendar-alarm-UI] changes in alarm notification UI



hi

 attached are two patches (for configure.in and the code)
 1) to give a notification bubble when an alarm triggers 
    (needs libnotify to be installed)
    as opposed to a big dialog which we get now.
 2) that adds an icon on the panel with alarm-notify start up
 3) that provides a menu to enable and disable alarms on 
    right-clicking of the icon mentioned in 2.
 4) to make the icon blink on alarm notification and 
 5) to give out the actual alarm dialog with options viz.
    snooze and edit on clicking this icon.

regards
Srinivasa Raghavan,
Chakravarthi.
Index: configure.in
===================================================================
RCS file: /cvs/gnome/evolution/configure.in,v
retrieving revision 1.846
diff -u -p -r1.846 configure.in
--- configure.in	8 Sep 2005 10:02:39 -0000	1.846
+++ configure.in	2 Oct 2005 13:50:39 -0000
@@ -1203,6 +1203,18 @@ else
 	fi
 fi
 
+LIBNOTIFY_CFLAGS=
+LIBNOTIFY_LIBS=
+PKG_CHECK_MODULES(LIBNOTIFY, libnotify, HAVE_LIBNOTIFY="yes", HAVE_LIBNOTIFY="no")
+if test "x$HAVE_LIBNOTIFY" = "xyes"; then
+  AC_DEFINE(HAVE_LIBNOTIFY, 1, [libnotify available])
+  libnotify="libnotify"
+else
+  libnotify=""
+fi
+AC_SUBST(LIBNOTIFY_CFLAGS)
+AC_SUBST(LIBNOTIFY_LIBS)
+
 EVO_SET_COMPILE_FLAGS(CERT_UI, libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED libglade-2.0 gtk+-2.0 glib-2.0 gobject-2.0 gthread-2.0,
                       $MANUAL_NSS_CFLAGS $MOZILLA_NSS_CFLAGS,
 	              $MOZILLA_L_DIR $MANUAL_NSS_LIBS $MOZILLA_NSS_LIBS)
@@ -1267,7 +1279,7 @@ EVO_SET_COMPILE_FLAGS(LIBSOUP, $LIBSOUP 
 AC_SUBST(LIBSOUP_CFLAGS)
 AC_SUBST(LIBSOUP_LIBS)
 
-EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED)
+EVO_SET_COMPILE_FLAGS(EVOLUTION_CALENDAR, libgnome-2.0 libgnomeui-2.0 libbonoboui-2.0 libglade-2.0 gnome-vfs-2.0 libgnomeprint-2.2 libgnomeprintui-2.2 gnome-vfs-module-2.0 libgtkhtml-$GTKHTML_PACKAGE >= $GTKHTML_REQUIRED libebook-$EDS_PACKAGE >= $EDS_REQUIRED libecal-$EDS_PACKAGE >= $EDS_REQUIRED libedataserverui-$EDS_PACKAGE >= $EDS_REQUIRED $libnotify)
 AC_SUBST(EVOLUTION_CALENDAR_CFLAGS)
 AC_SUBST(EVOLUTION_CALENDAR_LIBS)
 
@@ -1734,6 +1747,7 @@ echo "\
 fi
 echo "\
 	Pilot conduits:   $msg_pilot
+	LibNotify:	  $HAVE_LIBNOTIFY
 	Kerberos 4/5:     $msg_krb4/$msg_krb5
 	SSL support:      $msg_ssl
 	SMIME support:    $msg_smime
? cscope.out
Index: alarm-notify-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-notify-dialog.c,v
retrieving revision 1.36
diff -u -p -w -r1.36 alarm-notify-dialog.c
--- alarm-notify-dialog.c	30 Sep 2005 14:39:40 -0000	1.36
+++ alarm-notify-dialog.c	2 Nov 2005 06:59:31 -0000
@@ -295,6 +295,55 @@ notified_alarms_dialog_new (void)
 	return na;
 }
  
+static char *
+calculate_time (time_t start, time_t end)
+{
+	time_t difference = end - start;
+	char *str;
+	
+	if (difference < 60) {/* Can't be zero */ 
+		str = g_strdup_printf (_("(%d seconds)"), (int)difference);
+	} else if (difference > 60 && difference < 3600) { /* It will be x minutes y seconds*/
+		int minutes, seconds;
+		minutes = difference / 60;
+		seconds = difference % 60;
+		if (seconds)
+			str = g_strdup_printf (_("(%d %s %d %s)"), minutes, ngettext(_("minute"), _("minutes"), minutes), seconds, ngettext(_("second"), _("seconds"), seconds));
+		else 
+			str = g_strdup_printf (_("(%d %s)"), minutes, ngettext(_("minute"), _("minutes"), minutes));
+	} else {
+		guint hours, minutes, seconds;
+		char *s_hours = NULL, *s_minutes = NULL, *s_seconds = NULL;
+		
+		hours = difference / 3600;
+		minutes = (difference % 3600)/60;
+		seconds = difference % 60;
+
+
+		if (seconds)
+			s_seconds = g_strdup_printf (ngettext(_(" %u second"), _(" %u seconds"), seconds), seconds);	
+		if (minutes)
+			s_minutes = g_strdup_printf (ngettext(_(" %u minute"), _(" %u minutes"), minutes), minutes);
+		if (hours)
+			s_hours = g_strdup_printf (ngettext(_("%u hour"),_("%u hours"), hours), hours);
+
+		if (s_minutes && s_seconds)
+			str = g_strconcat ("(", s_hours, s_minutes, s_seconds, ")", NULL);
+		else if (s_minutes)
+			str = g_strconcat ("(", s_hours, s_minutes, ")", NULL);
+		else if (s_seconds)
+			str = g_strconcat ("(", s_hours, s_seconds, ")", NULL);
+		else 
+			str = g_strconcat ("(", s_hours, ")", NULL);
+
+		g_free (s_hours);
+		g_free (s_minutes);
+		g_free (s_seconds);
+	}
+
+	return str;
+}
+
  
 /**
  * add_alarm_to_notified_alarms_dialog:
@@ -325,7 +374,7 @@ add_alarm_to_notified_alarms_dialog (Ala
 	GtkTreeIter iter;
 	GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (na->treeview));
 	AlarmFuncInfo *funcinfo = NULL;
-	gchar *to_display = NULL, *start, *end;
+	gchar *to_display = NULL, *start, *end, *str_time;
 	icaltimezone *current_zone;
 	
 	g_return_val_if_fail (trigger != -1, iter);
@@ -346,13 +395,15 @@ add_alarm_to_notified_alarms_dialog (Ala
 	current_zone = config_data_get_timezone ();
 	start = timet_to_str_with_zone (occur_start, current_zone);
 	end = timet_to_str_with_zone (occur_end, current_zone);
-	to_display = g_strdup_printf (_("<big><b>%s</b></big>\n%s until %s"), 
-		summary, start, end);
+	str_time = calculate_time (occur_start, occur_end);
+	to_display = g_strdup_printf (_("<big><b>%s</b></big>\n%s %s"), 
+		summary, start, str_time);
 	g_free (start);
 	g_free (end);
 	gtk_list_store_set (GTK_LIST_STORE(model), &iter, 
 		ALARM_DISPLAY_COLUMN, to_display, -1);
 	g_free (to_display);
+	g_free (str_time);
 	
 	gtk_list_store_set (GTK_LIST_STORE(model), &iter, ALARM_SUMMARY_COLUMN, summary, -1);
 	gtk_list_store_set (GTK_LIST_STORE(model), &iter, ALARM_DESCRIPTION_COLUMN, description, -1);
Index: alarm-notify.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-notify.c,v
retrieving revision 1.51
diff -u -p -w -r1.51 alarm-notify.c
--- alarm-notify.c	13 Jul 2005 10:36:15 -0000	1.51
+++ alarm-notify.c	2 Nov 2005 06:59:31 -0000
@@ -33,7 +33,6 @@
 #include "config-data.h"
 #include "common/authentication.h"
 
-
 /* Private part of the AlarmNotify structure */
 struct _AlarmNotifyPrivate {
 	/* Mapping from EUri's to LoadedClient structures */
@@ -41,6 +40,7 @@ struct _AlarmNotifyPrivate {
 	   just need to hash based on source */
 	GHashTable *uri_client_hash [E_CAL_SOURCE_TYPE_LAST];
         ESourceList *source_lists [E_CAL_SOURCE_TYPE_LAST];	
+	ESourceList *selected_calendars;
         GMutex *mutex;
 };
 
@@ -54,7 +54,6 @@ static void alarm_notify_finalize (GObje
 static BonoboObjectClass *parent_class;
 
 
-
 BONOBO_TYPE_FUNC_FULL(AlarmNotify, GNOME_Evolution_Calendar_AlarmNotify, BONOBO_TYPE_OBJECT, alarm_notify)
 
 /* Class initialization function for the alarm notify service */
@@ -140,6 +139,10 @@ list_changed_cb (ESourceList *source_lis
 		for (q = sources; q != NULL; q = q->next) {
 			ESource *source = E_SOURCE (q->data);
 			char *uri;
+			const char *uid = e_source_peek_uid (source);
+
+			if (!e_source_list_peek_source_by_uid (priv->selected_calendars, uid)) 
+				continue;
 			
 			uri = e_source_get_uri (source);
 			if (!g_hash_table_lookup (priv->uri_client_hash[source_type], uri)) {
@@ -163,6 +166,11 @@ list_changed_cb (ESourceList *source_lis
 	g_list_free (prd.removals);
 }
 
+ESourceList *
+alarm_notify_get_selected_calendars (AlarmNotify *an)
+{
+	return an->priv->selected_calendars;
+}
 static void
 load_calendars (AlarmNotify *an, ECalSourceType source_type)
 {
@@ -187,6 +195,10 @@ load_calendars (AlarmNotify *an, ECalSou
 		for (q = sources; q != NULL; q = q->next) {
 			ESource *source = E_SOURCE (q->data);
 			char *uri;
+			const char *uid = e_source_peek_uid (source);
+
+			if (!e_source_list_peek_source_by_uid (priv->selected_calendars, uid)) 
+				continue;
 			
 			uri = e_source_get_uri (source);
 			g_message ("Loading %s", uri);
@@ -224,11 +236,13 @@ alarm_notify_init (AlarmNotify *an, Alar
 	priv = g_new0 (AlarmNotifyPrivate, 1);
 	an->priv = priv;
 	priv->mutex = g_mutex_new ();
+	priv->selected_calendars = config_data_get_calendars ("/apps/evolution/calendar/notify/calendars");
+
 
 	for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
 		priv->uri_client_hash[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 
-	alarm_queue_init ();
+	alarm_queue_init (an);
 
 	for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
 		load_calendars (an, i);
@@ -326,13 +340,18 @@ alarm_notify_add_calendar (AlarmNotify *
 {
 	AlarmNotifyPrivate *priv;
 	ECal *client;
+	EUri *e_uri;
 	char *str_uri;
+	char *uri;
 	g_return_if_fail (an != NULL);
 	g_return_if_fail (IS_ALARM_NOTIFY (an));
 	
-
+	/* Make sure the uri is properly generated for all types of backends */
 	priv = an->priv;
-	str_uri = e_source_get_uri (source);
+	uri = e_source_get_uri (source);
+	e_uri = e_uri_new (uri);	
+	str_uri = e_uri_to_string (e_uri, FALSE);
+	g_free (uri);
 	
 	g_mutex_lock (an->priv->mutex);
 	/* See if we already know about this uri */
Index: alarm-notify.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-notify.h,v
retrieving revision 1.12
diff -u -p -w -r1.12 alarm-notify.h
--- alarm-notify.h	27 Aug 2004 15:41:04 -0000	1.12
+++ alarm-notify.h	2 Nov 2005 06:59:31 -0000
@@ -26,7 +26,6 @@
 #include "evolution-calendar.h"
 
 
-
 #define TYPE_ALARM_NOTIFY            (alarm_notify_get_type ())
 #define ALARM_NOTIFY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_ALARM_NOTIFY, AlarmNotify))
 #define ALARM_NOTIFY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_ALARM_NOTIFY,		\
@@ -58,6 +57,7 @@ AlarmNotify *alarm_notify_new (void);
 void alarm_notify_add_calendar (AlarmNotify *an, ECalSourceType source_type, ESource *source, gboolean load_afterwards);
 void alarm_notify_remove_calendar (AlarmNotify *an, ECalSourceType source_type, const char *str_uri);
 
+ESourceList *alarm_notify_get_selected_calendars (AlarmNotify *);
 
 
 
Index: alarm-queue.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-queue.c,v
retrieving revision 1.88
diff -u -p -w -r1.88 alarm-queue.c
--- alarm-queue.c	1 Oct 2005 06:20:49 -0000	1.88
+++ alarm-queue.c	2 Nov 2005 06:59:32 -0000
@@ -27,14 +27,19 @@
 #include <bonobo-activation/bonobo-activation.h>
 #include <bonobo/bonobo-object.h>
 #include <bonobo/bonobo-exception.h>
+#include <bonobo/bonobo-main.h>
 #include <gtk/gtksignal.h>
 #include <gtk/gtkbox.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkhbox.h>
 #include <gtk/gtkdialog.h>
 #include <gtk/gtkeventbox.h>
 #include <gtk/gtkimage.h>
+#include <gtk/gtkframe.h>
 #include <gtk/gtkimagemenuitem.h>
 #include <gtk/gtklabel.h>
 #include <gtk/gtkcheckbutton.h>
+#include <gtk/gtkcheckmenuitem.h>
 #include <gtk/gtkstock.h>
 #include <gtk/gtktooltips.h>
 #include <libgnome/gnome-i18n.h>
@@ -45,10 +50,16 @@
 #include <e-util/eggtrayicon.h>
 #include <e-util/e-icon-factory.h>
 #include <libecal/e-cal-time-util.h>
+
+#ifdef HAVE_LIBNOTIFY
+#include <libnotify/notify.h>
+#endif
+
 #include "evolution-calendar.h"
 #include "alarm.h"
 #include "alarm-notify-dialog.h"
 #include "alarm-queue.h"
+#include "alarm-notify.h"
 #include "config-data.h"
 #include "util.h"
 #include "e-util/e-popup.h"
@@ -73,6 +84,13 @@ static GHashTable *client_alarms_hash = 
 /* List of tray icons being displayed */
 static GList *tray_icons_list = NULL;
 
+/* Top Tray Image */
+static GtkWidget *tray_image = NULL;
+static GtkWidget *tray_event_box = NULL;
+static gint tray_blink_id = -1;
+static gboolean tray_blink_state = FALSE;
+static AlarmNotify *an;
+
 /* Structure that stores a client we are monitoring */
 typedef struct {
 	/* Monitored client */
@@ -136,7 +154,10 @@ static void display_notification (time_t
 static void audio_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
 static void mail_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
 static void procedure_notification (time_t trigger, CompQueuedAlarms *cqa, gpointer alarm_id);
-
+#ifdef HAVE_LIBNOTIFY
+static void popup_notification (time_t trigger, CompQueuedAlarms *cqa,
+				  gpointer alarm_id, gboolean use_description);
+#endif
 static void query_objects_changed_cb (ECal *client, GList *objects, gpointer data);
 static void query_objects_removed_cb (ECal *client, GList *objects, gpointer data);
 
@@ -309,6 +330,9 @@ alarm_trigger_cb (gpointer alarm_id, tim
 	alarm = e_cal_component_get_alarm (comp, qa->instance->auid);
 	g_assert (alarm != NULL);
 
+	/* Show it independent of what the notification is?*/
+	display_notification (trigger, cqa, alarm_id, TRUE);
+
 	e_cal_component_alarm_get_action (alarm, &action);
 	e_cal_component_alarm_free (alarm);
 
@@ -318,7 +342,9 @@ alarm_trigger_cb (gpointer alarm_id, tim
 		break;
 
 	case E_CAL_COMPONENT_ALARM_DISPLAY:
-		display_notification (trigger, cqa, alarm_id, TRUE);
+#ifdef HAVE_LIBNOTIFY
+		popup_notification (trigger, cqa, alarm_id, TRUE);
+#endif
 		break;
 
 	case E_CAL_COMPONENT_ALARM_EMAIL:
@@ -731,6 +757,7 @@ typedef struct {
 	char *description;
 	char *location;
 	gboolean blink_state;
+	gboolean snooze_set;
 	gint blink_id;
 	time_t trigger;
 	CompQueuedAlarms *cqa;
@@ -744,6 +771,29 @@ typedef struct {
 } TrayIconData;
 
 static void
+free_tray_icon_data (TrayIconData *tray_data)
+{
+	g_return_if_fail (tray_data != NULL);
+	if (tray_data->summary) {
+		g_free (tray_data->summary);
+		tray_data->summary = NULL;
+	}
+	if (tray_data->description) 
+		tray_data->description = NULL;
+	if (tray_data->location) 
+		tray_data->location = NULL;
+	g_object_unref (tray_data->client);
+	tray_data->client = NULL;
+	g_object_unref (tray_data->query);
+	tray_data->query = NULL;
+	tray_data->cqa = NULL;
+	tray_data->alarm_id = NULL;
+	tray_data->tray_icon = NULL;
+	tray_data->image = NULL;
+	g_free (tray_data);
+}
+
+static void
 on_dialog_objs_removed_cb (ECal *client, GList *objects, gpointer data)
 {
 	const char *our_uid;
@@ -762,8 +812,8 @@ on_dialog_objs_removed_cb (ECal *client,
 		if (!strcmp (uid, our_uid)) {
 			tray_data->cqa = NULL;
 			tray_data->alarm_id = NULL;
-
-			gtk_widget_destroy (tray_data->tray_icon);
+			tray_icons_list = g_list_remove (tray_icons_list, tray_data);
+			tray_data = NULL;
 		}
 	}
 }
@@ -780,8 +830,7 @@ notify_dialog_cb (AlarmNotifyResult resu
 	switch (result) {
 	case ALARM_NOTIFY_SNOOZE:
 		create_snooze (tray_data->cqa, tray_data->alarm_id, snooze_mins);
-		tray_data->cqa = NULL;
-	
+		tray_data->snooze_set = TRUE;
 		if (alarm_notifications_dialog) {
 			GtkTreeSelection *selection = 
 				gtk_tree_view_get_selection (
@@ -789,7 +838,7 @@ notify_dialog_cb (AlarmNotifyResult resu
 			GtkTreeIter iter;
 			GtkTreeModel *model = NULL;
 			
-			/* We can also use tray_data->iter */
+			/* We can` also use tray_data->iter */
 			if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 				gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
 				if (!gtk_tree_model_get_iter_first (model, &iter)) {
@@ -810,18 +859,12 @@ notify_dialog_cb (AlarmNotifyResult resu
 	case ALARM_NOTIFY_EDIT:
 		edit_component (tray_data->client, tray_data->comp);
 
-		gtk_widget_destroy (alarm_notifications_dialog->dialog);
-		g_free (alarm_notifications_dialog);
-		alarm_notifications_dialog = NULL;
-
-		gtk_widget_destroy (tray_data->tray_icon);
-		
 		break;
 
 	case ALARM_NOTIFY_CLOSE:
 
-		
 		if (alarm_notifications_dialog) {
+			GList *list;
 			GtkTreeIter iter;
 			GtkTreeModel *model = 
 				gtk_tree_view_get_model (
@@ -837,9 +880,28 @@ notify_dialog_cb (AlarmNotifyResult resu
 			gtk_widget_destroy (alarm_notifications_dialog->dialog);
 			g_free (alarm_notifications_dialog);
 			alarm_notifications_dialog = NULL;
-		}
 		
-		gtk_widget_destroy (tray_data->tray_icon);	
+			/* FIXME tray_icons_list is a global data structure - make this thread safe */
+
+			list = tray_icons_list;
+			while (list != NULL) {
+				tray_data = list->data;
+				if (!tray_data->snooze_set) {
+					GList *temp1 = list->next;
+					GList *temp2 = tray_icons_list;
+					tray_icons_list = g_list_remove_link (tray_icons_list, list);
+					remove_queued_alarm (tray_data->cqa, tray_data->alarm_id, FALSE, TRUE);
+					free_tray_icon_data (tray_data);
+					tray_data = NULL;
+					g_list_free_1 (list);
+					if (tray_icons_list != temp2)	/* List head is modified */
+						list = tray_icons_list;
+					else 
+						list = temp1;
+				} else
+					list = list->next;
+			}
+		}
 		
 		break;
 
@@ -850,45 +912,6 @@ notify_dialog_cb (AlarmNotifyResult resu
 	return;
 }
 
-static gint
-tray_icon_destroyed_cb (GtkWidget *tray, gpointer user_data)
-{
-	TrayIconData *tray_data = user_data;
-	
-	g_signal_handlers_disconnect_matched (tray_data->query, G_SIGNAL_MATCH_FUNC,
-					      0, 0, NULL, on_dialog_objs_removed_cb, NULL);
-
-	if (tray_data->cqa != NULL)
-		remove_queued_alarm (tray_data->cqa, tray_data->alarm_id, TRUE, TRUE);
-
-	if (tray_data->summary != NULL) {
-		g_free (tray_data->summary);
-		tray_data->summary = NULL;
-	}
-
-	if (tray_data->description != NULL) {
-		g_free (tray_data->description);
-		tray_data->description = NULL;
-	}
-
-	if (tray_data->location != NULL) {
-		g_free (tray_data->location);
-		tray_data->location = NULL;
-	}
-
-	if (tray_data->blink_id)
-		g_source_remove (tray_data->blink_id);
-
-	g_object_unref (tray_data->comp);
-	g_object_unref (tray_data->client);
-	g_object_unref (tray_data->query);
-
-	tray_icons_list = g_list_remove (tray_icons_list, tray_data);
-	g_free (tray_data);
-
-	return TRUE;
-}
-
 /* Callbacks.  */
 static gboolean
 open_alarm_dialog (TrayIconData *tray_data)
@@ -897,8 +920,21 @@ open_alarm_dialog (TrayIconData *tray_da
 	
 	qa = lookup_queued_alarm (tray_data->cqa, tray_data->alarm_id);
 	if (qa) {
+		GdkPixbuf *pixbuf;
+		GtkTooltips *tooltips = gtk_tooltips_new ();
 		
-		gtk_widget_hide (tray_data->tray_icon);
+		tray_blink_state = FALSE;
+		pixbuf = e_icon_factory_get_icon  (tray_blink_state == TRUE ?
+						   "stock_appointment-reminder-excl" :
+						   "stock_appointment-reminder",
+						   E_ICON_SIZE_LARGE_TOOLBAR);
+
+		gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf);
+		g_object_unref (pixbuf);	
+		if (tray_blink_id > -1)
+			g_source_remove (tray_blink_id);
+		tray_blink_id = -1;
+		gtk_tooltips_set_tip (tooltips, tray_event_box, NULL, NULL);
 	
 		if (!alarm_notifications_dialog)
 			alarm_notifications_dialog = notified_alarms_dialog_new ();
@@ -934,37 +970,189 @@ open_alarm_dialog (TrayIconData *tray_da
 }
 
 static void
-popup_dismiss_cb (EPopup *ep, EPopupItem *pitem, void *data)
+alarm_quit (EPopup *ep, EPopupItem *pitem, void *data)
 {
-	TrayIconData *tray_data = data;
-
-	gtk_widget_destroy (tray_data->tray_icon);
+	bonobo_main_quit ();
 }
 
 static void
-popup_dismiss_all_cb (EPopup *ep, EPopupItem *pitem, void *data)
+menu_item_toggle_callback (GtkToggleButton *item, void *data)
 {
-	while (tray_icons_list != NULL) {
-		TrayIconData *tray_data = tray_icons_list->data;
+	gboolean state = gtk_toggle_button_get_active (item);
+	ESource *source = (ESource *) data;
+	GSList *groups, *p;
+
+
+	if (state) {
+		const char *uid = e_source_peek_uid (source);
+		ESourceList *selected_cal = alarm_notify_get_selected_calendars (an);
+		ESourceList *all_cal;
+		ESourceGroup *sel_group = NULL;
+		const char *grp_name=NULL;
+		ESourceGroup *group;
+		ESource *del_source;		
+
+		e_cal_get_sources (&all_cal, E_CAL_SOURCE_TYPE_EVENT, NULL);
+
+		alarm_notify_add_calendar (an, E_CAL_SOURCE_TYPE_EVENT, source, FALSE);
+		
+		/* Browse the list of calendars for the newly added calendar*/
+		groups = e_source_list_peek_groups (all_cal);
+		for (p = groups; p != NULL; p = p->next) {
+			ESourceGroup *group = E_SOURCE_GROUP (p->data);
+			ESource *sel_source = e_source_group_peek_source_by_uid (group, uid);
+
+			if (sel_source) {
+				sel_group = group;
+				grp_name = e_source_group_peek_name (sel_group);
+				/* You have got the group name*/
+				break;
+			}
+		}
+
+		/* Add the source the the group name in the alarms calendar list*/
+		group = e_source_list_peek_group_by_name (selected_cal, grp_name);	
+		del_source = e_source_group_peek_source_by_uid (group, uid);
+		
+		if (!del_source) {
+			char *xml, *old_xml;
+
+			old_xml = e_source_group_to_xml (group);
+			e_source_group_add_source (group, source, -1);
+			xml = e_source_group_to_xml (group);
+			config_data_replace_string_list ("/apps/evolution/calendar/notify/calendars", old_xml, xml);
+
+			g_free (xml);
+			g_free (old_xml);
+		}
 
-		gtk_widget_destroy (tray_data->tray_icon);
+	} else {
+		const char *uid = e_source_peek_uid (source);
+		ESourceList *selected_cal = alarm_notify_get_selected_calendars (an);
+		alarm_notify_remove_calendar (an, E_CAL_SOURCE_TYPE_EVENT, e_source_get_uri (source));
+		
+		/* Browse the calendar for alarms and remove the source */
+		groups = e_source_list_peek_groups (selected_cal);
+		for (p = groups; p != NULL; p = p->next) {
+			ESourceGroup *group = E_SOURCE_GROUP (p->data);
+			ESource *del_source;
+		
+			del_source = e_source_group_peek_source_by_uid (group, uid);
+			if (del_source) {
+				char *xml, *old_xml;
+
+				old_xml = e_source_group_to_xml (group);
+
+				e_source_group_remove_source_by_uid (group, uid);
+				
+				xml = e_source_group_to_xml (group);
+
+				config_data_replace_string_list ("/apps/evolution/calendar/notify/calendars", old_xml, xml);
+
+				g_free (xml);
+				g_free (old_xml);
+				break;
+			}
+		}
 
-		tray_icons_list = g_list_remove (tray_icons_list, tray_icons_list);
 	}
+		
+}
+
+static GtkWidget *
+populate ()
+{
+	GtkWidget *frame = gtk_frame_new (NULL);
+	GtkWidget *label1 = gtk_label_new (NULL);
+	GtkWidget *box = gtk_vbox_new(FALSE, 0);
+	ESourceList *selected_cal = alarm_notify_get_selected_calendars (an);	
+	GSList *groups;
+	GSList *p;
+	ESourceList *source_list;
+	
+	gtk_label_set_markup (GTK_LABEL(label1), _("<b>Calendars</b>"));
+	gtk_frame_set_label_widget (GTK_FRAME(frame), label1);
+	
+	if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_EVENT, NULL)) {
+		g_message (G_STRLOC ": Could not get the list of sources to load");
+
+		return NULL;
+	}
+		
+	groups = e_source_list_peek_groups (source_list);
+
+	for (p = groups; p != NULL; p = p->next) {
+		ESourceGroup *group = E_SOURCE_GROUP (p->data);
+		char *txt = g_strdup_printf ("<b>%s</b>", e_source_group_peek_name (group));
+		GtkWidget *item = gtk_label_new (NULL);
+		GSList *q;
+		GtkWidget *hbox, *image;
+
+		hbox = gtk_hbox_new (FALSE, 0);
+		image = e_icon_factory_get_image  ("stock_appointment-reminder", E_ICON_SIZE_SMALL_TOOLBAR);
+
+		gtk_box_pack_start ((GtkBox *)hbox, image, FALSE, FALSE, 2);
+		gtk_box_pack_start ((GtkBox *)hbox, item, FALSE, FALSE, 2);
+		
+		gtk_label_set_markup (GTK_LABEL(item), txt);
+		gtk_label_set_justify (GTK_LABEL(item), GTK_JUSTIFY_LEFT);
+		g_free (txt);
+
+		gtk_box_pack_start (GTK_BOX(box), hbox, TRUE, TRUE, 4);
+		gtk_widget_show_all (hbox);
+
+		for (q = e_source_group_peek_sources (group); q != NULL; q = q->next) {
+			ESource *source = E_SOURCE (q->data);
+			GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+			GtkWidget *item = gtk_check_button_new_with_label (e_source_peek_name (source));
+
+			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(item), e_source_list_peek_source_by_uid (selected_cal, e_source_peek_uid (source)) ? TRUE:FALSE);
+			
+			gtk_box_pack_start ((GtkBox *)hbox, item, FALSE, FALSE, 24);
+			gtk_object_set_data_full (GTK_OBJECT (item), "ESourceMenu", source,
+						  (GtkDestroyNotify) g_object_unref);
+			g_object_ref (source);
+
+			g_signal_connect (item, "toggled", G_CALLBACK (menu_item_toggle_callback), source);
+
+			gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 2);
+			gtk_widget_show_all (hbox);
+		}
+	}
+
+	gtk_container_add (GTK_CONTAINER(frame), box);
+	gtk_container_set_border_width (GTK_CONTAINER(frame), 6);
+	return frame;
 }
 
 static void
-popup_open_cb (EPopup *ep, EPopupItem *pitem, void *data)
+alarm_pref_response (GtkWidget *widget, int response, gpointer dummy)
 {
-	TrayIconData *tray_data = data;
+	gtk_widget_destroy (widget);	
+}
 
-	open_alarm_dialog (tray_data);
+static void
+alarms_configure (EPopup *ep, EPopupItem *pitem, void *data)
+{
+	GtkWidget *box = populate ();
+	GtkWidget *dialog;
+
+	dialog = gtk_dialog_new_with_buttons (_("Preferences"), 
+						NULL,0,
+						GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
+						GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+						NULL);
+
+	gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), box);
+	gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+	g_signal_connect (dialog, "response", G_CALLBACK (alarm_pref_response), NULL);
+	gtk_widget_show_all (dialog);
 }
 
 static EPopupItem tray_items[] = {
-	{ E_POPUP_ITEM, "00.open", N_("Open"), popup_open_cb, NULL, GTK_STOCK_OPEN },
-	{ E_POPUP_ITEM, "10.dismiss", N_("Dismiss"), popup_dismiss_cb, NULL, NULL },
-	{ E_POPUP_ITEM, "20.dismissall", N_("Dismiss All"), popup_dismiss_all_cb, NULL, NULL },
+	{ E_POPUP_ITEM, "00.configure", N_("_Configure Alarms"), alarms_configure, NULL, GTK_STOCK_PREFERENCES },
+	{ E_POPUP_BAR , "10.bar" },
+	{ E_POPUP_ITEM, "10.quit", N_("_Quit"), alarm_quit, NULL, GTK_STOCK_QUIT },
 };
 
 static void
@@ -979,13 +1167,33 @@ tray_icon_clicked_cb (GtkWidget *widget,
 	TrayIconData *tray_data = user_data;
 
 	if (event->type == GDK_BUTTON_PRESS) {
-		if (event->button == 1) {
-			return open_alarm_dialog (tray_data);
+		if (event->button == 1 && g_list_length (tray_icons_list) > 0) {
+			GList *tmp;
+			for (tmp = tray_icons_list; tmp; tmp = tmp->next) {
+				open_alarm_dialog (tmp->data);
+			}
+			
+			return TRUE;
 		} else if (event->button == 3) {
 			GtkMenu *menu;
 			GSList *menus = NULL;
 			EPopup *ep;
 			int i;
+			GdkPixbuf *pixbuf;
+			GtkTooltips *tooltips = gtk_tooltips_new ();
+			
+			tray_blink_state = FALSE;
+			pixbuf = e_icon_factory_get_icon  (tray_blink_state == TRUE ?
+							   "stock_appointment-reminder-excl" :
+							   "stock_appointment-reminder",
+							   E_ICON_SIZE_LARGE_TOOLBAR);
+	
+			gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf);
+			g_object_unref (pixbuf);	
+			if (tray_blink_id > -1)
+				g_source_remove (tray_blink_id);
+			tray_blink_id = -1;
+			gtk_tooltips_set_tip (tooltips, tray_event_box, NULL, NULL);
 
 			ep = e_popup_new("org.gnome.evolution.alarmNotify.popup");
 			for (i=0;i<sizeof(tray_items)/sizeof(tray_items[0]);i++)
@@ -1004,21 +1212,69 @@ tray_icon_clicked_cb (GtkWidget *widget,
 static gboolean
 tray_icon_blink_cb (gpointer data)
 {
-	TrayIconData *tray_data = data;
 	GdkPixbuf *pixbuf;
 
-	tray_data->blink_state = tray_data->blink_state == TRUE ? FALSE : TRUE;
-	pixbuf = e_icon_factory_get_icon  (tray_data->blink_state == TRUE ?
+	tray_blink_state = tray_blink_state == TRUE ? FALSE: TRUE;
+	pixbuf = e_icon_factory_get_icon  (tray_blink_state == TRUE ?
 					   "stock_appointment-reminder-excl" :
 					   "stock_appointment-reminder",
 					   E_ICON_SIZE_LARGE_TOOLBAR);
 
-	gtk_image_set_from_pixbuf (GTK_IMAGE (tray_data->image), pixbuf);
+	gtk_image_set_from_pixbuf (GTK_IMAGE (tray_image), pixbuf);
 	g_object_unref (pixbuf);
 
 	return TRUE;
 }
 
+static char *
+calculate_time (time_t start, time_t end)
+{
+	time_t difference = end - start;
+	char *str;
+	
+	if (difference < 60) {/* Can't be zero */ 
+		str = g_strdup_printf (_("(%d seconds)"), (int) difference);
+	} else if (difference > 60 && difference < 3600) { /* It will be x minutes y seconds*/
+		int minutes, seconds;
+		minutes = difference / 60;
+		seconds = difference % 60;
+		if (seconds)
+			str = g_strdup_printf (_("(%d %s %d %s)"), minutes, ngettext (_("minute"), _("minutes"), minutes), seconds, ngettext(_("second"), _("seconds"), seconds));
+		else 
+			str = g_strdup_printf (_("(%d %s)"), minutes, ngettext(_("minute"), _("minutes"), minutes));
+	} else {
+		guint hours, minutes, seconds;
+		char *s_hours = NULL, *s_minutes = NULL, *s_seconds = NULL;
+		
+		hours = difference / 3600;
+		minutes = (difference % 3600)/60;
+		seconds = difference % 60;
+
+
+		if (seconds)
+			s_seconds = g_strdup_printf (ngettext(_(" %u second"), _(" %u seconds"), seconds), seconds);	
+		if (minutes)
+			s_minutes = g_strdup_printf (ngettext(_(" %u minute"), _(" %u minutes"), minutes), minutes);
+		if (hours)
+			s_hours = g_strdup_printf (ngettext(_("%u hour"),_("%u hours"), hours), hours);
+
+		if (s_minutes && s_seconds)
+			str = g_strconcat ("(", s_hours, s_minutes, s_seconds, ")", NULL);
+		else if (s_minutes)
+			str = g_strconcat ("(", s_hours, s_minutes, ")", NULL);
+		else if (s_seconds)
+			str = g_strconcat ("(", s_hours, s_seconds, ")", NULL);
+		else 
+			str = g_strconcat ("(", s_hours, ")", NULL);
+
+		g_free (s_hours);
+		g_free (s_minutes);
+		g_free (s_seconds);
+	}
+
+	return str;
+}
+
 /* Performs notification of a display alarm */
 static void
 display_notification (time_t trigger, CompQueuedAlarms *cqa,
@@ -1027,13 +1283,14 @@ display_notification (time_t trigger, Co
 	QueuedAlarm *qa;
 	ECalComponent *comp;
 	const char *summary, *description, *location;
-	GtkWidget *tray_icon, *image, *ebox;
+	GtkWidget *tray_icon=NULL, *image=NULL;
 	GtkTooltips *tooltips;
 	TrayIconData *tray_data;
 	ECalComponentText text;
 	GSList *text_list;
-	char *str, *start_str, *end_str, *alarm_str;
+	char *str, *start_str, *end_str, *alarm_str, *time_str;
 	icaltimezone *current_zone;
+	ECalComponentOrganizer organiser;
 
 	comp = cqa->alarms->comp;
 	qa = lookup_queued_alarm (cqa, alarm_id);
@@ -1042,6 +1299,7 @@ display_notification (time_t trigger, Co
 	
 	/* get a sensible description for the event */
 	e_cal_component_get_summary (comp, &text);
+	e_cal_component_get_organizer (comp, &organiser); 
 
 	if (text.value)
 		summary = text.value;
@@ -1070,30 +1328,14 @@ display_notification (time_t trigger, Co
 	/* create the tray icon */
 	tooltips = gtk_tooltips_new ();
 
-	tray_icon = GTK_WIDGET (egg_tray_icon_new (qa->instance->auid));
-	image = e_icon_factory_get_image  ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR);
-	ebox = gtk_event_box_new ();
-
-	gtk_widget_show (image);
-	gtk_widget_show (ebox);
-
 	current_zone = config_data_get_timezone ();
 	alarm_str = timet_to_str_with_zone (trigger, current_zone);
 	start_str = timet_to_str_with_zone (qa->instance->occur_start, current_zone);
 	end_str = timet_to_str_with_zone (qa->instance->occur_end, current_zone);
-	str = g_strdup_printf (_("Alarm on %s\n%s\nStarting at %s\nEnding at %s"),
-			       alarm_str, summary, start_str, end_str);
-	gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), ebox, str, str);
-	g_free (start_str);
-	g_free (end_str);
-	g_free (alarm_str);
-	g_free (str);
-	
-	g_object_set_data (G_OBJECT (tray_icon), "image", image);
-	g_object_set_data (G_OBJECT (tray_icon), "available", GINT_TO_POINTER (1));
+	time_str = calculate_time (qa->instance->occur_start, qa->instance->occur_end);
 
-	gtk_container_add (GTK_CONTAINER (ebox), image);
-	gtk_container_add (GTK_CONTAINER (tray_icon), ebox);
+	str = g_strdup_printf ("%s\n%s %s",
+			       summary, start_str, time_str);
 
 	/* create the private structure */
 	tray_data = g_new0 (TrayIconData, 1);
@@ -1103,32 +1345,136 @@ display_notification (time_t trigger, Co
 	tray_data->trigger = trigger;
 	tray_data->cqa = cqa;
 	tray_data->alarm_id = alarm_id;
-	tray_data->comp = e_cal_component_clone (comp);
+	tray_data->comp = g_object_ref (e_cal_component_clone (comp));
 	tray_data->client = cqa->parent_client->client;
 	tray_data->query = g_object_ref (cqa->parent_client->query);
 	tray_data->image = image;
 	tray_data->blink_state = FALSE;
+	tray_data->snooze_set = FALSE;
 	g_object_ref (tray_data->client);
 	tray_data->tray_icon = tray_icon;
 
 	tray_icons_list = g_list_prepend (tray_icons_list, tray_data);
 
-	g_signal_connect (G_OBJECT (tray_icon), "destroy",
-			  G_CALLBACK (tray_icon_destroyed_cb), tray_data);
-	g_signal_connect (G_OBJECT (ebox), "button_press_event",
-			  G_CALLBACK (tray_icon_clicked_cb), tray_data);
+	if (g_list_length (tray_icons_list) > 1) {
+		char *tip;
+
+		tip =  g_strdup_printf (_("You have %d alarms"), g_list_length (tray_icons_list));
+		gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), tray_event_box, tip, NULL);
+		g_free (tip);
+	}
+	else 
+		gtk_tooltips_set_tip (GTK_TOOLTIPS (tooltips), tray_event_box, str, NULL);
+
+	g_free (start_str);
+	g_free (end_str);
+	g_free (alarm_str);
+	g_free (time_str);
+	g_free (str);
+
 	g_signal_connect (G_OBJECT (tray_data->query), "objects_removed",
 			  G_CALLBACK (on_dialog_objs_removed_cb), tray_data);
 
+	// FIXME: We should remove this check
 	if (!config_data_get_notify_with_tray ()) {
 		tray_data->blink_id = -1;
+		printf ("\n Entered here dude !! \n");
 		open_alarm_dialog (tray_data);
 		gtk_window_stick (GTK_WINDOW (alarm_notifications_dialog->dialog));
 	} else {
-		tray_data->blink_id = g_timeout_add (500, tray_icon_blink_cb, tray_data);
-		gtk_widget_show (tray_icon);
+		if (tray_blink_id == -1)
+			tray_blink_id = g_timeout_add (500, tray_icon_blink_cb, tray_data);
+	}
 	}
+
+#ifdef HAVE_LIBNOTIFY
+static void
+popup_notification (time_t trigger, CompQueuedAlarms *cqa,
+	            gpointer alarm_id, gboolean use_description)
+{
+	QueuedAlarm *qa;
+	ECalComponent *comp;
+	const char *summary, *location;
+	GtkTooltips *tooltips;
+	ECalComponentText text;
+	char *str, *start_str, *end_str, *alarm_str, *time_str;
+	icaltimezone *current_zone;
+	ECalComponentOrganizer organiser;
+	NotifyIcon *icon;
+	char *filename;
+	char *body;
+	
+	comp = cqa->alarms->comp;
+	qa = lookup_queued_alarm (cqa, alarm_id);
+	if (!qa)
+		return;
+	if (!notify_is_initted ())
+		notify_init("Evolution Alarm Notify");
+	filename = e_icon_factory_get_icon_filename ("stock_appointment-reminder", E_ICON_SIZE_DIALOG);
+	icon = notify_icon_new_from_uri (filename);
+	g_free (filename);
+	
+	/* get a sensible description for the event */
+	e_cal_component_get_summary (comp, &text);
+	e_cal_component_get_organizer (comp, &organiser); 
+
+
+	if (text.value)
+		summary = text.value;
+	else
+	        summary = _("No summary available.");
+
+	e_cal_component_get_location (comp, &location);
+
+	if (!location)
+	        location = _("No location information available.");
+
+	/* create the tray icon */
+	tooltips = gtk_tooltips_new ();
+
+	current_zone = config_data_get_timezone ();
+	alarm_str = timet_to_str_with_zone (trigger, current_zone);
+	start_str = timet_to_str_with_zone (qa->instance->occur_start, current_zone);
+	end_str = timet_to_str_with_zone (qa->instance->occur_end, current_zone);
+	time_str = calculate_time (qa->instance->occur_start, qa->instance->occur_end);
+
+	str = g_strdup_printf ("%s %s",
+			       start_str, time_str);
+
+	if (organiser.cn) {
+		if (location)
+			body = g_strdup_printf ("<b>%s</b>\n%s %s\n%s %s", organiser.cn, _("Location:"), location, start_str, time_str);
+		else
+			body = g_strdup_printf ("<b>%s</b>\n%s %s", organiser.cn, start_str, time_str);
+	}
+	else {
+		if (location)
+			body = g_strdup_printf ("%s %s\n%s %s", _("Location:"), location, start_str, time_str);
+		else
+			body = g_strdup_printf ("%s %s", start_str, time_str);			
+	}
+
+	if (!notify_send_notification (
+					NULL, "device", NOTIFY_URGENCY_NORMAL,
+					summary,
+					body, 	/* body text */
+					icon,			/* icon */
+					TRUE, 0,		/* expiry, server default */
+					NULL,			/* hints */
+					NULL,			/* no user_data */
+					0))			/* no actions */
+					g_warning ("Could not send notification to daemon\n");	
+
+	/* create the private structure */
+	g_free (start_str);
+	g_free (end_str);
+	g_free (alarm_str);
+	g_free (time_str);
+	g_free (str);
+
+
 }
+#endif
 
 /* Performs notification of an audio alarm */
 static void
@@ -1169,8 +1515,6 @@ audio_notification (time_t trigger, Comp
 	if (attach)
 		icalattach_unref (attach);
 
-	/* We present a notification message in addition to playing the sound */
-	display_notification (trigger, cqa, alarm_id, FALSE);
 }
 
 /* Performs notification of a mail alarm */
@@ -1182,8 +1526,6 @@ mail_notification (time_t trigger, CompQ
 
 	/* FIXME */
 
-	display_notification (trigger, cqa, alarm_id, FALSE);
-
 	dialog = gtk_dialog_new_with_buttons (_("Warning"),
 					      NULL, 0,
 					      GTK_STOCK_OK, GTK_RESPONSE_CANCEL,
@@ -1297,7 +1639,6 @@ procedure_notification (time_t trigger, 
 	if (result < 0)
 		goto fallback;
 
-	remove_queued_alarm (cqa, alarm_id, TRUE, TRUE);
 	return;
 
  fallback:
@@ -1333,8 +1674,10 @@ check_midnight_refresh (gpointer user_da
  * beginning of the program.
  **/
 void
-alarm_queue_init (void)
+alarm_queue_init (gpointer data)
 {
+	GtkWidget *tray_icon;
+	an = data;
 	g_return_if_fail (alarm_queue_inited == FALSE);
 
 	client_alarms_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
@@ -1348,6 +1691,19 @@ alarm_queue_init (void)
 
 	/* install timeout handler (every 30 mins) for not missing the midnight refresh */
 	g_timeout_add (1800000, (GSourceFunc) check_midnight_refresh, NULL);
+
+	tray_icon = GTK_WIDGET (egg_tray_icon_new ("Evolution Alarm"));
+	tray_image = e_icon_factory_get_image  ("stock_appointment-reminder", E_ICON_SIZE_LARGE_TOOLBAR);
+	tray_event_box = gtk_event_box_new ();
+	gtk_container_add (GTK_CONTAINER (tray_event_box), tray_image);
+	gtk_container_add (GTK_CONTAINER (tray_icon), tray_event_box);
+	g_signal_connect (G_OBJECT (tray_event_box), "button_press_event",
+			  G_CALLBACK (tray_icon_clicked_cb), NULL);
+	gtk_widget_show_all (tray_icon);
+
+#ifdef HAVE_LIBNOTIFY
+	notify_init("Evolution Alarms");
+#endif
 
 	alarm_queue_inited = TRUE;
 }
Index: alarm-queue.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/alarm-queue.h,v
retrieving revision 1.7
diff -u -p -w -r1.7 alarm-queue.h
--- alarm-queue.h	7 Nov 2003 05:52:01 -0000	1.7
+++ alarm-queue.h	2 Nov 2005 06:59:32 -0000
@@ -24,7 +24,7 @@
 #include <libecal/e-cal.h>
 
 
-void alarm_queue_init (void);
+void alarm_queue_init (gpointer);
 void alarm_queue_done (void);
 
 void alarm_queue_add_client (ECal *client);
Index: config-data.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/config-data.c,v
retrieving revision 1.12
diff -u -p -w -r1.12 config-data.c
--- config-data.c	18 May 2004 13:33:40 -0000	1.12
+++ config-data.c	2 Nov 2005 06:59:32 -0000
@@ -95,6 +95,82 @@ ensure_inited (void)
 
 }
 
+ESourceList *
+config_data_get_calendars (const char *key)
+{
+	ESourceList *cal_sources;
+	gboolean state;
+	GSList *gconf_list;
+	
+	if (!inited)
+		conf_client = gconf_client_get_default ();
+	
+	gconf_list = gconf_client_get_list (conf_client,
+					    key,
+					    GCONF_VALUE_STRING,
+					    NULL);
+	cal_sources = e_source_list_new_for_gconf (conf_client, key);
+
+	if (cal_sources && g_slist_length (gconf_list))
+		return cal_sources;
+
+	state = gconf_client_get_bool (conf_client, 
+				      "/apps/evolution/calendar/notify/notify_with_tray",
+				      NULL);
+	if (!state) /* Should be old client*/ {
+		GSList *source;
+		gconf_client_set_bool (conf_client, 
+				      "/apps/evolution/calendar/notify/notify_with_tray",
+				      TRUE,
+				      NULL);
+		source = gconf_client_get_list (conf_client,
+						"/apps/evolution/calendar/sources",
+						GCONF_VALUE_STRING,
+						NULL);
+		gconf_client_set_list (conf_client,
+				       key,
+				       GCONF_VALUE_STRING,
+				       source,
+				       NULL);
+		cal_sources = e_source_list_new_for_gconf (conf_client, key);
+	}
+	
+
+	return cal_sources;
+	
+}
+
+void
+config_data_replace_string_list (const char *key, 
+				 const char *old,
+				 const char *new)
+{
+	GSList *source, *tmp;
+
+	if (!inited)
+		conf_client = gconf_client_get_default ();
+
+	source = gconf_client_get_list (conf_client,
+					key,
+					GCONF_VALUE_STRING,
+					NULL);
+	for (tmp = source; tmp; tmp=tmp->next) {
+		if (strcmp (tmp->data, old) == 0) {
+			gboolean state;
+			g_free (tmp->data);
+
+			tmp->data = (gchar *) new;
+			state = gconf_client_set_list (conf_client,
+					       key,
+					       GCONF_VALUE_STRING,
+					       source,
+					       NULL);
+			break;
+		}
+		
+	}
+}
+
 GConfClient *
 config_data_get_conf_client (void)
 {
Index: config-data.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/alarm-notify/config-data.h,v
retrieving revision 1.7
diff -u -p -w -r1.7 config-data.h
--- config-data.h	18 May 2004 13:33:40 -0000	1.7
+++ config-data.h	2 Nov 2005 06:59:32 -0000
@@ -24,6 +24,7 @@
 #include <glib.h>
 #include <libical/ical.h>
 #include <gconf/gconf-client.h>
+#include <libedataserver/e-source-list.h>
 
 GConfClient  *config_data_get_conf_client (void);
 
@@ -34,5 +35,7 @@ void          config_data_set_last_notif
 time_t        config_data_get_last_notification_time (void);
 void          config_data_save_blessed_program (const char *program);
 gboolean      config_data_is_blessed_program (const char *program);
+ESourceList  *config_data_get_calendars (const char *);
+void	      config_data_replace_string_list (const char *, const char *, const char *);
 
 #endif


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]