"app" : lexicon ;
{ sdl { drawing { app >:
  
{ array
  
"poll" : [ event PollEvent >[1= event_list dispatch ]] ^ ] ;
  
\ TODO process all events of the current frame in a loop
  
}

  
"running" : pointer false , ;
  
"t" : pointer 0 , ;
  
"now" : [ ticks t ! ^ ] ;
  
"elapsed" : [ ticks t ? - ^ ] ;
  
"wait" : [ 16 elapsed - [+ sleep ^ ]] drop ^ ] ;

  
{ array
  
"update" : [ update_list execute> ^ ] ;
  
"render" :
    
[ app_bgcolor renderer ? SetRenderColor sdl_error
    
renderer ? RenderClear sdl_error
    
render_list execute>
    
renderer ? RenderPresent ^ ] ;
  
}

  
"app_display" : [
    
display 0 GetDisplay sdl_error
    
display 1@ ? app_rect 2@ ? - 2/
    
display 2@ ? app_rect 3 @ ? - 2/ app_rect 2! ^ ] ;
  
"app_init" : [
    
INIT_JOYSTICK INIT_VIDEO +or Init sdl_error
    
app_display
    
WIN_OPENGL app_rect >a 3 a?@ 2 a?@ 1 a?@ a?
    
app_name CreateWindow window !
    
ACCELERATED -1 window ? CreateRenderer renderer !
    
^ ] ;
  
"app_loop" : [ switch now poll running ?
    
>[1= update render ]] wait app_loop ^ ] ;
  
{ array
  
"app_exit" : [ running off 'app_loop suspend
    
update_list empty render_list empty
    
release_list execute>
    
renderer ? DestroyRenderer nil renderer !
    
window ? DestroyWindow nil window !
    
Quit ^ ] ;
  
}
  
{ sdl_keys
  
"app_handler" : [ event ?
    
EVT_QUIT [== drop app_exit true ^ ]]
    
EVT_KEY [== drop event 5 @ ?
      
K_PAUSE [== drop running flip true ^ ]]
      
K_ESCAPE [== drop app_exit true ^ ]]
    
]] drop false ^ ] ;
  
}
} } } >: