diff options
-rw-r--r-- | src/apoint.c | 10 | ||||
-rw-r--r-- | src/args.c | 130 | ||||
-rw-r--r-- | src/calcurse.h | 2 | ||||
-rw-r--r-- | src/day.c | 11 | ||||
-rw-r--r-- | src/notify.c | 16 | ||||
-rw-r--r-- | src/recur.c | 17 |
6 files changed, 115 insertions, 71 deletions
diff --git a/src/apoint.c b/src/apoint.c index ab3fab5..6fd9e64 100644 --- a/src/apoint.c +++ b/src/apoint.c @@ -516,7 +516,7 @@ apoint_delete_bynum (long start, unsigned num, enum eraseflg flag) erase_note (&apt->note, flag); mem_free (apt); if (need_check_notify) - notify_check_next_app (); + notify_check_next_app (0); break; } @@ -657,13 +657,13 @@ apoint_switch_notify (void) need_chk_notify = 0; LLIST_TS_LOCK (&alist_p); - struct apoint *apt = apoint_get (apoint_nb, date); + struct apoint *apt = apoint_get (date, apoint_nb); apt->state ^= APOINT_NOTIFY; if (notify_bar ()) notify_check_added (apt->mesg, apt->start, apt->state); if (need_chk_notify) - notify_check_next_app (); + notify_check_next_app (0); LLIST_TS_UNLOCK (&alist_p); } @@ -729,5 +729,9 @@ apoint_paste_item (void) (void)apoint_new (bkp_cut_apoint.mesg, bkp_cut_apoint.note, bkp_start, bkp_cut_apoint.dur, bkp_cut_apoint.state); + + if (notify_bar ()) + notify_check_added (bkp_cut_apoint.mesg, bkp_start, bkp_cut_apoint.state); + apoint_free_bkp (ERASE_FORCE_KEEP_NOTE); } @@ -345,7 +345,7 @@ static int app_arg (int add_line, struct date *day, long date, int print_note, struct conf *conf, regex_t *regex) { - llist_item_t *i; + llist_item_t *i, *j; long today; unsigned print_date = 1; int app_found = 0; @@ -411,72 +411,98 @@ app_arg (int add_line, struct date *day, long date, int print_note, } /* Same process is performed but this time on the appointments. */ + LLIST_TS_LOCK (&alist_p); LLIST_TS_LOCK (&recur_alist_p); - LLIST_TS_FIND_FOREACH (&recur_alist_p, today, recur_apoint_inday, i) - { - struct recur_apoint *ra = LLIST_TS_GET_DATA (i); - struct apoint *apt; - if (regex && regexec (regex, ra->mesg, 0, 0, 0) != 0) - continue; + /* + * Iterate over regular appointments and recurrent ones simultaneously (fixes + * http://lists.calcurse.org/bugs/msg00002.html). + */ + i = LLIST_TS_FIND_FIRST (&alist_p, today, apoint_inday); + j = LLIST_TS_FIND_FIRST (&recur_alist_p, today, recur_apoint_inday); + while (i || j) + { + struct apoint *apt = LLIST_TS_GET_DATA (i); + struct recur_apoint *ra = LLIST_TS_GET_DATA (j); - app_found = 1; - if (add_line) + while (i && regex && regexec (regex, apt->mesg, 0, 0, 0) != 0) { - fputs ("\n", stdout); - add_line = 0; + i = LLIST_TS_FIND_NEXT (i, today, apoint_inday); + apt = LLIST_TS_GET_DATA (i); } - if (print_date) + + while (j && regex && regexec (regex, ra->mesg, 0, 0, 0) != 0) { - arg_print_date (today, conf); - print_date = 0; + j = LLIST_TS_FIND_NEXT (j, today, recur_apoint_inday); + ra = LLIST_TS_GET_DATA (j); } - apt = apoint_recur_s2apoint_s (ra); - apoint_sec2str (apt, RECUR_APPT, today, apoint_start_time, - apoint_end_time); - mem_free (apt->mesg); - mem_free (apt); - fputs (" - ", stdout); - fputs (apoint_start_time, stdout); - fputs (" -> ", stdout); - fputs (apoint_end_time, stdout); - fputs ("\n\t", stdout); - fputs (ra->mesg, stdout); - fputs ("\n", stdout); - if (print_note && ra->note) - print_notefile (stdout, ra->note, 2); - } - LLIST_TS_UNLOCK (&recur_alist_p); - LLIST_TS_LOCK (&alist_p); - LLIST_TS_FIND_FOREACH (&alist_p, today, apoint_inday, i) - { - struct apoint *apt = LLIST_TS_GET_DATA (i); - if (regex && regexec (regex, apt->mesg, 0, 0, 0) != 0) - continue; + if (apt && ra) + { + if (apt->start <= recur_apoint_inday (ra, today)) + ra = NULL; + else + apt = NULL; + } - app_found = 1; - if (add_line) + if (apt) { + app_found = 1; + if (add_line) + { + fputs ("\n", stdout); + add_line = 0; + } + if (print_date) + { + arg_print_date (today, conf); + print_date = 0; + } + apoint_sec2str (apt, APPT, today, apoint_start_time, apoint_end_time); + fputs (" - ", stdout); + fputs (apoint_start_time, stdout); + fputs (" -> ", stdout); + fputs (apoint_end_time, stdout); + fputs ("\n\t", stdout); + fputs (apt->mesg, stdout); fputs ("\n", stdout); - add_line = 0; + if (print_note && apt->note) + print_notefile (stdout, apt->note, 2); + i = LLIST_TS_FIND_NEXT (i, today, apoint_inday); } - if (print_date) + else if (ra) { - arg_print_date (today, conf); - print_date = 0; + app_found = 1; + if (add_line) + { + fputs ("\n", stdout); + add_line = 0; + } + if (print_date) + { + arg_print_date (today, conf); + print_date = 0; + } + apt = apoint_recur_s2apoint_s (ra); + apoint_sec2str (apt, RECUR_APPT, today, apoint_start_time, + apoint_end_time); + mem_free (apt->mesg); + mem_free (apt); + fputs (" - ", stdout); + fputs (apoint_start_time, stdout); + fputs (" -> ", stdout); + fputs (apoint_end_time, stdout); + fputs ("\n\t", stdout); + fputs (ra->mesg, stdout); + fputs ("\n", stdout); + if (print_note && ra->note) + print_notefile (stdout, ra->note, 2); + apt = NULL; + j = LLIST_TS_FIND_NEXT (j, today, recur_apoint_inday); } - apoint_sec2str (apt, APPT, today, apoint_start_time, apoint_end_time); - fputs (" - ", stdout); - fputs (apoint_start_time, stdout); - fputs (" -> ", stdout); - fputs (apoint_end_time, stdout); - fputs ("\n\t", stdout); - fputs (apt->mesg, stdout); - fputs ("\n", stdout); - if (print_note && apt->note) - print_notefile (stdout, apt->note, 2); } + + LLIST_TS_UNLOCK (&recur_alist_p); LLIST_TS_UNLOCK (&alist_p); return (app_found); diff --git a/src/calcurse.h b/src/calcurse.h index ee8e2f9..1a63657 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -768,7 +768,7 @@ void notify_update_bar (void); unsigned notify_get_next (struct notify_app *); unsigned notify_get_next_bkgd (void); char *notify_app_txt (void); -void notify_check_next_app (void); +void notify_check_next_app (int); void notify_check_added (char *, long, char); void notify_check_repeated (struct recur_apoint *); int notify_same_item (long); @@ -781,6 +781,7 @@ day_edit_item (struct conf *conf) struct apoint *a; long date; int item_num, ch; + int need_check_notify = 0; item_num = apoint_hilt (); p = day_get_item (item_num); @@ -820,15 +821,19 @@ day_edit_item (struct conf *conf) switch (ch) { case STRT: + need_check_notify = 1; update_start_time (&ra->start, &ra->dur); break; case END: update_duration (&ra->start, &ra->dur); break; case DESC: + if (notify_bar ()) + need_check_notify = notify_same_recur_item (ra); update_desc (&ra->mesg); break; case REPT: + need_check_notify = 1; update_rept (&ra->rpt, ra->start, conf); break; case KEY_GENERIC_CANCEL: @@ -844,12 +849,15 @@ day_edit_item (struct conf *conf) switch (ch) { case STRT: + need_check_notify = 1; update_start_time (&a->start, &a->dur); break; case END: update_duration (&a->start, &a->dur); break; case DESC: + if (notify_bar ()) + need_check_notify = notify_same_item (a->start); update_desc (&a->mesg); break; case KEY_GENERIC_CANCEL: @@ -857,6 +865,9 @@ day_edit_item (struct conf *conf) } break; } + + if (need_check_notify) + notify_check_next_app (1); } /* diff --git a/src/notify.c b/src/notify.c index 14a5f0c..1b7e924 100644 --- a/src/notify.c +++ b/src/notify.c @@ -306,7 +306,7 @@ notify_update_bar (void) notify_app.got_app = 0; pthread_mutex_unlock (¬ify_app.mutex); pthread_mutex_unlock (¬ify.mutex); - notify_check_next_app (); + notify_check_next_app (0); return; } } @@ -353,7 +353,7 @@ notify_main_thread (void *arg) got_app = notify_app.got_app; pthread_mutex_unlock (¬ify_app.mutex); if (!got_app) - notify_check_next_app (); + notify_check_next_app (0); } } pthread_exit ((void *) 0); @@ -427,6 +427,7 @@ static void * notify_thread_app (void *arg) { struct notify_app tmp_app; + int force = (arg ? 1 : 0); if (!notify_get_next (&tmp_app)) pthread_exit ((void *)0); @@ -439,7 +440,7 @@ notify_thread_app (void *arg) } else { - if (!notify_same_item (tmp_app.time)) + if (force || !notify_same_item (tmp_app.time)) { pthread_mutex_lock (¬ify_app.mutex); notify_update_app (tmp_app.time, tmp_app.state, tmp_app.txt); @@ -456,12 +457,13 @@ notify_thread_app (void *arg) /* Launch the thread notify_thread_app to look for next appointment. */ void -notify_check_next_app (void) +notify_check_next_app (int force) { pthread_t notify_t_app; + void *arg = (force ? (void *)1 : (void *)0); pthread_create (¬ify_t_app, &detached_thread_attr, notify_thread_app, - (void *)0); + arg); return; } @@ -508,7 +510,7 @@ notify_check_repeated (struct recur_apoint *i) pthread_mutex_lock (¬ify_app.mutex); if ((real_app_time = recur_item_inday (i->start, &i->exc, i->rpt->type, i->rpt->freq, i->rpt->until, - get_today ()) > current_time)) + get_today ()))) { if (!notify_app.got_app) { @@ -566,7 +568,7 @@ void notify_start_main_thread (void) { pthread_create (¬ify_t_main, NULL, notify_main_thread, NULL); - notify_check_next_app (); + notify_check_next_app (0); } /* diff --git a/src/recur.c b/src/recur.c index b757400..dbc52ee 100644 --- a/src/recur.c +++ b/src/recur.c @@ -811,7 +811,7 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole, erase_note (&rapt->note, flag); mem_free (rapt); if (need_check_notify) - notify_check_next_app (); + notify_check_next_app (0); break; } } @@ -819,7 +819,7 @@ recur_apoint_erase (long start, unsigned num, unsigned delete_whole, { recur_add_exc (&rapt->exc, start); if (need_check_notify) - notify_check_next_app (); + notify_check_next_app (0); } LLIST_TS_UNLOCK (&recur_alist_p); } @@ -1004,9 +1004,9 @@ recur_exc_scan (llist_t *lexc, FILE *data_file) } static int -recur_apoint_starts_after (struct recur_apoint *rapt, long time) +recur_apoint_starts_before (struct recur_apoint *rapt, long time) { - return (rapt->start > time); + return (rapt->start < time); } /* @@ -1020,9 +1020,7 @@ recur_apoint_check_next (struct notify_app *app, long start, long day) long real_recur_start_time; LLIST_TS_LOCK (&recur_alist_p); - i = LLIST_TS_FIND_FIRST (&recur_alist_p, start, recur_apoint_starts_after); - - if (i) + LLIST_TS_FIND_FOREACH (&recur_alist_p, app->time, recur_apoint_starts_before, i) { struct recur_apoint *rapt = LLIST_TS_GET_DATA (i); @@ -1035,7 +1033,6 @@ recur_apoint_check_next (struct notify_app *app, long start, long day) app->got_app = 1; } } - LLIST_TS_UNLOCK (&recur_alist_p); return (app); @@ -1144,5 +1141,9 @@ recur_apoint_paste_item (void) bkp_cut_recur_apoint.rpt->freq, bkp_cut_recur_apoint.rpt->until, &bkp_cut_recur_apoint.exc); + + if (notify_bar ()) + notify_check_repeated (&bkp_cut_recur_apoint); + recur_apoint_free_bkp (ERASE_FORCE_KEEP_NOTE); } |