diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-01 20:46:48 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-11-01 20:46:48 +0800 |
commit | d018dfdd1b28380048da845d1efd8495432a8d0c (patch) | |
tree | 8ce58267c8c22e6b6f55cde00a47ef54b76b6775 | |
parent | 30e3bc78afe22cf1213c9da6deb01bffc745ea7b (diff) |
milkway: add default mw-source::dispatch implementation
-rw-r--r-- | milkway/mw-source.c | 31 | ||||
-rw-r--r-- | milkway/mw-source.h | 11 |
2 files changed, 42 insertions, 0 deletions
diff --git a/milkway/mw-source.c b/milkway/mw-source.c index f2a581b..9f6f287 100644 --- a/milkway/mw-source.c +++ b/milkway/mw-source.c @@ -35,6 +35,9 @@ mw_source_init(mw_source_t *self) self->next = NULL; self->fds = NULL; self->context = NULL; + self->func = NULL; + self->user_data = NULL; + self->destroy_func = NULL; return self; } @@ -118,6 +121,23 @@ mw_source_get_current_time (mw_source_t *source, mw_main_context_get_current_time(context, timeval); } +void +mw_source_set_callback (mw_source_t *self, + mw_source_func_t func, + mw_pointer_t user_data, + mw_destroy_func_t destroy_func) +{ + mw_destroy_func_t old_destroy_func = self->destroy_func; + mw_pointer_t old_user_data = self->user_data; + + self->func = func; + self->user_data = user_data; + self->destroy_func = destroy_func; + + if (old_destroy_func) + old_destroy_func(old_user_data); +} + /** * mw_source_destroy: * @source: a #mw_source_t @@ -150,12 +170,22 @@ mw_source_destroy(mw_source_t *source) mw_main_context_unlock (context); } +static mw_bool_t +mw_source_default_dispatch(mw_source_t *self) +{ + if (!self->func) + return MW_FALSE; + return self->func(self, self->user_data); +} + static void mw_source_finalize(mw_object_t *super) { mw_source_t *self = (mw_source_t*)super; mw_assert (self->context == NULL); + if (self->destroy_func) + self->destroy_func(self->user_data); MW_SUPER_FINALIZE(super, MW_SOURCE_TYPE)(super); } @@ -163,6 +193,7 @@ static void mw_source_type_init(mw_source_type_t *self) { self->base.finalize = mw_source_finalize; + self->dispatch = mw_source_default_dispatch; } MW_DEFINE_GET_TYPE(mw_source, mw_source_type_t, diff --git a/milkway/mw-source.h b/milkway/mw-source.h index e25e91c..789c089 100644 --- a/milkway/mw-source.h +++ b/milkway/mw-source.h @@ -60,6 +60,11 @@ struct mw_source { mw_source_t *next; mw_source_t *prev; + + /** callback */ + mw_source_func_t func; + mw_pointer_t user_data; + mw_destroy_func_t destroy_func; }; #define MW_PRIORITY_HIGH -100 @@ -165,6 +170,12 @@ mw_source_get_current_time (mw_source_t *source, mw_timeval_t *timeval); mw_public void +mw_source_set_callback (mw_source_t *source, + mw_source_func_t func, + mw_pointer_t user_data, + mw_destroy_func_t destroy_func); + +mw_public void mw_source_destroy(mw_source_t *self); #endif |