Mercurial > MadButterfly
view src/observer.h @ 73:9ab15ebc9061
Observer for mouse events
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Mon, 18 Aug 2008 01:59:26 +0800 |
parents | |
children | 8706356a61b4 |
line wrap: on
line source
#ifndef __OBSERVER_H_ #define __OBSERVER_H_ #include "tools.h" typedef struct _event event_t; typedef struct _observer observer_t; typedef struct _subject subject_t; typedef struct _mouse_event mouse_event_t; typedef struct _ob_factory ob_factory_t; typedef void (*evt_handler)(event_t *event, void *arg); struct _event { int type; subject_t *tgt, *cur_tgt; }; struct _observer { evt_handler hdr; void *arg; observer_t *next; }; struct _subject { int obj_type; void *obj; int flags; STAILQ(observer_t) observers; }; #define SUBF_STOP_PROPAGATE 0x1 enum {OBJT_GEO, OBJT_COORD}; struct _mouse_event { event_t event; int x, y; int button; }; /*! \brief Observer factory. * * It provides functions for allocation of subject and observer objects, * and strategy function for getting the subject of parent coord object. */ struct _ob_factory { subject_t *(*subject_alloc)(ob_factory_t *factory); void (*subject_free)(ob_factory_t *factory, subject_t *subject); observer_t *(*observer_alloc)(ob_factory_t *factory); void (*observer_free)(ob_factory_t *factory, observer_t *observer); /*! This is a strategy function to get subjects of parents. */ subject_t *(*get_parent_subject)(ob_factory_t *factory, subject_t *cur_subject); }; enum {EVT_MOUSE_OVER, EVT_MOUSE_OUT, EVT_MOUSE_MOVE, EVT_MOUSE_BUT_PRESS, EVT_MOUSE_BUT_RELEASE}; extern subject_t *subject_new(ob_factory_t *factory, void *obj, int obj_type); extern void subject_free(ob_factory_t *factory, subject_t *subject); extern void subject_notify(ob_factory_t *factory, subject_t *subject, event_t *evt); extern observer_t *subject_add_observer(ob_factory_t *factory, subject_t *subject, evt_handler hdr, void *arg); extern void subject_remove_observer(ob_factory_t *factory, subject_t *subject, observer_t *observer); #endif /* __OBSERVER_H_ */