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>