diff --git a/src/dorem.c b/src/dorem.c index 423ee66f..3fb8f811 100644 --- a/src/dorem.c +++ b/src/dorem.c @@ -245,6 +245,7 @@ int ParseRem(ParsePtr s, Trigger *trig, TimeTrig *tim, int save_in_globals) tim->ttime = (tok.val % MINUTES_PER_DAY); if (save_in_globals) { LastTriggerTime = tim->ttime; + SaveLastTimeTrig(tim); } break; @@ -468,6 +469,7 @@ static int ParseTimeTrig(ParsePtr s, TimeTrig *tim, int save_in_globals) /* Save trigger time in global variable */ if (save_in_globals) { LastTriggerTime = tim->ttime; + SaveLastTimeTrig(tim); } PushToken(DBufValue(&buf), s); DBufFree(&buf); diff --git a/src/main.c b/src/main.c index ce51f741..493aab56 100644 --- a/src/main.c +++ b/src/main.c @@ -1322,3 +1322,45 @@ FreeTrig(Trigger *t) { DBufFree(&(t->tags)); } + +void +ClearLastTriggers(void) +{ + LastTrigger.expired = 0; + LastTrigger.wd = NO_WD; + LastTrigger.d = NO_DAY; + LastTrigger.m = NO_MON; + LastTrigger.y = NO_YR; + LastTrigger.back = NO_BACK; + LastTrigger.delta = NO_DELTA; + LastTrigger.rep = NO_REP; + LastTrigger.localomit = NO_WD; + LastTrigger.skip = NO_SKIP; + LastTrigger.until = NO_UNTIL; + LastTrigger.typ = NO_TYPE; + LastTrigger.once = NO_ONCE; + LastTrigger.scanfrom = NO_DATE; + LastTrigger.priority = DefaultPrio; + LastTrigger.sched[0] = 0; + LastTrigger.warn[0] = 0; + LastTrigger.omitfunc[0] = 0; + LastTrigger.passthru[0] = 0; + + LastTimeTrig.ttime = NO_TIME; + LastTimeTrig.delta = NO_DELTA; + LastTimeTrig.rep = NO_REP; + LastTimeTrig.duration = NO_TIME; +} + +void +SaveLastTrigger(Trigger const *t) +{ + memcpy(&LastTrigger, t, sizeof(LastTrigger)); + DBufInit(&(LastTrigger.tags)); +} + +void +SaveLastTimeTrig(TimeTrig const *t) +{ + memcpy(&LastTimeTrig, t, sizeof(LastTimeTrig)); +} diff --git a/src/protos.h b/src/protos.h index be12037c..6cac4cc8 100644 --- a/src/protos.h +++ b/src/protos.h @@ -142,3 +142,6 @@ void PurgeEchoLine(char const *fmt, ...); void FreeTrig(Trigger *t); void AppendTag(DynamicBuffer *buf, char const *s); char const *SynthesizeTag(void); +void ClearLastTriggers(void); +void SaveLastTrigger(Trigger const *t); +void SaveLastTimeTrig(TimeTrig const *t); diff --git a/src/queue.c b/src/queue.c index 8b33c064..e333ba7b 100644 --- a/src/queue.c +++ b/src/queue.c @@ -43,6 +43,7 @@ typedef struct queuedrem { char passthru[PASSTHRU_LEN+1]; char sched[VAR_NAME_LEN+1]; DynamicBuffer tags; + Trigger t; TimeTrig tt; } QueuedRem; @@ -91,6 +92,8 @@ int QueueReminder(ParsePtr p, Trigger *trig, qelem->typ = trig->typ; strcpy(qelem->passthru, trig->passthru); qelem->tt = *tim; + qelem->t = *trig; + DBufInit(&(qelem->t.tags)); qelem->next = QueueHead; qelem->RunDisabled = RunDisabled; qelem->ntrig = 0; @@ -246,6 +249,8 @@ void HandleQueuedReminders(void) LastTriggerDate = JulianToday; LastTriggerTime = q->tt.ttime; LastTrigValid = 1; + SaveLastTrigger(&(q->t)); + SaveLastTimeTrig(&(q->tt)); (void) TriggerReminder(&p, &trig, &q->tt, JulianToday); if (Daemon < 0) { printf("NOTE endreminder\n"); diff --git a/src/trigger.c b/src/trigger.c index fcc8406d..c4508ba0 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -429,10 +429,10 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals) LastTrigValid = 0; } -/* Assume everything works */ + /* Assume everything works */ *err = OK; -/* But check for obvious problems... */ + /* But check for obvious problems... */ if (trig->localomit == 1 + 2 + 4 + 8 + 16 + 32 + 64) { *err = E_2MANY_LOCALOMIT; return -1; @@ -448,6 +448,11 @@ int ComputeTrigger(int today, Trigger *trig, int *err, int save_in_globals) } + /* Save the trigger */ + if (save_in_globals) { + SaveLastTrigger(trig); + } + while (nattempts++ < TRIG_ATTEMPTS) { result = GetNextTriggerDate(trig, start, err, &nextstart);