ludic/selfhost/backend
Orkuncakilkaya 3eb5447f74
All checks were successful
bootstrap / cfree-fixpoint (push) Successful in 22s
ci / build-and-test (push) Successful in 2m24s
commit-lint / conventional-commits (push) Successful in 5s
docs / build-and-deploy (push) Successful in 29s
feat(input): #89 cursor capture — Input.cursor_mode (hide/lock/confine)
A windowed action game can hide the OS cursor and lock/confine the mouse to the
window. Input.cursor_mode(mode): 0 normal, 1 hidden (draw your own reticle),
2 locked (hidden + dissociated — the mouse feeds relative motion via
Input.mouse_dx/dy and Input.mouse_x/y is a clamped virtual cursor, FPS/twin-stick
aim), 3 confined (dissociated but visible; the mouse can't leave the window).
The platform auto-releases (shows + reconnects) while the window is not key
(Cmd-Tab) and on close, so the cursor is never left captured. Headless it is a
no-op (DCE'd).

Native macOS impl in cocoa.ll: [NSCursor hide]/[unhide] (ref-counted, toggled
only on change so the count stays balanced across focus changes),
CGAssociateMouseAndMouseCursorPosition, and CGGetLastMouseDelta for the relative
virtual cursor, behind a new win_cursor_mode intrinsic. Windowed-only behaviour
(not in the headless golden suite); example compiles headless and links
windowed. Full suite 115/0, fixpoint holds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-02 08:06:34 +03:00
..
game feat(input,ecs): #79 Input.axis_i directional int + #84 world bounds 2026-09-02 07:44:41 +03:00
stdlib feat(engine): Tiled P1 — rt_tmap model + GID resolver + render + projection (#69) 2026-09-01 14:43:29 +03:00
emit_addr.ludic feat(engine): Tiled P1 — rt_tmap model + GID resolver + render + projection (#69) 2026-09-01 14:43:29 +03:00
emit_call.ludic feat(input): #89 cursor capture — Input.cursor_mode (hide/lock/confine) 2026-09-02 08:06:34 +03:00
emit_core.ludic feat(compiler): dynamic system registration + --emit-module for binary packages (#64) 2026-09-01 07:44:18 +03:00
emit_decl.ludic feat(input,ecs): #79 Input.axis_i directional int + #84 world bounds 2026-09-02 07:44:41 +03:00
emit_expr.ludic feat(errors): recoverable failures as values — try/else over ok/err results (#46) 2026-08-31 15:04:14 +03:00
emit_head.ludic feat(input): #89 cursor capture — Input.cursor_mode (hide/lock/confine) 2026-09-02 08:06:34 +03:00
emit_intrin.ludic feat(input,ecs): #79 Input.axis_i directional int + #84 world bounds 2026-09-02 07:44:41 +03:00
emit_intrin2.ludic feat(input): #89 cursor capture — Input.cursor_mode (hide/lock/confine) 2026-09-02 08:06:34 +03:00
emit_mem.ludic refactor(selfhost): reorganise into concern-based subdirectories 2026-08-31 00:26:02 +03:00
emit_new.ludic feat(lang): new Type { field: value } record initialisers 2026-08-31 01:20:06 +03:00
emit_stmt.ludic feat(types): tagged-union enums — variant payloads + binding match + exhaustiveness (#56) 2026-09-01 03:07:46 +03:00