Release 990704.
[wine/testsucceed.git] / misc / callback.c
blobdd46fb047f7a2821c2bf24bd3c1148f00b89a7f4
1 /*
2 * Function callbacks for the library
4 * Copyright 1997 Alexandre Julliard
5 */
7 #include <assert.h>
8 #include "winuser.h"
9 #include "callback.h"
10 #include "task.h"
11 #include "syslevel.h"
12 #include "cursoricon.h"
13 #include "user.h"
14 #include "queue.h"
15 #include "debugtools.h"
16 #include "win.h"
18 DEFAULT_DEBUG_CHANNEL(relay)
21 /**********************************************************************
22 * CALLBACK_CallWndProc
24 static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd,
25 UINT16 msg, WPARAM16 wParam,
26 LPARAM lParam )
28 LRESULT retvalue;
29 int iWndsLocks;
31 /* To avoid any deadlocks, all the locks on the windows structures
32 must be suspended before the control is passed to the application */
33 iWndsLocks = WIN_SuspendWndsLock();
34 retvalue = proc( hwnd, msg, wParam, lParam );
35 WIN_RestoreWndsLock(iWndsLocks);
36 return retvalue;
40 /**********************************************************************
41 * CALLBACK_CallRegisterProc
43 static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT86 *context, INT offset)
45 ERR("Cannot call a register proc in Winelib\n" );
46 assert( FALSE );
47 return 0;
51 /**********************************************************************
52 * CALLBACK_CallDriverProc
54 static LRESULT WINAPI CALLBACK_CallDriverProc( DRIVERPROC16 proc, DWORD dwId,
55 HDRVR16 hdrvr, UINT16 msg,
56 LPARAM lp1, LPARAM lp2 )
58 return proc( dwId, hdrvr, msg, lp1, lp2 );
62 /**********************************************************************
63 * CALLBACK_CallDriverCallback
65 static LRESULT WINAPI CALLBACK_CallDriverCallback( FARPROC16 proc,
66 HANDLE16 hDev, UINT16 msg,
67 DWORD dwUser, LPARAM lp1,
68 LPARAM lp2 )
70 return proc( hDev, msg, dwUser, lp1, lp2 );
74 /**********************************************************************
75 * CALLBACK_CallTimeFuncProc
77 static LRESULT WINAPI CALLBACK_CallTimeFuncProc( FARPROC16 proc, WORD id,
78 UINT16 msg, DWORD dwUser,
79 LPARAM lp1, LPARAM lp2 )
81 return proc( id, msg, dwUser, lp1, lp2 );
85 /**********************************************************************
86 * CALLBACK_CallWindowsExitProc
88 static INT16 WINAPI CALLBACK_CallWindowsExitProc( FARPROC16 proc, INT16 type)
90 return proc( type );
94 /**********************************************************************
95 * CALLBACK_CallWordBreakProc
97 static INT16 WINAPI CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc,
98 SEGPTR text, INT16 word,
99 INT16 len, INT16 action )
101 return proc( (LPSTR)text, word, len, action );
105 /**********************************************************************
106 * CALLBACK_CallBootAppProc
108 static void WINAPI CALLBACK_CallBootAppProc( FARPROC16 proc, HANDLE16 module,
109 HFILE16 file )
111 proc( module, file );
115 /**********************************************************************
116 * CALLBACK_CallLoadAppSegProc
118 static WORD WINAPI CALLBACK_CallLoadAppSegProc( FARPROC16 proc,
119 HANDLE16 module, HFILE16 file,
120 WORD seg )
122 return proc( module, file, seg );
126 /**********************************************************************
127 * CALLBACK_CallLocalNotifyFunc
129 static WORD WINAPI CALLBACK_CallLocalNotifyFunc( FARPROC16 proc,
130 WORD wMsg, HLOCAL16 hMem,
131 WORD wArg )
133 return proc( wMsg, hMem, wArg );
137 /**********************************************************************
138 * CALLBACK_CallResourceHandlerProc
140 static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
141 HGLOBAL16 hMemObj,
142 HMODULE16 hModule,
143 HRSRC16 hRsrc )
145 ERR("Cannot call a 16-bit resource handler in Winelib\n" );
146 assert( FALSE );
147 return 0;
151 /**********************************************************************
152 * CALLBACK_CallASPIPostProc
154 static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
156 return proc( ptr );
160 /**********************************************************************
161 * CALLBACK_CallWOWCallbackProc
163 static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
165 return proc( dw );
168 /**********************************************************************
169 * CALLBACK_CallWOWCallback16Ex
171 * WCB16_MAX_CBARGS (16) is the maximum number of args.
173 * Can call functions using CDECL or PASCAL calling conventions. The CDECL
174 * ones are reversed (not 100% sure about that).
176 static BOOL WINAPI CALLBACK_CallWOWCallback16Ex(
177 FARPROC16 proc, DWORD dwFlags, DWORD cbArgs, LPVOID xargs,LPDWORD pdwret
179 LPDWORD args = (LPDWORD)xargs;
180 DWORD ret,i;
182 if (dwFlags == WCB16_CDECL) {
183 /* swap the arguments */
184 args = HeapAlloc(GetProcessHeap(),0,cbArgs*sizeof(DWORD));
185 for (i=0;i<cbArgs;i++)
186 args[i] = ((DWORD*)xargs)[cbArgs-i-1];
188 switch (cbArgs) {
189 case 0: ret = proc();break;
190 case 1: ret = proc(args[0]);break;
191 case 2: ret = proc(args[0],args[1]);break;
192 case 3: ret = proc(args[0],args[1],args[2]);break;
193 case 4: ret = proc(args[0],args[1],args[2],args[3]);break;
194 case 5: ret = proc(args[0],args[1],args[2],args[3],args[4]);break;
195 case 6: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5]);
196 break;
197 case 7: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
198 args[6]
200 break;
201 case 8: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
202 args[6],args[7]
204 break;
205 case 9: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
206 args[6],args[7],args[8]
208 break;
209 case 10:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
210 args[6],args[7],args[8],args[9]
212 break;
213 case 11:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
214 args[6],args[7],args[8],args[9],args[10]
216 break;
217 case 12:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
218 args[6],args[7],args[8],args[9],args[10],args[11]
220 break;
221 case 13:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
222 args[6],args[7],args[8],args[9],args[10],args[11],
223 args[12]
225 break;
226 case 14:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
227 args[6],args[7],args[8],args[9],args[10],args[11],
228 args[12],args[13]
230 break;
231 case 15:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
232 args[6],args[7],args[8],args[9],args[10],args[11],
233 args[12],args[13],args[14]
235 break;
236 case 16:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
237 args[6],args[7],args[8],args[9],args[10],args[11],
238 args[12],args[13],args[14],args[15]
240 break;
241 default:
242 WARN("(%ld) arguments not supported.\n",cbArgs);
243 if (dwFlags == WCB16_CDECL)
244 HeapFree(GetProcessHeap(),0,args);
245 return FALSE;
247 if (dwFlags == WCB16_CDECL)
248 HeapFree(GetProcessHeap(),0,args);
249 if (pdwret)
250 *pdwret = ret;
251 return TRUE;
254 /**********************************************************************
255 * CALLBACK_CallUTProc
257 static DWORD WINAPI CALLBACK_CallUTProc( FARPROC16 proc, DWORD w1, DWORD w2 )
259 ERR("Cannot call a UT thunk proc in Winelib\n" );
260 assert( FALSE );
261 return 0;
264 /**********************************************************************
265 * CALLBACK_WinelibTable
267 * The callbacks function table for Winelib
269 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
271 CALLBACK_CallRegisterProc, /* CallRegisterShortProc */
272 CALLBACK_CallRegisterProc, /* CallRegisterLongProc */
273 NULL, /* CallFrom16WndProc */
274 CALLBACK_CallWndProc, /* CallWndProc */
275 CALLBACK_CallDriverProc, /* CallDriverProc */
276 CALLBACK_CallDriverCallback, /* CallDriverCallback */
277 CALLBACK_CallTimeFuncProc, /* CallTimeFuncProc */
278 CALLBACK_CallWindowsExitProc, /* CallWindowsExitProc */
279 CALLBACK_CallWordBreakProc, /* CallWordBreakProc */
280 CALLBACK_CallBootAppProc, /* CallBootAppProc */
281 CALLBACK_CallLoadAppSegProc, /* CallLoadAppSegProc */
282 CALLBACK_CallLocalNotifyFunc, /* CallLocalNotifyFunc */
283 CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
284 CALLBACK_CallWOWCallbackProc, /* CallWOWCallbackProc */
285 CALLBACK_CallWOWCallback16Ex, /* CallWOWCallback16Ex */
286 CALLBACK_CallUTProc, /* CallUTProc */
287 CALLBACK_CallASPIPostProc, /* CallASPIPostProc */
288 /* The graphics driver callbacks are never used in Winelib */
289 NULL, /* CallDrvControlProc */
290 NULL, /* CallDrvEnableProc */
291 NULL, /* CallDrvEnumDFontsProc */
292 NULL, /* CallDrvEnumObjProc */
293 NULL, /* CallDrvOutputProc */
294 NULL, /* CallDrvRealizeProc */
295 NULL, /* CallDrvStretchBltProc */
296 NULL, /* CallDrvExtTextOutProc */
297 NULL, /* CallDrvGetCharWidth */
298 NULL /* CallDrvAbortProc */
301 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
304 /**********************************************************************
305 * CALLOUT_Table
307 * The callout function table for Winelib
310 CALLOUT_TABLE Callout =
312 PeekMessage16, PeekMessageA, PeekMessageW,
313 GetMessage16, GetMessageA, GetMessageW,
314 SendMessage16, SendMessageA, SendMessageW,
315 PostMessage16, PostMessageA, PostMessageW,
316 PostAppMessage16, PostThreadMessageA, PostThreadMessageW,
317 TranslateMessage16, TranslateMessage,
318 DispatchMessage16, DispatchMessageA, DispatchMessageW,
319 RedrawWindow16, RedrawWindow,
320 UserSignalProc,
321 InitApp16, InitThreadInput16,
322 UserYield16,
323 CURSORICON_Destroy