Mercurial > MadButterfly
annotate include/mb_observer.h @ 865:48df0f97f09e
Allocate sh_path_t objects from an elmpool
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Thu, 23 Sep 2010 09:55:37 +0800 |
parents | 586e50f82c1f |
children | e415c55b4a0d |
rev | line source |
---|---|
822
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
224
diff
changeset
|
1 // -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 4; -*- |
586e50f82c1f
Unify coding style tag for emacs and vim.
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
parents:
224
diff
changeset
|
2 // vim: sw=4:ts=8:sts=4 |
73 | 3 #ifndef __OBSERVER_H_ |
4 #define __OBSERVER_H_ | |
5 | |
186
530bb7728546
Move header files to $(top_srcdir)/include/ and prefixed with 'mb_'.
Thinker K.F. Li <thinker@branda.to>
parents:
185
diff
changeset
|
6 #include "mb_tools.h" |
73 | 7 |
8 typedef struct _event event_t; | |
9 typedef struct _observer observer_t; | |
10 typedef struct _subject subject_t; | |
11 typedef struct _mouse_event mouse_event_t; | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
12 typedef struct _monitor_event monitor_event_t; |
73 | 13 typedef struct _ob_factory ob_factory_t; |
14 typedef void (*evt_handler)(event_t *event, void *arg); | |
15 | |
16 struct _event { | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
17 int type; /*!< event type (a.k.a. EVT_*) */ |
73 | 18 subject_t *tgt, *cur_tgt; |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
19 int flags; |
73 | 20 }; |
21 | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
22 /*! \brief Observer mark event with EVTF_STOP_PROPAGATE flag |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
23 * to stop propagation. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
24 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
25 #define EVTF_STOP_PROPAGATE 0x1 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
26 /*! \brief Observer mark event with EVTF_STOP_NOTIFY flag to stop |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
27 * stop notification the event immediately. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
28 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
29 #define EVTF_STOP_NOTIFY 0x2 |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
30 |
78 | 31 /*! \brief Observer of observer pattern. |
32 * | |
33 * A target for receiving events. | |
34 */ | |
73 | 35 struct _observer { |
198
f9d507a3e1d9
Add event observer which listen to one event type only.
wycc@wycc-desktop
parents:
192
diff
changeset
|
36 int type; |
73 | 37 evt_handler hdr; |
38 void *arg; | |
39 observer_t *next; | |
40 }; | |
41 | |
78 | 42 /*! \brief Subject of observer pattern. |
43 * | |
44 * Observer is a pattern to decouple caller and callee, | |
45 * especial for multiple callee. | |
46 * \see http://en.wikipedia.org/wiki/Observer_pattern | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
47 * |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
48 * This implementation add a monitor facility to monitor adding/removing |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
49 * observers from subjects. Monitor is another subject that monitor events |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
50 * will be sent to if it is existed. |
78 | 51 */ |
73 | 52 struct _subject { |
125
1c1f28c124c9
Postponding free request when a subject is in subject_notify
Thinker K.F. Li <thinker@branda.to>
parents:
123
diff
changeset
|
53 int obj_type; /*!< \brief type of object (a.k.a. OBJT_*). */ |
1c1f28c124c9
Postponding free request when a subject is in subject_notify
Thinker K.F. Li <thinker@branda.to>
parents:
123
diff
changeset
|
54 void *obj; /*!< \brief the object this subject for. */ |
73 | 55 int flags; |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
56 subject_t *monitor_sub; /*!< \brief Monitor adding/removing |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
57 * obervers on this subject. */ |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
58 ob_factory_t *factory; |
73 | 59 STAILQ(observer_t) observers; |
60 }; | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
61 /*! \brief Flag that make a subject to stop propagate events to parents. */ |
73 | 62 #define SUBF_STOP_PROPAGATE 0x1 |
125
1c1f28c124c9
Postponding free request when a subject is in subject_notify
Thinker K.F. Li <thinker@branda.to>
parents:
123
diff
changeset
|
63 #define SUBF_BUSY 0x2 /*!< \brief in subject_notify() */ |
1c1f28c124c9
Postponding free request when a subject is in subject_notify
Thinker K.F. Li <thinker@branda.to>
parents:
123
diff
changeset
|
64 #define SUBF_FREE 0x4 /*!< \brief in postponding subject_free() */ |
73 | 65 |
154 | 66 enum {OBJT_GEO, OBJT_COORD, OBJT_KB, OBJT_PROGM, OBJT_RDMAN}; |
73 | 67 |
68 struct _mouse_event { | |
69 event_t event; | |
70 int x, y; | |
78 | 71 unsigned int but_state; |
72 unsigned int button; | |
73 | 73 }; |
74 | |
76 | 75 #define MOUSE_BUT1 0x1 |
76 #define MOUSE_BUT2 0x2 | |
77 #define MOUSE_BUT3 0x4 | |
78 | |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
79 struct _monitor_event { |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
80 event_t event; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
81 subject_t *subject; /*!< \brief Subject been monitored. */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
82 observer_t *observer; /*!< \brief Observer been added or removed. */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
83 }; |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
84 |
73 | 85 /*! \brief Observer factory. |
86 * | |
87 * It provides functions for allocation of subject and observer objects, | |
88 * and strategy function for getting the subject of parent coord object. | |
89 */ | |
90 struct _ob_factory { | |
91 subject_t *(*subject_alloc)(ob_factory_t *factory); | |
92 void (*subject_free)(ob_factory_t *factory, subject_t *subject); | |
93 observer_t *(*observer_alloc)(ob_factory_t *factory); | |
94 void (*observer_free)(ob_factory_t *factory, observer_t *observer); | |
95 /*! This is a strategy function to get subjects of parents. */ | |
96 subject_t *(*get_parent_subject)(ob_factory_t *factory, | |
97 subject_t *cur_subject); | |
98 }; | |
99 | |
198
f9d507a3e1d9
Add event observer which listen to one event type only.
wycc@wycc-desktop
parents:
192
diff
changeset
|
100 enum {EVT_ANY,EVT_MOUSE_OVER, EVT_MOUSE_OUT, EVT_MOUSE_MOVE, |
122
17e97e92b76e
Encapsulate X_MB_runtime_t and support X keyboard events.
Thinker K.F. Li <thinker@branda.to>
parents:
78
diff
changeset
|
101 EVT_MOUSE_BUT_PRESS, EVT_MOUSE_BUT_RELEASE, |
154 | 102 EVT_KB_PRESS, EVT_KB_RELEASE, EVT_PROGM_COMPLETE, |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
103 EVT_RDMAN_REDRAW, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
104 EVT_MONITOR_ADD, EVT_MONITOR_REMOVE, EVT_MONITOR_FREE, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
105 EVT_MOUSE_MOVE_RAW |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
106 }; |
73 | 107 |
108 extern subject_t *subject_new(ob_factory_t *factory, | |
109 void *obj, int obj_type); | |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
110 extern void subject_free(subject_t *subject); |
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
111 extern void subject_notify(subject_t *subject, event_t *evt); |
206
748896358da2
Export subject_add_event_observer() to rest of the system.
Thinker K.F. Li <thinker@branda.to>
parents:
198
diff
changeset
|
112 extern observer_t *subject_add_event_observer(subject_t *subject, int type, |
748896358da2
Export subject_add_event_observer() to rest of the system.
Thinker K.F. Li <thinker@branda.to>
parents:
198
diff
changeset
|
113 evt_handler hdr, void *arg); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
114 /*! \brief Add an observer for any type of events. */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
115 #define subject_add_observer(s, h, a) \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
116 subject_add_event_observer(s, EVT_ANY, h, a) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
117 extern observer_t *subject_add_event_observer_head(subject_t *subject, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
118 int type, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
119 evt_handler hdr, |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
120 void *arg); |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
121 /*! \brief Add an observer for any type of events at head. */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
122 #define subject_add_observer_head(s, h, a) \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
123 subject_add_event_observer_head(s, EVT_ANY, h, a) |
192
54fdc2a65242
Remove factory from observer APIs.
Thinker K.F. Li <thinker@branda.to>
parents:
186
diff
changeset
|
124 extern void subject_remove_observer(subject_t *subject, |
73 | 125 observer_t *observer); |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
126 #define subject_get_object(s) ((s)->obj) |
73 | 127 |
224
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
128 /*! \brief Set monitor for the subject. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
129 * |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
130 * Monitor of a subject is another subject that would be notified when |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
131 * add/remove a observer to/from the subject. It can be used to efficiently |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
132 * implement translator to translate events. |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
133 */ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
134 #define subject_set_monitor(subject, monitor) \ |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
135 do { (subject)->monitor_sub = monitor; } while(0) |
29e1b2bffe4c
X backend only sent EVT_MOUSE_MOVE_RAW to MadButterfly.
Thinker K.F. Li <thinker@branda.to>
parents:
206
diff
changeset
|
136 #define subject_monitor(subject) ((subject)->monitor_sub) |
73 | 137 |
138 #endif /* __OBSERVER_H_ */ |