0022590: Migration to FreeImage - revision of Xw and WNT packages
[occt.git] / src / Xw / Xw_set_event.cxx
1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18
19 #include <Xw_Extension.h>
20
21 /* ifdef then trace on */
22 #ifdef TRACE
23 #define TRACE_SET_EVENT
24 #endif
25
26 /*
27    XW_STATUS Xw_set_event (awindow,eventtype,acallback,auserdata)
28         XW_EXT_WINDOW   *awindow        
29         EVENTTYPE       eventtype must be one of :
30
31                         MOUSEBUTTON
32                         MOUSEBUTTON1
33                         MOUSEBUTTON2
34                         MOUSEBUTTON3
35                         MOUSEMOVE
36                         MOUSEMOVEWITHBUTTON
37                         MOUSEMOVEWITHBUTTON1
38                         MOUSEMOVEWITHBUTTON2
39                         MOUSEMOVEWITHBUTTON3
40                         KEYBOARD
41                         ENTERWINDOW
42                         RESIZEWINDOW
43                         MOVEWINDOW
44                         ICONIFYWINDOW
45                         EXPOSEWINDOW
46                         ALLEVENT
47
48         XW_CALLBACK     acallback CallBack Routine Address      (Can be NULL)
49         XW_USERDATA     auserdata  Associated UserData Address  (Can be NULL)
50
51         Associate an CallBack routine to the window
52         This Routine is call when any Event of type EVENTTYPE is 
53         received at Xw_wait_event time
54         NOTE than if callback is NULL ,this remove the corresponding
55         event of type EVENTTYPE .
56
57         Callback programming example :
58         {
59             static XW_CALLBACK any_callback(event,data)
60             XW_EVENT *event ;
61             XW_USERDATA *data ;
62             {
63             printf(" This trap ANY Xw_event of type %d from Ext_window %x\n",
64                                                 event->type,event->any.awindow); 
65             } 
66
67             Xw_set_event(ext_window,XW_ALLEVENT,any_callback,user_data) ;
68
69         }
70
71         Returns XW_ERROR if Extended Window address is undefined
72         Returns XW_SUCCESS if successful 
73
74 */
75
76 #ifdef XW_PROTOTYPE
77 XW_STATUS Xw_set_event (void *awindow,
78                      XW_EVENTTYPE eventtype,
79                      XW_CALLBACK acallback,
80                      XW_USERDATA *auserdata)
81 #else
82 XW_STATUS Xw_set_event (awindow,eventtype,acallback,auserdata)
83 void *awindow ;
84 XW_EVENTTYPE eventtype ;
85 XW_CALLBACK acallback ;
86 XW_USERDATA  *auserdata ;
87 #endif /*XW_PROTOTYPE*/
88 {
89 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
90 int i,function = False ;
91 long mask = 0 ;
92
93         if( !Xw_isdefine_window(pwindow) ) {
94             /*ERROR*Bad EXT_WINDOW Address*/
95             Xw_set_error(24,"Xw_set_event",pwindow) ;
96             return (XW_ERROR) ;
97         }
98
99         switch (eventtype) {
100             case XW_MOUSEBUTTON : 
101                 pwindow->ecbk[XW_MOUSEBUTTON1].function = acallback ;   
102                 pwindow->ecbk[XW_MOUSEBUTTON1].userdata = auserdata ;   
103                 pwindow->ecbk[XW_MOUSEBUTTON2].function = acallback ;   
104                 pwindow->ecbk[XW_MOUSEBUTTON2].userdata = auserdata ;   
105                 pwindow->ecbk[XW_MOUSEBUTTON3].function = acallback ;   
106                 pwindow->ecbk[XW_MOUSEBUTTON3].userdata = auserdata ;   
107                 function = pwindow->icbk[XW_MOUSEBUTTON1].function ||
108                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
109                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
110                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
111                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
112                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
113                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
114                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
115                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
116                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
117                 break ;
118             case XW_MOUSEBUTTON1 : 
119                 pwindow->ecbk[XW_MOUSEBUTTON1].function = acallback ;   
120                 pwindow->ecbk[XW_MOUSEBUTTON1].userdata = auserdata ;   
121                 function = pwindow->ecbk[XW_MOUSEBUTTON2].function ||
122                            pwindow->ecbk[XW_MOUSEBUTTON3].function ||
123                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
124                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
125                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
126                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
127                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
128                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
129                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
130                 break ;
131             case XW_MOUSEBUTTON2 : 
132                 pwindow->ecbk[XW_MOUSEBUTTON2].function = acallback ;   
133                 pwindow->ecbk[XW_MOUSEBUTTON2].userdata = auserdata ;   
134                 function = pwindow->ecbk[XW_MOUSEBUTTON1].function ||
135                            pwindow->ecbk[XW_MOUSEBUTTON3].function ||
136                            pwindow->icbk[XW_MOUSEBUTTON1].function ||
137                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
138                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
139                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
140                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
141                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
142                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
143                 break ;
144             case XW_MOUSEBUTTON3 : 
145                 pwindow->ecbk[XW_MOUSEBUTTON3].function = acallback ;   
146                 pwindow->ecbk[XW_MOUSEBUTTON3].userdata = auserdata ;   
147                 function = pwindow->ecbk[XW_MOUSEBUTTON1].function ||
148                            pwindow->ecbk[XW_MOUSEBUTTON2].function ||
149                            pwindow->icbk[XW_MOUSEBUTTON1].function ||
150                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
151                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
152                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
153                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
154                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ;    
155                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
156                 break ;
157             case XW_MOUSEMOVE :
158                 pwindow->ecbk[XW_MOUSEMOVE].function = acallback ;      
159                 pwindow->ecbk[XW_MOUSEMOVE].userdata = auserdata ;      
160                 function = pwindow->icbk[XW_MOUSEMOVE].function ||
161                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
162                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
163                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
164                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
165                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
166                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
167                 if( !function ) mask = PointerMotionMask ;
168                 break ;
169             case XW_MOUSEMOVEWITHBUTTON :
170                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function = acallback ;   
171                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].userdata = auserdata ;   
172                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function = acallback ;   
173                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].userdata = auserdata ;   
174                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function = acallback ;   
175                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].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                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
183                 function = pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
184                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
185                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
186                            pwindow->ecbk[XW_MOUSEMOVE].function ||
187                            pwindow->icbk[XW_MOUSEMOVE].function ;
188                 if( !function ) mask |= ButtonMotionMask ;
189                 break ;
190             case XW_MOUSEMOVEWITHBUTTON1 :
191                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function = acallback ;   
192                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].userdata = auserdata ;   
193                 function = pwindow->ecbk[XW_MOUSEBUTTON1].function ||
194                            pwindow->ecbk[XW_MOUSEBUTTON2].function ||
195                            pwindow->ecbk[XW_MOUSEBUTTON3].function ||
196                            pwindow->icbk[XW_MOUSEBUTTON1].function ||
197                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
198                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
199                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
200                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
201                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
202                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
203                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
204                 function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
205                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
206                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
207                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
208                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
209                            pwindow->ecbk[XW_MOUSEMOVE].function ||
210                            pwindow->icbk[XW_MOUSEMOVE].function ;
211                 if( !function ) mask |= ButtonMotionMask ;
212                 break ;
213             case XW_MOUSEMOVEWITHBUTTON2 :
214                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function = acallback ;   
215                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].userdata = auserdata ;   
216                 function = pwindow->ecbk[XW_MOUSEBUTTON1].function ||
217                            pwindow->ecbk[XW_MOUSEBUTTON2].function ||
218                            pwindow->ecbk[XW_MOUSEBUTTON3].function ||
219                            pwindow->icbk[XW_MOUSEBUTTON1].function ||
220                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
221                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
222                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
223                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
224                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
225                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
226                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
227                 function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
228                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
229                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
230                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
231                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
232                            pwindow->ecbk[XW_MOUSEMOVE].function ||
233                            pwindow->icbk[XW_MOUSEMOVE].function ;
234                 if( !function ) mask |= ButtonMotionMask ;
235                 break ;
236             case XW_MOUSEMOVEWITHBUTTON3 :
237                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function = acallback ;   
238                 pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].userdata = auserdata ;   
239                 function = pwindow->ecbk[XW_MOUSEBUTTON1].function ||
240                            pwindow->ecbk[XW_MOUSEBUTTON2].function ||
241                            pwindow->ecbk[XW_MOUSEBUTTON3].function ||
242                            pwindow->icbk[XW_MOUSEBUTTON1].function ||
243                            pwindow->icbk[XW_MOUSEBUTTON2].function ||
244                            pwindow->icbk[XW_MOUSEBUTTON3].function ||
245                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
246                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
247                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
248                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ;    
249                 if( !function ) mask = ButtonPressMask | ButtonReleaseMask ;
250                 function = pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
251                            pwindow->ecbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
252                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON1].function ||   
253                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON2].function ||   
254                            pwindow->icbk[XW_MOUSEMOVEWITHBUTTON3].function ||   
255                            pwindow->ecbk[XW_MOUSEMOVE].function ||
256                            pwindow->icbk[XW_MOUSEMOVE].function ;
257                 if( !function ) mask |= ButtonMotionMask ;
258                 break ;
259             case XW_KEYBOARD :
260                 pwindow->ecbk[XW_KEYBOARD].function = acallback ;       
261                 pwindow->ecbk[XW_KEYBOARD].userdata = auserdata ;       
262                 mask = KeyPressMask | KeyReleaseMask ;
263                 break ;
264             case XW_ENTERWINDOW :
265                 pwindow->ecbk[XW_ENTERWINDOW].function = acallback ;    
266                 pwindow->ecbk[XW_ENTERWINDOW].userdata = auserdata ;    
267                 mask = EnterWindowMask ;
268                 break ;
269             case XW_MOVEWINDOW :
270                 pwindow->ecbk[XW_MOVEWINDOW].function = acallback ;     
271                 pwindow->ecbk[XW_MOVEWINDOW].userdata = auserdata ;     
272                 if( !pwindow->ecbk[XW_RESIZEWINDOW].function ) 
273                                                 mask = StructureNotifyMask ;
274                 break ;
275             case XW_RESIZEWINDOW :
276                 pwindow->ecbk[XW_RESIZEWINDOW].function = acallback ;   
277                 pwindow->ecbk[XW_RESIZEWINDOW].userdata = auserdata ;   
278                 if( !pwindow->ecbk[XW_MOVEWINDOW].function ) 
279                                                 mask = StructureNotifyMask ;
280                 break ;
281             case XW_ICONIFYWINDOW :
282                 pwindow->ecbk[XW_ICONIFYWINDOW].function = acallback ;  
283                 pwindow->ecbk[XW_ICONIFYWINDOW].userdata = auserdata ;  
284                 break ;
285             case XW_EXPOSEWINDOW :
286                 pwindow->ecbk[XW_EXPOSEWINDOW].function = acallback ;   
287                 pwindow->ecbk[XW_EXPOSEWINDOW].userdata = auserdata ;   
288                 mask = ExposureMask ;
289                 break ;
290
291             case XW_ALLEVENT :
292                 for( i=0 ; i<MAXEVENT ; i++ ) {
293                     pwindow->ecbk[i].function = acallback ;
294                     pwindow->ecbk[i].userdata = auserdata ;
295                 }
296                 pwindow->ecbk[XW_ALLEVENT].function = NULL ;    
297                 pwindow->ecbk[XW_ALLEVENT].userdata = NULL ;    
298                 mask = ButtonPressMask | ButtonReleaseMask ;
299                 mask |= PointerMotionMask | ButtonMotionMask ;
300                 mask |= KeyPressMask | KeyReleaseMask ;
301                 mask |= EnterWindowMask ;
302                 mask |= StructureNotifyMask ;
303                 mask |= ExposureMask ;
304                 break ;
305         }
306
307         if( mask ) {
308             if( acallback ) _EVENT_MASK |= mask;
309             else           _EVENT_MASK &= ~mask ; 
310             XSelectInput(_DISPLAY,_WINDOW,_EVENT_MASK) ;
311         }
312
313 #ifdef TRACE_SET_EVENT
314 if( Xw_get_trace() ) {
315     printf (" Xw_set_event(%lx,%d,%lx,%lx)\n",
316                         (long ) pwindow,eventtype,(long ) acallback,(long ) auserdata) ;
317 }
318 #endif
319         return (XW_SUCCESS);
320
321 }