From: <si...@us...> - 2008-05-28 00:17:09
|
Revision: 426 http://osmo-pim.svn.sourceforge.net/osmo-pim/?rev=426&view=rev Author: silloz Date: 2008-05-27 17:17:07 -0700 (Tue, 27 May 2008) Log Message: ----------- * Task reminder framework, part 1 Modified Paths: -------------- trunk/src/check_events.c trunk/src/check_events.h trunk/src/gui.c Modified: trunk/src/check_events.c =================================================================== --- trunk/src/check_events.c 2008-05-27 22:15:50 UTC (rev 425) +++ trunk/src/check_events.c 2008-05-28 00:17:07 UTC (rev 426) @@ -31,60 +31,280 @@ #include "i18n.h" #include "calendar.h" #include "gui.h" +#include "gui_utils.h" #include "calendar_notes.h" #include "options_prefs.h" #include "check_events.h" #include "time_utils.h" #include "date_utils.h" #include "stock_icons.h" +#include "tasks.h" +#include "tasks_items.h" +typedef struct { + guint id; + NotifyNotification *notify; + TASK_ITEM *item; +} TASK_NTF; + /*------------------------------------------------------------------------------*/ -gboolean -time_handler (GUI *appGUI) { +void +free_notifications_list (GUI *appGUI) +{ +GSList *node; +TASK_NTF *a; +guint i; + for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + notify_notification_close (a->notify, NULL); + } + + for (i = 0, node = appGUI->tsk->notifications; node != NULL; node = node->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + if (a->item != NULL) { + g_free (a->item); + } + } + + if (appGUI->tsk->notifications != NULL) { + g_slist_free (appGUI->tsk->notifications); + appGUI->tsk->notifications = NULL; + } +} + +/*------------------------------------------------------------------------------*/ + +void +tsk_done_callback (NotifyNotification *n, const char *action, gpointer user_data) +{ +GtkTreeIter *iter; +GSList *tnode; +TASK_NTF *a; +guint i; +gchar tmpbuf[BUFFER_SIZE]; + + GUI *appGUI = (GUI *)user_data; + + for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + if (a->notify == n) { + + iter = task_get_iter (a->id, appGUI); + + if (iter != NULL) { + if (a->item->repeat == TRUE) { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_DUE_DATE_JULIAN, a->item->due_date_julian + 1, + TA_COLUMN_DUE_DATE, get_date_time_full_str (a->item->due_date_julian + 1, a->item->due_time), + TA_COLUMN_ACTIVE, TRUE, + -1); + } else { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_DONE, TRUE, -1); + } + } else { + sprintf (tmpbuf, "%s\n%s", _("Cannot perform selected operation."), _("Task has been modified or removed.")); + gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW(appGUI->main_window)); + } + + break; + } + } + + notify_notification_close (a->notify, NULL); + if (a->item != NULL) { + g_free (a->item); + } + appGUI->tsk->notifications = g_slist_remove (appGUI->tsk->notifications, a); + +} + +/*------------------------------------------------------------------------------*/ + +void +tsk_postpone_callback (NotifyNotification *n, const char *action, gpointer user_data) +{ +GtkTreeIter *iter; +GSList *tnode; +TASK_NTF *a; +guint i; +gchar tmpbuf[BUFFER_SIZE]; + + GUI *appGUI = (GUI *)user_data; + + for (i = 0, tnode = appGUI->tsk->notifications; tnode != NULL; tnode = tnode->next, i++) { + a = g_slist_nth_data (appGUI->tsk->notifications, i); + if (a->notify == n) { + + iter = task_get_iter (a->id, appGUI); + + if (iter != NULL) { + gtk_list_store_set (appGUI->tsk->tasks_list_store, iter, + TA_COLUMN_ACTIVE, TRUE, -1); + } else { + sprintf (tmpbuf, "%s\n%s", _("Cannot perform selected operation."), _("Task has been modified or removed.")); + gui_create_dialog (GTK_MESSAGE_INFO, tmpbuf, GTK_WINDOW(appGUI->main_window)); + } + + break; + } + } + + notify_notification_close (a->notify, NULL); + if (a->item != NULL) { + g_free (a->item); + } + appGUI->tsk->notifications = g_slist_remove (appGUI->tsk->notifications, a); + +} + +/*------------------------------------------------------------------------------*/ + +void +tsk_show_callback (NotifyNotification *n, const char *action, gpointer user_data) +{ + +} + +/*------------------------------------------------------------------------------*/ + +gboolean +notify_tasks (GUI *appGUI) +{ +gchar tmpbuf[BUFFER_SIZE]; +gchar tmpbuf2[BUFFER_SIZE]; guint32 current_date; gint current_time; - update_clock (appGUI); +GtkTreeIter iter; +TASK_ITEM *item; +TASK_NTF *a; +gint i; current_date = get_julian_for_today (); current_time = get_seconds_for_today (); - /* check tasks */ + i = 0; - /* check contacts */ + while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, NULL, i++)) { - /* check notes */ + item = get_task_item (&iter, appGUI); + if (item != NULL) { + if (item->active == TRUE && item->done == FALSE) { + + if (item->due_date_julian < current_date || + (item->due_date_julian == current_date && item->due_time < current_time)) { + + if (item->offline_ignore == FALSE || item->due_date_julian > config.lastrun_date || + (item->due_date_julian == config.lastrun_date && item->due_time > config.lastrun_time)) { + + sprintf (tmpbuf2, "<i>%s</i>", get_date_time_full_str (item->due_date_julian, item->due_time)); + strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); + if (item->desc != NULL) { + if (strlen (item->desc)) { + sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); + } + } + + a = g_malloc (sizeof (TASK_NTF)); + g_assert (a != NULL); + + gtk_tree_model_get (GTK_TREE_MODEL (appGUI->tsk->tasks_list_store), &iter, TA_COLUMN_ID, &(a->id), -1); + a->item = get_task_item (&iter, appGUI); + a->notify = notify_notification_new (item->summary, tmpbuf, GTK_STOCK_DIALOG_WARNING, NULL); + + notify_notification_set_timeout (a->notify, NOTIFY_EXPIRES_NEVER); + switch (get_priority_index (item->priority)) { + case 0: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_LOW); break; + case 1: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_NORMAL); break; + case 2: notify_notification_set_urgency (a->notify, NOTIFY_URGENCY_CRITICAL); break; + } + notify_notification_add_action (a->notify, "postpone", "Postpone", + (NotifyActionCallback)tsk_postpone_callback, appGUI, NULL); + notify_notification_add_action (a->notify, "show_task", "Show task", + (NotifyActionCallback)tsk_show_callback, appGUI, NULL); + notify_notification_add_action (a->notify, "done", "Done", + (NotifyActionCallback)tsk_done_callback, appGUI, NULL); + + if (!notify_notification_show (a->notify, NULL)) { + g_warning ("Failed to send notification"); + return FALSE; + } + + appGUI->tsk->notifications = g_slist_append (appGUI->tsk->notifications, a); + + gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, + TA_COLUMN_ACTIVE, FALSE, -1); + } + + } else if (item->warning_days != 0) { +/* } else if (item->warning_date != 0 && (item->warning_date < current_date || + (item->warning_date == current_date && item->warning_time < current_time))) { + message.iter = iter; + message.item = get_task_item (&iter, appGUI); + message.appGUI = appGUI; + + sprintf (tmpbuf2, "<b>%s</b>\n<i>%s</i>", + item->summary, get_date_time_full_str (item->due_date_julian, item->due_time)); + strncpy (tmpbuf, tmpbuf2, BUFFER_SIZE); + if (item->desc != NULL) { + if (strlen (item->desc)) { + sprintf (tmpbuf, "%s\n%.100s", tmpbuf2, item->desc); + } + } + + n = notify_notification_new (_("Alarm warning!"), tmpbuf, GTK_STOCK_DIALOG_INFO, NULL); + notify_notification_set_timeout (n, NOTIFY_EXPIRES_NEVER); + notify_notification_set_urgency (n, NOTIFY_URGENCY_NORMAL); + notify_notification_add_action (n, "show_task", "Show task", + (NotifyActionCallback)tsk_show_callback, &message, NULL); + + if (!notify_notification_show (n, NULL)) { + g_warning ("Failed to send notification"); + return FALSE; + } + gtk_list_store_set (appGUI->tsk->tasks_list_store, &iter, + TA_COLUMN_WARNING_DAYS, 0, -1); +*/ + } + + } + + task_item_free (item); + } + } + return TRUE; } /*------------------------------------------------------------------------------*/ -gboolean -notify_message (gchar *title, gchar *message, gchar *stock_icon, guint32 timeout) { +gboolean +time_handler (GUI *appGUI) +{ +static gint counter = 0; -NotifyNotification *n; + update_clock (appGUI); - n = notify_notification_new (title, message, stock_icon, NULL); + if (counter == 0) { + /* check tasks */ + notify_tasks (appGUI); - notify_notification_set_timeout (n, timeout); - - if (!notify_notification_show(n, NULL)) { - g_warning("Failed to send notification"); - return FALSE; + /* check contacts */ + /* check notes */ } + counter = (counter + 1) % 60; - g_object_unref(G_OBJECT(n)); - - return TRUE; + return TRUE; } /*------------------------------------------------------------------------------*/ gboolean -check_tasks_contacts(guint32 julian_day, GUI *appGUI) { +check_tasks_contacts (guint32 julian_day, GUI *appGUI) { if (appGUI->calendar_only == TRUE || appGUI->all_pages_added == FALSE) { return FALSE; Modified: trunk/src/check_events.h =================================================================== --- trunk/src/check_events.h 2008-05-27 22:15:50 UTC (rev 425) +++ trunk/src/check_events.h 2008-05-28 00:17:07 UTC (rev 426) @@ -25,6 +25,10 @@ #include <stdio.h> #include <stdlib.h> +#include <gtk/gtk.h> + +#include "tasks.h" + enum { CE_COLUMN_DATE = 0, CE_COLUMN_DATE_JULIAN, @@ -33,8 +37,8 @@ CHECK_EVENTS_NUM_COLUMNS }; +void free_notifications_list (GUI *appGUI); gboolean time_handler (GUI *appGUI); -gboolean notify_message (gchar *title, gchar *message, gchar *stockicon, guint32 timeout); gboolean check_tasks (guint32 julian_day, GUI *appGUI); gboolean check_contacts (guint32 julian_day, GUI *appGUI); gboolean check_tasks_contacts (guint32 julian_day, GUI *appGUI); Modified: trunk/src/gui.c =================================================================== --- trunk/src/gui.c 2008-05-27 22:15:50 UTC (rev 425) +++ trunk/src/gui.c 2008-05-28 00:17:07 UTC (rev 426) @@ -138,6 +138,7 @@ pango_font_description_free(appGUI->fd_notes_editor); if (appGUI->calendar_only == FALSE) { + free_notifications_list (appGUI); write_notes (appGUI); free_notes_list(appGUI); write_tasks_entries(appGUI); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |