Made DOSVM_GetTimer survive EAGAIN errors...
[wine.git] / misc / callback.c
blob69f605fdedb7c6e9411196e99d8fedaf7eb3f1bd
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 "debug.h"
18 /**********************************************************************
19 * CALLBACK_CallWndProc
21 static LRESULT WINAPI CALLBACK_CallWndProc( WNDPROC16 proc, HWND16 hwnd,
22 UINT16 msg, WPARAM16 wParam,
23 LPARAM lParam )
25 return proc( hwnd, msg, wParam, lParam );
29 /**********************************************************************
30 * CALLBACK_CallRegisterProc
32 static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT *context, INT offset)
34 ERR(relay, "Cannot call a register proc in Winelib\n" );
35 assert( FALSE );
36 return 0;
40 /**********************************************************************
41 * CALLBACK_CallDriverProc
43 static LRESULT WINAPI CALLBACK_CallDriverProc( DRIVERPROC16 proc, DWORD dwId,
44 HDRVR16 hdrvr, UINT16 msg,
45 LPARAM lp1, LPARAM lp2 )
47 return proc( dwId, hdrvr, msg, lp1, lp2 );
51 /**********************************************************************
52 * CALLBACK_CallDriverCallback
54 static LRESULT WINAPI CALLBACK_CallDriverCallback( FARPROC16 proc,
55 HANDLE16 hDev, UINT16 msg,
56 DWORD dwUser, LPARAM lp1,
57 LPARAM lp2 )
59 return proc( hDev, msg, dwUser, lp1, lp2 );
63 /**********************************************************************
64 * CALLBACK_CallTimeFuncProc
66 static LRESULT WINAPI CALLBACK_CallTimeFuncProc( FARPROC16 proc, WORD id,
67 UINT16 msg, DWORD dwUser,
68 LPARAM lp1, LPARAM lp2 )
70 return proc( id, msg, dwUser, lp1, lp2 );
74 /**********************************************************************
75 * CALLBACK_CallWindowsExitProc
77 static INT16 WINAPI CALLBACK_CallWindowsExitProc( FARPROC16 proc, INT16 type)
79 return proc( type );
83 /**********************************************************************
84 * CALLBACK_CallWordBreakProc
86 static INT16 WINAPI CALLBACK_CallWordBreakProc( EDITWORDBREAKPROC16 proc,
87 SEGPTR text, INT16 word,
88 INT16 len, INT16 action )
90 return proc( (LPSTR)text, word, len, action );
94 /**********************************************************************
95 * CALLBACK_CallBootAppProc
97 static void WINAPI CALLBACK_CallBootAppProc( FARPROC16 proc, HANDLE16 module,
98 HFILE16 file )
100 proc( module, file );
104 /**********************************************************************
105 * CALLBACK_CallLoadAppSegProc
107 static WORD WINAPI CALLBACK_CallLoadAppSegProc( FARPROC16 proc,
108 HANDLE16 module, HFILE16 file,
109 WORD seg )
111 return proc( module, file, seg );
115 /**********************************************************************
116 * CALLBACK_CallLocalNotifyFunc
118 static WORD WINAPI CALLBACK_CallLocalNotifyFunc( FARPROC16 proc,
119 WORD wMsg, HLOCAL16 hMem,
120 WORD wArg )
122 return proc( wMsg, hMem, wArg );
126 /**********************************************************************
127 * CALLBACK_CallResourceHandlerProc
129 static HGLOBAL16 WINAPI CALLBACK_CallResourceHandlerProc( FARPROC16 proc,
130 HGLOBAL16 hMemObj,
131 HMODULE16 hModule,
132 HRSRC16 hRsrc )
134 ERR( relay, "Cannot call a 16-bit resource handler in Winelib\n" );
135 assert( FALSE );
136 return 0;
140 /**********************************************************************
141 * CALLBACK_CallASPIPostProc
143 static LRESULT WINAPI CALLBACK_CallASPIPostProc( FARPROC16 proc, SEGPTR ptr )
145 return proc( ptr );
149 /**********************************************************************
150 * CALLBACK_CallWOWCallbackProc
152 static DWORD WINAPI CALLBACK_CallWOWCallbackProc( FARPROC16 proc, DWORD dw )
154 return proc( dw );
157 /**********************************************************************
158 * CALLBACK_CallWOWCallback16Ex
160 * WCB16_MAX_CBARGS (16) is the maximum number of args.
162 * Can call functions using CDECL or PASCAL calling conventions. The CDECL
163 * ones are reversed (not 100% sure about that).
165 static BOOL WINAPI CALLBACK_CallWOWCallback16Ex(
166 FARPROC16 proc, DWORD dwFlags, DWORD cbArgs, LPVOID xargs,LPDWORD pdwret
168 LPDWORD args = (LPDWORD)xargs;
169 DWORD ret,i;
171 if (dwFlags == WCB16_CDECL) {
172 /* swap the arguments */
173 args = HeapAlloc(GetProcessHeap(),0,cbArgs*sizeof(DWORD));
174 for (i=0;i<cbArgs;i++)
175 args[i] = ((DWORD*)xargs)[cbArgs-i-1];
177 switch (cbArgs) {
178 case 0: ret = proc();break;
179 case 1: ret = proc(args[0]);break;
180 case 2: ret = proc(args[0],args[1]);break;
181 case 3: ret = proc(args[0],args[1],args[2]);break;
182 case 4: ret = proc(args[0],args[1],args[2],args[3]);break;
183 case 5: ret = proc(args[0],args[1],args[2],args[3],args[4]);break;
184 case 6: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5]);
185 break;
186 case 7: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
187 args[6]
189 break;
190 case 8: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
191 args[6],args[7]
193 break;
194 case 9: ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
195 args[6],args[7],args[8]
197 break;
198 case 10:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
199 args[6],args[7],args[8],args[9]
201 break;
202 case 11:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
203 args[6],args[7],args[8],args[9],args[10]
205 break;
206 case 12:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
207 args[6],args[7],args[8],args[9],args[10],args[11]
209 break;
210 case 13:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
211 args[6],args[7],args[8],args[9],args[10],args[11],
212 args[12]
214 break;
215 case 14:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
216 args[6],args[7],args[8],args[9],args[10],args[11],
217 args[12],args[13]
219 break;
220 case 15:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
221 args[6],args[7],args[8],args[9],args[10],args[11],
222 args[12],args[13],args[14]
224 break;
225 case 16:ret = proc(args[0],args[1],args[2],args[3],args[4],args[5],
226 args[6],args[7],args[8],args[9],args[10],args[11],
227 args[12],args[13],args[14],args[15]
229 break;
230 default:
231 WARN(relay,"(%ld) arguments not supported.\n",cbArgs);
232 if (dwFlags == WCB16_CDECL)
233 HeapFree(GetProcessHeap(),0,args);
234 return FALSE;
236 if (dwFlags == WCB16_CDECL)
237 HeapFree(GetProcessHeap(),0,args);
238 if (pdwret)
239 *pdwret = ret;
240 return TRUE;
243 /**********************************************************************
244 * CALLBACK_CallUTProc
246 static DWORD WINAPI CALLBACK_CallUTProc( FARPROC16 proc, DWORD w1, DWORD w2 )
248 ERR( relay, "Cannot call a UT thunk proc in Winelib\n" );
249 assert( FALSE );
250 return 0;
253 /**********************************************************************
254 * CALLBACK_CallTaskRescheduleProc
256 static BOOL WINAPI CALLBACK_CallTaskRescheduleProc( void )
258 BOOL pending;
260 SYSLEVEL_EnterWin16Lock();
261 pending = TASK_Reschedule();
262 SYSLEVEL_LeaveWin16Lock();
264 return pending;
268 /**********************************************************************
269 * CALLBACK_WinelibTable
271 * The callbacks function table for Winelib
273 static const CALLBACKS_TABLE CALLBACK_WinelibTable =
275 CALLBACK_CallRegisterProc, /* CallRegisterShortProc */
276 CALLBACK_CallRegisterProc, /* CallRegisterLongProc */
277 CALLBACK_CallTaskRescheduleProc, /* CallTaskRescheduleProc */
278 NULL, /* CallFrom16WndProc */
279 CALLBACK_CallWndProc, /* CallWndProc */
280 CALLBACK_CallDriverProc, /* CallDriverProc */
281 CALLBACK_CallDriverCallback, /* CallDriverCallback */
282 CALLBACK_CallTimeFuncProc, /* CallTimeFuncProc */
283 CALLBACK_CallWindowsExitProc, /* CallWindowsExitProc */
284 CALLBACK_CallWordBreakProc, /* CallWordBreakProc */
285 CALLBACK_CallBootAppProc, /* CallBootAppProc */
286 CALLBACK_CallLoadAppSegProc, /* CallLoadAppSegProc */
287 CALLBACK_CallLocalNotifyFunc, /* CallLocalNotifyFunc */
288 CALLBACK_CallResourceHandlerProc, /* CallResourceHandlerProc */
289 CALLBACK_CallWOWCallbackProc, /* CallWOWCallbackProc */
290 CALLBACK_CallWOWCallback16Ex, /* CallWOWCallback16Ex */
291 CALLBACK_CallUTProc, /* CallUTProc */
292 CALLBACK_CallASPIPostProc, /* CallASPIPostProc */
293 /* The graphics driver callbacks are never used in Winelib */
294 NULL, /* CallDrvControlProc */
295 NULL, /* CallDrvEnableProc */
296 NULL, /* CallDrvEnumDFontsProc */
297 NULL, /* CallDrvEnumObjProc */
298 NULL, /* CallDrvOutputProc */
299 NULL, /* CallDrvRealizeProc */
300 NULL, /* CallDrvStretchBltProc */
301 NULL, /* CallDrvExtTextOutProc */
302 NULL, /* CallDrvGetCharWidth */
303 NULL /* CallDrvAbortProc */
306 const CALLBACKS_TABLE *Callbacks = &CALLBACK_WinelibTable;
309 /**********************************************************************
310 * CALLOUT_Table
312 * The callout function table for Winelib
315 CALLOUT_TABLE Callout =
317 PeekMessage16, PeekMessageA, PeekMessageW,
318 GetMessage16, GetMessageA, GetMessageW,
319 SendMessage16, SendMessageA, SendMessageW,
320 PostMessage16, PostMessageA, PostMessageW,
321 PostAppMessage16, PostThreadMessageA, PostThreadMessageW,
322 TranslateMessage16, TranslateMessage,
323 DispatchMessage16, DispatchMessageA, DispatchMessageW,
324 RedrawWindow16, RedrawWindow,
325 UserSignalProc,
326 InitThreadInput16,
327 UserYield16,
328 CURSORICON_Destroy