Mercurial > MadButterfly
diff src/animate.c @ 123:9e2316dc6ecb
Program completion events
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Tue, 16 Sep 2008 14:19:26 +0800 |
parents | 17e97e92b76e |
children | ad5ab8e61c2b |
line wrap: on
line diff
--- a/src/animate.c Mon Sep 15 20:33:06 2008 +0800 +++ b/src/animate.c Tue Sep 16 14:19:26 2008 +0800 @@ -97,6 +97,7 @@ mb_timeval_t start_time; int first_playing; /*!< first playing word. */ mb_tman_t *tman; + subject_t *complete; /*!< notify when a program is completed. */ int n_words; int max_words; @@ -110,6 +111,7 @@ */ mb_progm_t *mb_progm_new(int max_words, redraw_man_t *rdman) { mb_progm_t *progm; + ob_factory_t *factory; int i; progm = (mb_progm_t *)malloc(sizeof(mb_progm_t) + @@ -118,6 +120,10 @@ return NULL; progm->rdman = rdman; + + factory = rdman_get_ob_factory(rdman); + progm->complete = subject_new(factory, progm, OBJT_PROGM); + progm->n_words = 0; progm->max_words = max_words; for(i = 0; i < max_words; i++) @@ -215,6 +221,8 @@ const mb_timeval_t *now, void *arg) { mb_progm_t *progm = (mb_progm_t *)arg; + ob_factory_t *factory; + mb_progm_complete_t comp_evt; mb_timeval_t next_tmo; mb_word_t *word; mb_timer_t *timer; @@ -264,6 +272,12 @@ MB_TIMEVAL_CP(&next_tmo, &word->abs_start); timer = mb_tman_timeout(progm->tman, &next_tmo, mb_progm_step, progm); + } else { + factory = rdman_get_ob_factory(progm->rdman); + comp_evt.event.type = EVT_PROGM_COMPLETE; + comp_evt.event.tgt = comp_evt.event.cur_tgt = progm->complete; + comp_evt.progm = progm; + subject_notify(factory, progm->complete, &comp_evt.event); } } @@ -301,6 +315,12 @@ void mb_progm_abort(mb_progm_t *progm, mb_tman_t *tman) { } +/*! \brief Return event subject for completion of a program. + */ +subject_t *mb_progm_get_complete(mb_progm_t *progm) { + return progm->complete; +} + #ifdef UNITTEST #include <CUnit/Basic.h>