module "/pliant/language/context.pli"
module "/pliant/language/compiler.pli"
module "/pliant/language/unsafe.pli"

constant sdl_library "libSDL.so"

public

 # This is the OS scheduler timeslice, in milliseconds
 constant SDL_TIMESLICE 10

 # This is the maximum resolution of the SDL timer on all platforms 
 constant SDL_TIMER_RESOLUTION 10

 # Get the number of milliseconds since the SDL library initialization.
 # Note that this value wraps if the program runs for more than ~49 days.

 function SDL_GetTicks -> msecs
  arg uInt msecs
  external sdl_library "SDL_GetTicks"

 # Wait a specified number of milliseconds before returning 
 function SDL_Delay ms
  arg uInt ms
  external sdl_library "SDL_Delay"


 # Function prototype for the timer callback function 
 # You have to pass ((the_function <function_name> uInt -> uInt) executable)
 # as this returns a pointer to the executable part of the function.
 # Also, you must define the callback function with the 
 # "external_calling_convention" attribute.  

 #typedef Uint32 (SDLCALL *SDL_TimerCallback)(Uint32 interval);

 #   Set a callback to run after the specified number of milliseconds has
 # elapsed. The callback function is passed the current timer interval
 # and returns the next timer interval.  If the returned value is the 
 # same as the one passed in, the periodic alarm continues, otherwise a
 # new alarm is scheduled.  If the callback returns 0, the periodic alarm
 # is cancelled.
 #
 # To cancel a currently running timer, call SDL_SetTimer(0, NULL);
 #
 # The timer callback function may run in a different thread than your
 # main code, and so shouldn't call any functions from within itself.
 #
 # The maximum resolution of this timer is 10 ms, which means that if
 # you request a 16 ms timer, your callback will run approximately 20 ms
 # later on an unloaded system.  If you wanted to set a flag signaling
 # a frame update at 30 frames per second (every 33 ms), you might set a 
 # timer for 30 ms:
 #   SDL_SetTimer((33/10)*10, flag_update);
 #
 # If you use this function, you need to pass SDL_INIT_TIMER to SDL_Init().
 #
 # Under UNIX, you should not use raise or use SIGALRM and this function
 # in the same program, as it is implemented using setitimer().  You also
 # should not use this function in multi-threaded applications as signals
 # to multi-threaded apps have undefined behavior in some implementations.
 #

 function  SDL_SetTimer interval callback -> ret
  arg uInt interval ; arg Int ret
  arg Address callback
  external sdl_library "SDL_SetTimer"

 # New timer API, supports multiple timers
 # Written by Stephane Peter <megastep@lokigames.com>
 #

 # Function prototype for the new timer callback function.
 # The callback function is passed the current timer interval and returns
 # the next timer interval.  If the returned value is the same as the one
 # passed in, the periodic alarm continues, otherwise a new alarm is
 # scheduled.  If the callback returns 0, the periodic alarm is cancelled.
 #  This is how you would prototype a Pliant callback:
 #
 # function myNewCallback interval param -> retcode
 #  arg uInt intervall retcode; arg Address param
 #  ... 
 #
 # Then when adding the callback, do not simply use the callback's name.
 # Use instead:
 #   

 # Definition of the timer ID type
 type SDL_TimerID
  packed
  field Address info

 # Add a new timer to the pool of timers already running.
 # Returns a timer ID, or NULL when an error occurs.
 # The Timer must be passed as: 
 #    ((the_function <callback_name> uInt32 Address -> uInt) executable)
 # 
 function SDL_AddTimer interval callback param -> id
  arg uInt interval; arg SDL_TimerID id
  arg Address callback param
  external sdl_library "SDL_AddTimer"