diff options
-rwxr-xr-x | src/apoint.c | 101 |
1 files changed, 87 insertions, 14 deletions
diff --git a/src/apoint.c b/src/apoint.c index 6a7a859..18f10e6 100755 --- a/src/apoint.c +++ b/src/apoint.c @@ -1,8 +1,8 @@ -/* $calcurse: apoint.c,v 1.7 2006/12/15 15:25:09 culot Exp $ */ +/* $calcurse: apoint.c,v 1.8 2007/02/24 17:37:08 culot Exp $ */ /* * Calcurse - text-based organizer - * Copyright (c) 2004-2006 Frederic Culot + * Copyright (c) 2004-2007 Frederic Culot * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -51,13 +51,15 @@ int apoint_llist_init(void) return 0; } -apoint_llist_node_t *apoint_new(char *mesg, long start, long dur) +apoint_llist_node_t * +apoint_new(char *mesg, long start, long dur, char state) { apoint_llist_node_t *o, **i; o = (apoint_llist_node_t *) malloc(sizeof(apoint_llist_node_t)); o->mesg = (char *) malloc(strlen(mesg) + 1); strncpy(o->mesg, mesg, strlen(mesg) + 1); + o->state = state; o->start = start; o->dur = dur; @@ -108,7 +110,8 @@ void apoint_sec2str(apoint_llist_node_t *o, } } -void apoint_write(apoint_llist_node_t *o, FILE * f) +void +apoint_write(apoint_llist_node_t *o, FILE * f) { struct tm *lt; time_t t; @@ -116,17 +119,25 @@ void apoint_write(apoint_llist_node_t *o, FILE * f) t = o->start; lt = localtime(&t); fprintf(f, "%02u/%02u/%04u @ %02u:%02u", - lt->tm_mon + 1, lt->tm_mday, 1900 + lt->tm_year, - lt->tm_hour, lt->tm_min); + lt->tm_mon + 1, lt->tm_mday, 1900 + lt->tm_year, + lt->tm_hour, lt->tm_min); t = o->start + o->dur; lt = localtime(&t); - fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u |%s\n", - lt->tm_mon + 1, lt->tm_mday, 1900 + lt->tm_year, - lt->tm_hour, lt->tm_min, o->mesg); + fprintf(f, " -> %02u/%02u/%04u @ %02u:%02u ", + lt->tm_mon + 1, lt->tm_mday, 1900 + lt->tm_year, + lt->tm_hour, lt->tm_min); + + if (o->state & APOINT_NOTIFY) + fprintf(f, "!"); + else + fprintf(f, "|"); + + fprintf(f, "%s\n", o->mesg); } -apoint_llist_node_t *apoint_scan(FILE * f, struct tm start, struct tm end) +apoint_llist_node_t * +apoint_scan(FILE * f, struct tm start, struct tm end, char state) { struct tm *lt; char buf[MESG_MAXSIZE], *nl; @@ -155,7 +166,7 @@ apoint_llist_node_t *apoint_scan(FILE * f, struct tm start, struct tm end) fputs(_("FATAL ERROR in apoint_scan: date error in the appointment\n"), stderr); exit(EXIT_FAILURE); } - return apoint_new(buf, tstart, tend - tstart); + return apoint_new(buf, tstart, tend - tstart, state); } void apoint_delete_bynum(long start, unsigned num) @@ -206,9 +217,15 @@ void display_item_date(WINDOW *win, int incolor, apoint_llist_node_t *i, if (incolor == 0) custom_apply_attr(win, ATTR_HIGHEST); if (recur) - mvwprintw(win, y, x, " * %s -> %s", a_st, a_end); + if (i->state & APOINT_NOTIFY) + mvwprintw(win, y, x, " *!%s -> %s", a_st, a_end); + else + mvwprintw(win, y, x, " * %s -> %s", a_st, a_end); else - mvwprintw(win, y, x, " - %s -> %s", a_st, a_end); + if (i->state & APOINT_NOTIFY) + mvwprintw(win, y, x, " -!%s -> %s", a_st, a_end); + else + mvwprintw(win, y, x, " - %s -> %s", a_st, a_end); if (incolor == 0) custom_remove_attr(awin, ATTR_HIGHEST); } @@ -292,7 +309,7 @@ struct notify_app_s *apoint_check_next(struct notify_app_s *app, long start) } /* - * Returns a structure of type aopint_llist_t given a structure of type + * Returns a structure of type apoint_llist_t given a structure of type * recur_apoint_s */ apoint_llist_node_t *apoint_recur_s2apoint_s( @@ -307,3 +324,59 @@ apoint_llist_node_t *apoint_recur_s2apoint_s( a->mesg = p->mesg; return a; } + +/* + * Switch notification state. + */ +void +apoint_switch_notify(int year, int month, int day, int item_num) +{ + apoint_llist_node_t *apoint; + struct day_item_s *p; + long date; + int apoint_nb, n, need_chk_notify; + + p = day_get_item(item_num); + if (p->type != APPT && p->type != RECUR_APPT) + return; + + date = date2sec(year, month, day, 0, 0); + + if (p->type == RECUR_APPT) { + recur_apoint_switch_notify(date, p->appt_pos); + return; + } else if (p->type == APPT) + apoint_nb = day_item_nb(date, item_num, APPT); + + n = 0; + need_chk_notify = 0; + pthread_mutex_lock(&(alist_p->mutex)); + + for (apoint = alist_p->root; apoint != 0; apoint = apoint->next) { + if (apoint_inday(apoint, date)) { + if (n == apoint_nb) { + apoint->state ^= APOINT_NOTIFY; + if (notify_bar()) { + if (apoint->state & APOINT_NOTIFY) + notify_check_added(apoint->mesg, + apoint->start); + else + need_chk_notify = + notify_same_item( + apoint->start); + } + pthread_mutex_unlock(&(alist_p->mutex)); + if (need_chk_notify) + notify_check_next_app(); + return; + } + n++; + } + } + pthread_mutex_unlock(&(alist_p->mutex)); + + /* NOTREACHED */ + fputs(_("FATAL ERROR in apoint_switch_notify: no such appointment\n"), + stderr); + exit(EXIT_FAILURE); +} |