summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-11-01 20:46:48 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-11-01 20:46:48 +0800
commitd018dfdd1b28380048da845d1efd8495432a8d0c (patch)
tree8ce58267c8c22e6b6f55cde00a47ef54b76b6775
parent30e3bc78afe22cf1213c9da6deb01bffc745ea7b (diff)
milkway: add default mw-source::dispatch implementation
-rw-r--r--milkway/mw-source.c31
-rw-r--r--milkway/mw-source.h11
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