- Several kernel.spec return type mismatch fixes
[wine/multimedia.git] / misc / callback.c
blob0449c70c5053df88a636d2e37eaa408241a0a89b
1 /*
2 * Function callbacks for the library
4 * Copyright 1997 Alexandre Julliard
5 */
7 #include <assert.h>
8 #include "debug.h"
9 #include "windows.h"
10 #include "callback.h"
11 #include "task.h"
12 #include "syslevel.h"
15 /**********************************************************************
16 * CALLBACK_CallWndProc
18 static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd,
19 UINT16 msg, WPARAM16 wParam,
20 LPARAM lParam )
22 return proc( hwnd, msg, wParam, lParam );
26 /**********************************************************************
27 * CALLBACK_CallRegisterProc
29 static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT *context, INT32 offset)
31 ERR(relay, "Cannot call a register proc in Winelib\n" );
32 assert( FALSE );
33 return 0;
37 /**********************************************************************
38 * CALLBACK_CallDriverProc
40 static LRESULT WINAPI CALLBACK_CallDriverProc( DRIVERPROC16 proc, DWORD dwId,
41 HDRVR16 hdrvr, UINT16 msg,
42 LPARAM lp1, LPARAM lp2 )
44 return proc( dwId, hdrvr, msg, lp1, lp2 );
48 /**********************************************************************
49 * CALLBACK_CallDriverCallback
51 static LRESULT WINAPI CALLBACK_CallDriverCallback( FARPROC16 proc,
52 HANDLE16 hDev, UINT16 msg,
53 DWORD dwUser, LPARAM lp1,
54 LPARAM lp2 )
56 return proc( hDev, msg, dwUser, lp1, lp2 );
60 /**********************************************************************
61 * CALLBACK_CallTimeFuncProc
63 static LRESULT WINAPI CALLBACK_CallTimeFuncProc( FARPROC16 proc, WORD id,
64 UINT16 msg, DWORD dwUser,
65 LPARAM lp1, LPARAM lp2 )
67 return proc( id, msg, dwUser, lp1, lp2 );
71 /**********************************************************************
72 * CALLBACK_CallWindowsExitProc
74 static INT16 WINAPI CALLBACK_CallWindowsExitProc( FARPROC16 proc, INT16 type)
76 return proc( type );
80 /**********************************************************************
81 * CALLBACK_CallWordBreakProc
83 static INT16 WINAPI CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc,
84 SEGPTR text, INT16 word,
85 INT16 len, INT16 action )
87 return proc( (LPSTR)text, word, len, action );
91 /**********************************************************************
92 * CALLBACK_CallBootAppProc
94 static void WINAPI CALLBACK_CallBootAppProc( FARPROC16 proc, HANDLE16 module,
95 HFILE16 file )
97 proc( module, file );
101 /**********************************************************************
102 * CALLBACK_CallLoadAppSegProc
104 static WORD WINAPI CALLBACK_CallLoadAppSegProc( FARPROC16 proc,
105 HANDLE16 module, HFILE16 file,
106 WORD seg )
108 return proc( module, file, seg );
112 /**********************************************************************
113 * CALLBACK_CallLocalNotifyFunc
115 static WORD WINAPI CALLBACK_CallLocalNotifyFunc( FARPROC16 proc,
116 WORD wMsg, HLOCAL16 hMem,
117 WORD wArg )
119 return proc( wMsg, hMem, wArg );
123 /**********************************************************************
124 * CALLBACK_CallSystemTimerProc
126 static void WINAPI CALLBACK_CallSystemTimerProc( FARPROC16 proc )
128 proc();
131 /**********************************************************************
132 * CALLBACK_CallResourceHandlerProc
134 static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
135 HGLOBAL16 hMemObj,
136 HMODULE16 hModule,
137 HRSRC16 hRsrc )
139 return proc( hMemObj, hModule, hRsrc );
143 /**********************************************************************
144 * CALLBACK_CallASPIPostProc
146 static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
148 return proc( ptr );
152 /**********************************************************************
153 * CALLBACK_CallWOWCallbackProc
155 static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
157 return proc( dw );
160 /**********************************************************************
161 * CALLBACK_CallWOWCallback16Ex
163 * WCB16_MAX_CBARGS (16) is the maximum number of args.
165 * Can call functions using CDECL or PASCAL calling conventions. The CDECL
166 * ones are reversed (not 100% sure about that).
168 static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex(
169 FARPROC16 proc, DWORD dwFlags, DWORD cbArgs, LPVOID xargs,LPDWORD pdwret
171 LPDWORD args = (LPDWORD)xargs;
172 DWORD ret,i;
174 if (dwFlags == WCB16_CDECL) {
175 /* swap the arguments */
176 args = HeapAlloc(GetProcessHeap(),0,cbArgs*sizeof(DWORD));
177 for (i=0;i<cbArgs;i++)
178 args[i] = ((DWORD*)xargs)[cbArgs-i-1];
180 switch (cbArgs) {
181 case 0: ret = proc();break;
182 case 1: ret = proc(args[0]);break;
183 case 2: ret = proc(args[0],args[1]);break;
184 case 3: ret = proc(args[0],args[1],args[2]);break;
185 case 4: ret = proc(args[0],args[1],args[2],args[3]);break;
186 case 5: ret = proc(args[0],args[1],args[2],args[3],args[4]);break;
187 case 6: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5]);
188 break;
189 case 7: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
190 args[6]
192 break;
193 case 8: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
194 args[6],args[7]
196 break;
197 case 9: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
198 args[6],args[7],args[8]
200 break;
201 case 10:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
202 args[6],args[7],args[8],args[9]
204 break;
205 case 11:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
206 args[6],args[7],args[8],args[9],args[10]
208 break;
209 case 12:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
210 args[6],args[7],args[8],args[9],args[10],args[11]
212 break;
213 case 13: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],args[11],
215 args[12]
217 break;
218 case 14:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
219 args[6],args[7],args[8],args[9],args[10],args[11],
220 args[12],args[13]
222 break;
223 case 15:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
224 args[6],args[7],args[8],args[9],args[10],args[11],
225 args[12],args[13],args[14]
227 break;
228 case 16:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
229 args[6],args[7],args[8],args[9],args[10],args[11],
230 args[12],args[13],args[14],args[15]
232 break;
233 default:
234 WARN(relay,"(%ld) arguments not supported.\n",cbArgs);
235 if (dwFlags == WCB16_CDECL)
236 HeapFree(GetProcessHeap(),0,args);
237 return FALSE;
239 if (dwFlags == WCB16_CDECL)
240 HeapFree(GetProcessHeap(),0,args);
241 if (pdwret)
242 *pdwret = ret;
243 return TRUE;
246 /**********************************************************************
247 * CALLBACK_CallTaskRescheduleProc
249 static void WINAPI CALLBACK_CallTaskRescheduleProc( void )
251 SYSLEVEL_EnterWin16Lock();
252 TASK_Reschedule();
253 SYSLEVEL_LeaveWin16Lock();
257 /**********************************************************************
258 * CALLBACK_WinelibTable
260 * The callbacks function table for Winelib
262 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
264 CALLBACK_CallRegisterProc, /* CallRegisterShortProc */
265 CALLBACK_CallRegisterProc, /* CallRegisterLongProc */
266 CALLBACK_CallTaskRescheduleProc, /* CallTaskRescheduleProc */
267 NULL, /* CallFrom16WndProc */
268 CALLBACK_CallWndProc, /* CallWndProc */
269 CALLBACK_CallDriverProc, /* CallDriverProc */
270 CALLBACK_CallDriverCallback, /* CallDriverCallback */
271 CALLBACK_CallTimeFuncProc, /* CallTimeFuncProc */
272 CALLBACK_CallWindowsExitProc, /* CallWindowsExitProc */
273 CALLBACK_CallWordBreakProc, /* CallWordBreakProc */
274 CALLBACK_CallBootAppProc, /* CallBootAppProc */
275 CALLBACK_CallLoadAppSegProc, /* CallLoadAppSegProc */
276 CALLBACK_CallLocalNotifyFunc, /* CallLocalNotifyFunc */
277 CALLBACK_CallSystemTimerProc, /* CallSystemTimerProc */
278 CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
279 NULL, /* CallPostAppMessageProc */
280 CALLBACK_CallWOWCallbackProc, /* CallWOWCallbackProc */
281 CALLBACK_CallWOWCallback16Ex, /* CallWOWCallback16Ex */
282 CALLBACK_CallASPIPostProc, /* CallASPIPostProc */
283 /* The graphics driver callbacks are never used in Winelib */
284 NULL, /* CallDrvControlProc */
285 NULL, /* CallDrvEnableProc */
286 NULL, /* CallDrvEnumDFontsProc */
287 NULL, /* CallDrvEnumObjProc */
288 NULL, /* CallDrvOutputProc */
289 NULL, /* CallDrvRealizeProc */
290 NULL, /* CallDrvStretchBltProc */
291 NULL, /* CallDrvExtTextOutProc */
292 NULL, /* CallDrvGetCharWidth */
293 NULL /* CallDrvAbortProc */
296 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;