Mercurial > MadButterfly
diff include/mb_backend.h @ 1067:7b4e80ab671a openvg
merge from default branch
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 01 Dec 2010 12:25:56 +0800 |
parents | e415c55b4a0d |
children | fa5f71d4aa04 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb_backend.h Wed Dec 01 12:25:56 2010 +0800 @@ -0,0 +1,196 @@ +#ifndef __MB_BACKEND_H_ +#define __MB_BACKEND_H_ + +#include "mb_redraw_man.h" +#include "mb_timer.h" +#include "mb_observer.h" +#include "mb_img_ldr.h" + +#include "mb_config.h" + +#ifdef X_BACKEND +#include "mb_X_supp.h" +#endif + +#ifdef DFB_BACKEND +#inclde "mb_dfb_supp.h" +#endif + +struct _mb_rt; +typedef struct _mb_rt mb_rt_t; + +struct _mb_timer_man; +struct _mb_timer_factory; +struct _mb_IO_man; +struct _mb_IO_factory; + +/*! \brief Type of IO that registered with an IO manager. + */ +enum _MB_IO_TYPE {MB_IO_DUMMY, MB_IO_R, MB_IO_W, MB_IO_RW}; + +typedef struct _mb_timer_man mb_timer_man_t; +typedef struct _mb_timer_factory mb_timer_factory_t; +typedef struct _mb_IO_man mb_IO_man_t; +typedef struct _mb_IO_factory mb_IO_factory_t; +typedef enum _MB_IO_TYPE MB_IO_TYPE; + +/*! \brief Function signature of callback functions for IO requests. + */ +typedef void (*mb_IO_cb_t)(int hdl, int fd, MB_IO_TYPE type, void *data); + +/*! \brief The backend engine mb_backend_t is used to define the + * interface to realize the MB. + * + * A backend is used to receive events from the system. The MB does + * not define the backend by itself. Instead, it define an interface + * which allow the lower layer to implement the event system. Each + * backend need to provides the following events. + * + * - keyboard event + * - timer event + * - image loader(?) + * - render manager(?) + */ +typedef struct { + mb_rt_t *(*rt_new)(const char *display, int w,int h); + mb_rt_t *(*rt_new_with_win)(MB_DISPLAY display, MB_WINDOW win); + + void (*rt_free)(mb_rt_t *rt); + void (*rt_free_keep_win)(mb_rt_t *rt); + /*! \brief Request the backend to start monitoring a file descriptor. + * + * This is used only when the backend is responsible for event loop. + */ + int (*add_event)(mb_rt_t *rt, int fd, MB_IO_TYPE type, + mb_IO_cb_t f,void *arg); + /*! \brief Request the backend to stop monitoring a file descriptor. + * + * This is used only when the backend is responsible for event loop. + */ + void (*remove_event)(mb_rt_t *rt, int hdl); + /*! \brief Event Loop + * + * This is called when main application does not handle event + * loop. Or, it should register an IO factory (i.e \ref + * mb_IO_factory_t) with the backend. + */ + void (*event_loop)(mb_rt_t *rt); + + /*! \brief Flush requests to screen server if existed */ + int (*flush)(mb_rt_t *rt); + + subject_t *(*kbevents)(mb_rt_t *rt); + redraw_man_t *(*rdman)(mb_rt_t *rt); + mb_timer_man_t *(*timer_man)(mb_rt_t *rt); + observer_factory_t *(*observer_factory)(mb_rt_t *rt); + mb_img_ldr_t *(*loader)(mb_rt_t *rt); + + /* + * Following two methods are used to integrate a backend to + * event loop of main application. + */ + void (*reg_IO_factory)(mb_IO_factory_t *io_man); + void (*reg_timer_factory)(mb_timer_factory_t *tm_man); +} mb_backend_t; + +#define mb_runtime_new(disp, w, h) \ + mb_dfl_backend.rt_new((disp), (w), (h)) +#define mb_runtime_new_with_win(disp, win) \ + mb_dfl_backend.rt_new_with_win((disp), (win)) +#define mb_reg_IO_factory(io_fact) \ + mb_dfl_backend.reg_IO_factory(io_fact) +#define mb_reg_timer_factory(tm_fact) \ + mb_dfl_backend.reg_timer_factory(tm_fact) + +/* + * This is defined by backend implementations. For example, X_supp.c + * or dfb_supp.c should defined a backend. + */ +extern mb_backend_t mb_dfl_backend; + +#define mb_runtime_free(rt) \ + mb_dfl_backend.rt_free(rt) +#define mb_runtime_free_keep_win(rt) \ + mb_dfl_backend.rt_free_keep_win(rt) +#define mb_runtime_add_event(rt, fd, type, cb, arg) \ + mb_dfl_backend.add_event((rt), (fd), (type), (cb), (arg)) +#define mb_runtime_remove_event(hdl) \ + mb_dfl_backend.remove_event((rt), (hdl)) +#define mb_runtime_event_loop(rt) \ + mb_dfl_backend.event_loop(rt) +#define mb_runtime_flush(rt) \ + mb_dfl_backend.flush(rt) +#define mb_runtime_kbevents(rt) \ + mb_dfl_backend.kbevents(rt) +#define mb_runtime_rdman(rt) \ + mb_dfl_backend.rdman(rt) +#define mb_runtime_timer_man(rt) \ + mb_dfl_backend.timer_man(rt) +#define mb_runtime_observer_factory(rt) \ + mb_dfl_backend.observer_factory(rt) +#define mb_runtime_loader(rt) \ + mb_dfl_backend.loader(rt) + + +/*! \brief IO Manager + */ +struct _mb_IO_man { + int (*reg)(struct _mb_IO_man *io_man, + int fd, MB_IO_TYPE type, mb_IO_cb_t cb, void *data); + void (*unreg)(struct _mb_IO_man *io_man, + int io_hdl); +}; + +/*! \brief Factory of IO managers. + */ +struct _mb_IO_factory { + mb_IO_man_t *(*io_man_new)(void); + void (*io_man_free)(mb_IO_man_t *io_man); +}; + +#define mb_io_man_reg(io_man, fd, type, cb, data) \ + (io_man)->reg(io_man, fd, type, cb, data) +#define mb_io_man_unreg(io_man, io_hdl) \ + (io_man)->unreg(io_man, io_hdl) +#define mb_io_man_new(io_fact) (io_fact)->io_man_new() +#define mb_io_man_free(io_fact, io_man) (io_fact)->io_man_free(io_man) + +/*! \brief Function signature of callback functions for timers. + */ +typedef void (*mb_timer_cb_t)(int hdl, + const mb_timeval_t *tmo, + const mb_timeval_t *now, + void *data); + +/*! \brief Timer manager + */ +struct _mb_timer_man { + /*! \brief Setup a timeout callback. + * + * \return -1 for error. + */ + int (*timeout)(struct _mb_timer_man *tm_man, + mb_timeval_t *tmout, /* tiemout (wall time) */ + mb_timer_cb_t cb, void *data); + /*! \brief Remove a timeout request. + * + * \param tm_hdl is the handle returned by _mb_timer_man::timeout. + */ + void (*remove)(struct _mb_timer_man *tm_man, int tm_hdl); +}; + +/*! \brief Factory of timer manager. + */ +struct _mb_timer_factory { + mb_timer_man_t *(*timer_man_new)(void); + void (*timer_man_free)(mb_timer_man_t *timer_man); +}; + +#define mb_timer_man_timeout(tm_man, tmout, cb, data) \ + (tm_man)->timeout((tm_man), (tmout), (cb), (data)) +#define mb_timer_man_remove(tm_man, tm_hdl) \ + (tm_man)->remove((tm_man), (tm_hdl)) +#define mb_timer_man_new(tm_fact) (tm_fact)->timer_man_new() +#define mb_timer_man_free(tm_fact, tm_man) (tm_fact)->timer_man_free(tm_man) + +#endif /* __MB_BACKEND_H_ */