7fd59977 |
1 | |
2 | #include <Xw_Extension.h> |
3 | |
4 | /* ifdef then trace on */ |
5 | #ifdef TRACE |
6 | #define TRACE_SET_EVENT |
7 | #endif |
8 | |
9 | /* |
10 | XW_STATUS Xw_set_event (awindow,eventtype,acallback,auserdata) |
11 | XW_EXT_WINDOW *awindow |
12 | EVENTTYPE eventtype must be one of : |
13 | |
14 | MOUSEBUTTON |
15 | MOUSEBUTTON1 |
16 | MOUSEBUTTON2 |
17 | MOUSEBUTTON3 |
18 | MOUSEMOVE |
19 | MOUSEMOVEWITHBUTTON |
20 | MOUSEMOVEWITHBUTTON1 |
21 | MOUSEMOVEWITHBUTTON2 |
22 | MOUSEMOVEWITHBUTTON3 |
23 | KEYBOARD |
24 | ENTERWINDOW |
25 | RESIZEWINDOW |
26 | MOVEWINDOW |
27 | ICONIFYWINDOW |
28 | EXPOSEWINDOW |
29 | ALLEVENT |
30 | |
31 | XW_CALLBACK acallback CallBack Routine Address (Can be NULL) |
32 | XW_USERDATA auserdata Associated UserData Address (Can be NULL) |
33 | |
34 | Associate an CallBack routine to the window |
35 | This Routine is call when any Event of type EVENTTYPE is |
36 | received at Xw_wait_event time |
37 | NOTE than if callback is NULL ,this remove the corresponding |
38 | event of type EVENTTYPE . |
39 | |
40 | Callback programming example : |
41 | { |
42 | static XW_CALLBACK any_callback(event,data) |
43 | XW_EVENT *event ; |
44 | XW_USERDATA *data ; |
45 | { |
46 | printf(" This trap ANY Xw_event of type %d from Ext_window %x\n", |
47 | event->type,event->any.awindow); |
48 | } |
49 | |
50 | Xw_set_event(ext_window,XW_ALLEVENT,any_callback,user_data) ; |
51 | |
52 | } |
53 | |
54 | Returns XW_ERROR if Extended Window address is undefined |
55 | Returns XW_SUCCESS if successful |
56 | |
57 | */ |
58 | |
59 | #ifdef XW_PROTOTYPE |
60 | XW_STATUS Xw_set_event (void *awindow, |
61 | XW_EVENTTYPE eventtype, |
62 | XW_CALLBACK acallback, |
63 | XW_USERDATA *auserdata) |
64 | #else |
65 | XW_STATUS Xw_set_event (awindow,eventtype,acallback,auserdata) |
66 | void *awindow ; |
67 | XW_EVENTTYPE eventtype ; |
68 | XW_CALLBACK acallback ; |
69 | XW_USERDATA *auserdata ; |
70 | #endif /*XW_PROTOTYPE*/ |
71 | { |
72 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
73 | int i,function = False ; |
74 | long mask = 0 ; |
75 | |
76 | if( !Xw_isdefine_window(pwindow) ) { |
77 | /*ERROR*Bad EXT_WINDOW Address*/ |
78 | Xw_set_error(24,"Xw_set_event",pwindow) ; |
79 | return (XW_ERROR) ; |
80 | } |
81 | |
82 | switch (eventtype) { |
83 | case XW_MOUSEBUTTON : |
84 | pwindow->ecbk[XW_MOUSEBUTTON1].function = acallback ; |
85 | pwindow->ecbk[XW_MOUSEBUTTON1].userdata = auserdata ; |
86 | pwindow->ecbk[XW_MOUSEBUTTON2].function = acallback ; |
87 | pwindow->ecbk[XW_MOUSEBUTTON2].userdata = auserdata ; |
88 | pwindow->ecbk[XW_MOUSEBUTTON3].function = acallback ; |
89 | pwindow->ecbk[XW_MOUSEBUTTON3].userdata = auserdata ; |
90 | function = pwindow->icbk[XW_MOUSEBUTTON1].function || |
91 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
92 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
93 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
94 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
95 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
96 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
97 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
98 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
99 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
100 | break ; |
101 | case XW_MOUSEBUTTON1 : |
102 | pwindow->ecbk[XW_MOUSEBUTTON1].function = acallback ; |
103 | pwindow->ecbk[XW_MOUSEBUTTON1].userdata = auserdata ; |
104 | function = pwindow->ecbk[XW_MOUSEBUTTON2].function || |
105 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
106 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
107 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
108 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
109 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
110 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
111 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
112 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
113 | break ; |
114 | case XW_MOUSEBUTTON2 : |
115 | pwindow->ecbk[XW_MOUSEBUTTON2].function = acallback ; |
116 | pwindow->ecbk[XW_MOUSEBUTTON2].userdata = auserdata ; |
117 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
118 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
119 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
120 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
121 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
122 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
123 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
124 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
125 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
126 | break ; |
127 | case XW_MOUSEBUTTON3 : |
128 | pwindow->ecbk[XW_MOUSEBUTTON3].function = acallback ; |
129 | pwindow->ecbk[XW_MOUSEBUTTON3].userdata = auserdata ; |
130 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
131 | pwindow->ecbk[XW_MOUSEBUTTON2].function || |
132 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
133 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
134 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
135 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
136 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
137 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ; |
138 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
139 | break ; |
140 | case XW_MOUSEMOVE : |
141 | pwindow->ecbk[XW_MOUSEMOVE].function = acallback ; |
142 | pwindow->ecbk[XW_MOUSEMOVE].userdata = auserdata ; |
143 | function = pwindow->icbk[XW_MOUSEMOVE].function || |
144 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
145 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
146 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
147 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
148 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
149 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
150 | if( !function ) mask = PointerMotionMask ; |
151 | break ; |
152 | case XW_MOUSEMOVEWITHBUTTON : |
153 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function = acallback ; |
154 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].userdata = auserdata ; |
155 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function = acallback ; |
156 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].userdata = auserdata ; |
157 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function = acallback ; |
158 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].userdata = auserdata ; |
159 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
160 | pwindow->ecbk[XW_MOUSEBUTTON2].function || |
161 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
162 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
163 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
164 | pwindow->icbk[XW_MOUSEBUTTON3].function ; |
165 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
166 | function = pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
167 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
168 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function || |
169 | pwindow->ecbk[XW_MOUSEMOVE].function || |
170 | pwindow->icbk[XW_MOUSEMOVE].function ; |
171 | if( !function ) mask |= ButtonMotionMask ; |
172 | break ; |
173 | case XW_MOUSEMOVEWITHBUTTON1 : |
174 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function = acallback ; |
175 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].userdata = auserdata ; |
176 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
177 | pwindow->ecbk[XW_MOUSEBUTTON2].function || |
178 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
179 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
180 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
181 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
182 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
183 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
184 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
185 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
186 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
187 | function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
188 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
189 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
190 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
191 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function || |
192 | pwindow->ecbk[XW_MOUSEMOVE].function || |
193 | pwindow->icbk[XW_MOUSEMOVE].function ; |
194 | if( !function ) mask |= ButtonMotionMask ; |
195 | break ; |
196 | case XW_MOUSEMOVEWITHBUTTON2 : |
197 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function = acallback ; |
198 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].userdata = auserdata ; |
199 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
200 | pwindow->ecbk[XW_MOUSEBUTTON2].function || |
201 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
202 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
203 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
204 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
205 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
206 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
207 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
208 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
209 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
210 | function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
211 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
212 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
213 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
214 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function || |
215 | pwindow->ecbk[XW_MOUSEMOVE].function || |
216 | pwindow->icbk[XW_MOUSEMOVE].function ; |
217 | if( !function ) mask |= ButtonMotionMask ; |
218 | break ; |
219 | case XW_MOUSEMOVEWITHBUTTON3 : |
220 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function = acallback ; |
221 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].userdata = auserdata ; |
222 | function = pwindow->ecbk[XW_MOUSEBUTTON1].function || |
223 | pwindow->ecbk[XW_MOUSEBUTTON2].function || |
224 | pwindow->ecbk[XW_MOUSEBUTTON3].function || |
225 | pwindow->icbk[XW_MOUSEBUTTON1].function || |
226 | pwindow->icbk[XW_MOUSEBUTTON2].function || |
227 | pwindow->icbk[XW_MOUSEBUTTON3].function || |
228 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
229 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
230 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function || |
231 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ; |
232 | if( !function ) mask = ButtonPressMask | ButtonReleaseMask ; |
233 | function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function || |
234 | pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function || |
235 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function || |
236 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function || |
237 | pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function || |
238 | pwindow->ecbk[XW_MOUSEMOVE].function || |
239 | pwindow->icbk[XW_MOUSEMOVE].function ; |
240 | if( !function ) mask |= ButtonMotionMask ; |
241 | break ; |
242 | case XW_KEYBOARD : |
243 | pwindow->ecbk[XW_KEYBOARD].function = acallback ; |
244 | pwindow->ecbk[XW_KEYBOARD].userdata = auserdata ; |
245 | mask = KeyPressMask | KeyReleaseMask ; |
246 | break ; |
247 | case XW_ENTERWINDOW : |
248 | pwindow->ecbk[XW_ENTERWINDOW].function = acallback ; |
249 | pwindow->ecbk[XW_ENTERWINDOW].userdata = auserdata ; |
250 | mask = EnterWindowMask ; |
251 | break ; |
252 | case XW_MOVEWINDOW : |
253 | pwindow->ecbk[XW_MOVEWINDOW].function = acallback ; |
254 | pwindow->ecbk[XW_MOVEWINDOW].userdata = auserdata ; |
255 | if( !pwindow->ecbk[XW_RESIZEWINDOW].function ) |
256 | mask = StructureNotifyMask ; |
257 | break ; |
258 | case XW_RESIZEWINDOW : |
259 | pwindow->ecbk[XW_RESIZEWINDOW].function = acallback ; |
260 | pwindow->ecbk[XW_RESIZEWINDOW].userdata = auserdata ; |
261 | if( !pwindow->ecbk[XW_MOVEWINDOW].function ) |
262 | mask = StructureNotifyMask ; |
263 | break ; |
264 | case XW_ICONIFYWINDOW : |
265 | pwindow->ecbk[XW_ICONIFYWINDOW].function = acallback ; |
266 | pwindow->ecbk[XW_ICONIFYWINDOW].userdata = auserdata ; |
267 | break ; |
268 | case XW_EXPOSEWINDOW : |
269 | pwindow->ecbk[XW_EXPOSEWINDOW].function = acallback ; |
270 | pwindow->ecbk[XW_EXPOSEWINDOW].userdata = auserdata ; |
271 | mask = ExposureMask ; |
272 | break ; |
273 | |
274 | case XW_ALLEVENT : |
275 | for( i=0 ; i<MAXEVENT ; i++ ) { |
276 | pwindow->ecbk[i].function = acallback ; |
277 | pwindow->ecbk[i].userdata = auserdata ; |
278 | } |
279 | pwindow->ecbk[XW_ALLEVENT].function = NULL ; |
280 | pwindow->ecbk[XW_ALLEVENT].userdata = NULL ; |
281 | mask = ButtonPressMask | ButtonReleaseMask ; |
282 | mask |= PointerMotionMask | ButtonMotionMask ; |
283 | mask |= KeyPressMask | KeyReleaseMask ; |
284 | mask |= EnterWindowMask ; |
285 | mask |= StructureNotifyMask ; |
286 | mask |= ExposureMask ; |
287 | break ; |
288 | } |
289 | |
290 | if( mask ) { |
291 | if( acallback ) _EVENT_MASK |= mask; |
292 | else _EVENT_MASK &= ~mask ; |
293 | XSelectInput(_DISPLAY,_WINDOW,_EVENT_MASK) ; |
294 | } |
295 | |
296 | #ifdef TRACE_SET_EVENT |
297 | if( Xw_get_trace() ) { |
298 | printf (" Xw_set_event(%lx,%d,%lx,%lx)\n", |
299 | (long ) pwindow,eventtype,(long ) acallback,(long ) auserdata) ; |
300 | } |
301 | #endif |
302 | return (XW_SUCCESS); |
303 | |
304 | } |