Files
Greg ShuflinandClaude Fable 5.1 8104955c71 Make the webcam demo run on macOS
Lean runs main on a helper thread, which Cocoa rejects for video init;
export LEAN_MAIN_USE_THREAD=0 from the justfile on macOS. Wait for the
camera permission event before reading the camera format, since SDL
grants access asynchronously.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 15:26:20 -07:00

1.8 KiB

Lean SDL3 Bindings

This is my (Greg Shuflin's) fork of Srayan Jana's Lean SDL3 bindings. I've added a few additional SDL3 bindings, particularly ones necessary to make the webcam work. Note that this is an incomplete, work-in-progress project.

Sample Projects

In this repo, run just run to build and run the original sdl3 demo, which displays some basic graphics and plays an mp3. Run just webcam to build and run the webcam demo, which accesses a webcam (if one exists) and mirrors its video on the screen.

If you want to see an example project that uses these bindings, check this out:

https://github.com/ValorZard/lean-sdl-test

How to use:

If you want to use SDL3 bindings in your own Lean4 project, add this library as a dependency in your lakefile.lean (Not .toml)

In your default target in your project, make sure you do something like this

@[default_target]
lean_exe «lean-sdl-test» where
  root := `Main
  -- this is necessary because on Linux, binaries don't automatically get picked up by the executable unless you set the rpath
  -- also, moreLinkArgs doesn't get inherited by the parent project
  moreLinkArgs :=
    if System.Platform.isWindows then #[]
    else if System.Platform.isOSX then #["-Wl,-undefined,dynamic_lookup", "-Wl,-rpath,@executable_path"]
    else #["-Wl,--allow-shlib-undefined", "-Wl,-rpath=$ORIGIN"]

On macOS, run the executable with LEAN_MAIN_USE_THREAD=0. Lean's runtime otherwise runs main on a helper thread, and Cocoa refuses to create a video device off the main thread (SDL_Init fails with "No available video device"). The justfile recipes set this for you.

Acknowledgements

MASSIVE thanks to Oliver Dressler (@oOo0oOo) and Mac Malone (@tydeu) for all the help they gave!

License & Attribution

MIT