Re: Help with callbacks
"smallhairytroll" <[email protected]> Wed, 11 Jun 2003 01:16:28 -0000
| Newsgroups | gmane.lisp.corman |
|---|---|
| Message-ID | <[email protected]> |
I have been adding fprintf statements to the SDL.dll, printing out
the values being passed to and from the Lisp callback function.
Everything checks out: SDL receives and stores the correct address
from the callback function. The correct values are being passed back
to the callback when it is called (using the correct types, I
think), but still Lisp crashes.
So my question is: Has anyone used a callback in Lisp that is passed
two parameters ? Passing a single parameter to a callback works.
Passing two parameters doesn't seem to work.
For the event filter callback that takes a single parameter and
therefore WORKS: here is the SDL specific code:
typedef int (*SDL_EventFilter)(const SDL_Event *event);
(PROGN
(EXPORT '(SDL_EVENTFILTER))
(C-TYPES:DEFCTYPE SDL_EVENTFILTER (:VOID *)))
extern DECLSPEC void SDL_SetEventFilter(SDL_EventFilter filter);
(PROGN
(EXPORT '(SDL_SETEVENTFILTER))
(C-TYPES:DEFUN-DLL
SDL_SETEVENTFILTER
((FILTER SDL_EVENTFILTER))
:RETURN-TYPE
:VOID
:LIBRARY-NAME
"SDL.dll"
:ENTRY-NAME
"SDL_SetEventFilter"
:LINKAGE-TYPE
:C)
// Setting up the callback
SDL_EventFilter SDL_EventOK = NULL;
void SDL_SetEventFilter (SDL_EventFilter filter)
{
SDL_EventOK = filter;
}
// Fireing the callback
(*SDL_EventOK)(&event)
The Lisp code looks like this:
(ct:defun-c-callback FilterEvents ((event (:void *)))
(if (eql SDL_MOUSEMOTION (ct:cref SDL_Event event type))
(progn
(fformat "Yup, mouse moved")
0)
1))
(SDL_SetEventFilter (ct:get-callback-procinst 'FilterEvents))
Now, for the callback that takes two parameters and DOES NOT work:
typedef Uint32 (*SDL_NewTimerCallback)(Uint32 interval, void *param);
(PROGN
(EXPORT '(SDL_NEWTIMERCALLBACK))
(C-TYPES:DEFCTYPE SDL_NEWTIMERCALLBACK (:VOID *)))
extern DECLSPEC SDL_TimerID SDL_AddTimer(Uint32 interval,
SDL_NewTimerCallback callback, void *param);
(PROGN
(EXPORT '(SDL_ADDTIMER))
(C-TYPES:DEFUN-DLL
SDL_ADDTIMER
((INTERVAL UINT32)
(CALLBACK SDL_NEWTIMERCALLBACK)
(PARAM (:VOID *)))
:RETURN-TYPE
SDL_TIMERID
:LIBRARY-NAME
"SDL.dll"
:ENTRY-NAME
"SDL_AddTimer"
:LINKAGE-TYPE
:C)
struct _SDL_TimerID {
Uint32 interval;
SDL_NewTimerCallback cb;
void *param;
Uint32 last_alarm;
struct _SDL_TimerID *next;
};
// Setting up the callback
SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback
callback, void *param)
{
t = (SDL_TimerID) malloc(sizeof(struct _SDL_TimerID));
t->interval = ROUND_RESOLUTION(interval);
t->cb = callback;
t->param = param;
}
// Fireing the callback
ms = t->cb(t->interval, t->param);
And the Lisp code:
(ct:defun-c-callback my-timer-func-1 ((interval Uint32) (param
(:void *)))
(fformat "Timer Fired, Yup.")
(values interval))
(setf var-1 (ct:malloc (ct:sizeof :LONG)))
(setf (ct:cref (:long *) var-1 0) 1001)
(setf a-timer-1 (SDL_AddTimer
500
(ct:get-callback-procinst 'my-timer-func-1) var-1))
I just don't know.
-Luke
------------------------ Yahoo! Groups Sponsor ---------------------~-->
Get A Free Psychic Reading! Your Online Answer To Life's Important Questions.
http://us.click.yahoo.com/Lj3uPC/Me7FAA/ySSFAA/SyjtlB/TM
---------------------------------------------------------------------~->
To unsubscribe from this group, send an email to:
[email protected]
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/