/* 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);
####
#ifndef aTHX_
#define aTHX_
#endif
#ifdef USE_THREADS
#define HAVE_TLS_CONTEXT
#endif
/* For windows */
#ifndef SDL_PERL_DEFINES_H
#define SDL_PERL_DEFINES_H
#ifdef HAVE_TLS_CONTEXT
PerlInterpreter *parent_perl = NULL;
extern PerlInterpreter *parent_perl;
#define GET_TLS_CONTEXT parent_perl = PERL_GET_CONTEXT;
#define ENTER_TLS_CONTEXT \
PerlInterpreter *current_perl = PERL_GET_CONTEXT; \
PERL_SET_CONTEXT(parent_perl); { \
PerlInterpreter *my_perl = parent_perl;
#define LEAVE_TLS_CONTEXT \
} PERL_SET_CONTEXT(current_perl);
#else
#define GET_TLS_CONTEXT /* TLS context not enabled */
#define ENTER_TLS_CONTEXT /* TLS context not enabled */
#define LEAVE_TLS_CONTEXT /* TLS context not enabled */
#endif
#endif
#include
SV* set_timersv;
Uint32 set_timer_cb( Uint32 interval)
{
Uint32 retval;
int back;
SV* cmd;
ENTER_TLS_CONTEXT
dSP;
cmd = (SV*)set_timersv;
ENTER;
SAVETMPS;
PUSHMARK(SP);
XPUSHs(sv_2mortal(newSViv(interval)));
PUTBACK;
if (0 != (back = call_sv(cmd,G_SCALAR))) {
SPAGAIN;
if (back != 1 ) Perl_croak (aTHX_ "Timer Callback failed!");
retval = POPi;
} else {
Perl_croak(aTHX_ "Timer Callback failed!");
}
FREETMPS;
LEAVE;
LEAVE_TLS_CONTEXT
return retval;
}
int
time_set_timer ( interval, callback )
Uint32 interval
SV* callback
CODE:
set_timersv = callback;
RETVAL = SDL_SetTimer(interval, set_timer_cb);
OUTPUT:
RETVAL
####
use SDL;
use SDL::Time;
SDL::init(SDL_INIT_TIMER);
my $time = 0;
SDL::Timer::set_timer(100, sub { $time++; return $_[0]} );
print 'this will not print!'