Improve performance of recur_prev_occurrence()
And fix item start day for prev command Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk> Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
This commit is contained in:
parent
3599766cee
commit
1efe24105e
@ -623,8 +623,12 @@ static inline void key_generic_cmd(void)
|
|||||||
warnbox(error_msg);
|
warnbox(error_msg);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
day = date2sec(*ui_calendar_get_slctd_day(), 0, 0);
|
|
||||||
item = ui_day_get_sel();
|
item = ui_day_get_sel();
|
||||||
|
/*
|
||||||
|
* The selected day need not be the (item) start day
|
||||||
|
* for multi-day occurrences.
|
||||||
|
*/
|
||||||
|
day = DAY(item->start);
|
||||||
if (item->type == RECUR_EVNT) {
|
if (item->type == RECUR_EVNT) {
|
||||||
rev = item->item.rev;
|
rev = item->item.rev;
|
||||||
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,
|
more = recur_next_occurrence(rev->day, -1, rev->rpt, &rev->exc,
|
||||||
|
@ -142,6 +142,7 @@
|
|||||||
*/
|
*/
|
||||||
#define DAYINSEC (DAYINMIN * MININSEC)
|
#define DAYINSEC (DAYINMIN * MININSEC)
|
||||||
#define NEXTDAY(date) date_sec_change((date), 0, 1)
|
#define NEXTDAY(date) date_sec_change((date), 0, 1)
|
||||||
|
#define PREVDAY(date) date_sec_change((date), 0, -1)
|
||||||
#define DAYLEN(date) (NEXTDAY(date) - (date))
|
#define DAYLEN(date) (NEXTDAY(date) - (date))
|
||||||
#define ENDOFDAY(date) (NEXTDAY(date) - 1)
|
#define ENDOFDAY(date) (NEXTDAY(date) - 1)
|
||||||
#define HOURINSEC (HOURINMIN * MININSEC)
|
#define HOURINSEC (HOURINMIN * MININSEC)
|
||||||
|
25
src/recur.c
25
src/recur.c
@ -1852,19 +1852,20 @@ int recur_nth_occurrence(time_t s, long d, struct rpt *r, llist_t *e, int n,
|
|||||||
int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
|
int recur_prev_occurrence(time_t s, long d, struct rpt *r, llist_t *e,
|
||||||
time_t day, time_t *prev)
|
time_t day, time_t *prev)
|
||||||
{
|
{
|
||||||
time_t prev_day, next;
|
int ret = 0;
|
||||||
|
|
||||||
if (day <= DAY(s))
|
if (day <= DAY(s))
|
||||||
return 0;
|
return ret;
|
||||||
next = *prev = s;
|
|
||||||
while (DAY(next) < day) {
|
while (DAY(s) < day) {
|
||||||
/* Set new previous and next. */
|
day = PREVDAY(day);
|
||||||
*prev = next;
|
if (recur_item_find_occurrence(s, d, r, e, day, prev)) {
|
||||||
prev_day = DAY(*prev);
|
/* Multi-day appointment. */
|
||||||
recur_next_occurrence(s, d, r, e, prev_day, &next);
|
if (d != -1 && *prev < day && day < *prev + d)
|
||||||
/* Multi-day appointment */
|
continue;
|
||||||
if (next == *prev)
|
ret = 1;
|
||||||
next = NEXTDAY(*prev);
|
break;
|
||||||
}
|
}
|
||||||
return 1;
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user