Ok it seems `initialize-ns-app' might not be necessary after all, sorry. I looked at the python allegro5 bindings and they run a users thunk by passing it to al_run_main which does all the proper initialization.
;; allegro5.rkt (define (run thunk) (define (callback argc argv) (thunk) 0) (run-main 0 #f callback)) ;; user code (define (my-game) (define display (create-display)) ...) (allegro-run my-game) On 01/13/2013 03:35 PM, Jon Rafkind wrote: > Does the entire application have to live within the dynamic extent of the > `initialize-ns-app' call or just making the screen? > > (initialize-ns-app (lambda () (create-display)) > (do-rest-of-program) > > or > > (initialize-ns-app (lambda () (create-display) (do-rest-of-program)) > > On 01/13/2013 03:14 PM, Danny Yoo wrote: >> Hi Jon, >> >> >> [Also CCing the Racket mailing list. For folks who are writing >> bindings to graphical libraries such as SDL, the following should be >> relevant.] >> >> >> When using the Allegro bindings on Mac OS X, the user will see an >> exception on screen instantiation unless the program's running under a >> Cocoa context. >> >> Folks from other communities have figured out how to solve this. In >> particular, the PySDL folks have a small module to set it up. >> (https://github.com/albertz/PySDL/blob/master/SDL/__init__.py) >> >> I've ported the heart of this to Racket: >> >> https://gist.github.com/4526379 >> >> (Comment the use of initialize-ns-app in that code; I added it to make >> sure it was getting called.) >> >> >> initialize-ns-app provides a Cocoa context in which all the rest of >> the graphical library usage must occur on Mac OS X. So, typically >> code will look like: >> >> ;; load foreign libraries... >> >> (initiaize-ns-app >> (lambda () >> ;; Now it's safe to create the screen in here ... >> )) >> >> >> >> >> If you don't do something like this, you'll see this exception as soon >> as you start initializing the screen: >> >> 2013-01-13 15:07:22.716 racket[26263:707] *** Terminating app due to >> uncaught exception 'NSInternalInconsistencyException', reason: 'Error >> (1000) creating CGSWindow on line 259' >> *** First throw call stack: >> ( >> 0 CoreFoundation 0x00007fff8e6ca0a6 >> __exceptionPreprocess + 198 >> 1 libobjc.A.dylib 0x00007fff9681e3f0 >> objc_exception_throw + 43 >> 2 CoreFoundation 0x00007fff8e6c9e7c >> +[NSException raise:format:] + 204 >> 3 AppKit 0x00007fff951b2c29 >> _NSCreateWindowWithOpaqueShape2 + 655 >> 4 AppKit 0x00007fff951b1420 -[NSWindow >> _commonAwake] + 2002 >> 5 AppKit 0x00007fff9516fe62 -[NSWindow >> _commonInitFrame:styleMask:backing:defer:] + 1763 >> 6 AppKit 0x00007fff9516efaf -[NSWindow >> _initContent:styleMask:backing:defer:contentView:] + 1568 >> 7 AppKit 0x00007fff9516e97f -[NSWindow >> initWithContentRect:styleMask:backing:defer:] + 45 >> 8 SDL 0x0000000102f515cc >> SDL_SoftStretch + 24672 >> 9 SDL 0x0000000102f4fe38 >> SDL_SoftStretch + 18636 >> 10 SDL 0x0000000102f44da1 >> SDL_SetVideoMode + 892 >> 11 Racket 0x00000001002be82c >> ffi_call_unix64 + 76 >> 12 ??? 0x00007fff5fbfd8d0 0x0 + >> 140734799796432 >> ) >> libc++abi.dylib: terminate called throwing an exception >> Abort trap: 6 > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users