/* Static Memory for event filter call back */ static SV * eventfiltersv; int eventfilter_cb( const void * event) { dSP; int count; int filter_signal; SV * eventref = newSV( sizeof(SDL_Event *) ); void * copyEvent = safemalloc( sizeof(SDL_Event) ); memcpy( copyEvent, event, sizeof(SDL_Event) ); ENTER; SAVETMPS; PUSHMARK(SP); XPUSHs( sv_setref_pv( eventref, "SDL::Event", (void *)copyEvent) ); PUTBACK; count = call_sv(eventfiltersv, G_SCALAR); SPAGAIN; if (count != 1 ) croak("callback returned more than 1 value\n"); filter_signal = POPi; FREETMPS; LEAVE; return filter_signal; } void events_set_event_filter(callback) SV* callback CODE: eventfiltersv = callback; SDL_SetEventFilter( (SDL_EventFilter *)eventfilter_cb);