Windowing foundation: one model, decided once a frame, tested without a screen
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
Research direction
Start with docs/WINDOWING_FOUNDATION_PLAN.md, which contains the review findings and breaks the work into separate PRs; note the stated dependencies on #237, #238, and #242. Choose one step and follow its named scope, such as running the app module tests in step 1 or measuring Objective-C messages in step 4. Done means completing that step while preserving today's behaviour; this issue describes a broad, multi-step plan rather than a single newcomer-sized change.
Written by the indexing model from the issue text.
Description
The plan is docs/WINDOWING_FOUNDATION_PLAN.md (#246). Every step keeps today's behaviour. They make the windowing (floats, menus, dialogs, view drags, drop zones) testable without a screen and cheap in native calls, share one model across platforms, and leave the backend usable by any dvui app. It builds on NATIVE_WINDOWS_PLAN.md and WINDOWS_LINUX_GLASS_PLAN.md, and doesn't repeat them.
Findings from the 2026-10-08 review are in the doc. In short:
- one
Viewportstruct serves five kinds of window; - Popout re-decides every window by hand each frame, through five near-copies of fill-and-present;
- there are seven coordinate spaces and two different band thresholds;
- drag hit tests repeat once per region per frame;
- macOS makes about 20 Objective-C messages per float per frame, changed or not;
- glass looks are mirrored four deep and the shader is hand-synced three ways;
- 32 layout tests never ran;
- nothing popped out is tested.
Steps, each its own PR:
- 1. Run the
appmodule's own tests (32 that never ran): #244 - 2. Menus and dialogs stay auxiliary windows on macOS: #245
- 3. Typed coordinate spaces and one
bandOfinviewport_map, after #237 and #238 - 4.
OsWindow: kinds as a union, native handles cached, dressing applied only on change, per-kind budgets (measure Objective-C messages per frame before and after) - 5. The frame's windows as a pure plan the backend reconciles, plus a fake backend and the first integration tests that pop a float out
- 6. One
fillfor every OS window, with a target pool - 7. A drag model computed once a frame, with tests, and the release rules in one table
- 8. Float, window and drag lifecycles as explicit states
- 9. Glass: published capabilities, one look record end to end, shader parity (after #242)
- 10. Full-screen transitions driven by Core Animation, if release builds don't hold 8.3 ms
- 11. dvui changes on the fork (subwindow render redirection, a screens hook, subwindow kind and parent), the backend as a package, and dvui's example app as the acceptance test
- 12. Remove the dead viewport API, along with steps 3–5
- Dominant language
- Zig
- Stars
- 1.5k
- Forks
- 40
- Avg merge
- 5h 35m
- Merged PRs (30d)
- 151
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from fizzyedit/fizzy
-
replay: bench-replay no longer compiles, and nothing in CI builds itPossibly taken A pull request linked to this issue is open or already merged. Openbug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
fizzyedit/fizzy#306 · 3 comments ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 8/100
Maintainers usually reply within 1 day
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Maintainers usually reply within 1 day
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 35/100
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 12/100
Maintainers usually reply within 1 day
Similar issues
-
`TIMESTAMP`, `TIMESTAMP_NTZ`, `TINYINT` and the other `TypeDecorator`s don't declare `python_type`Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
generated-by-ai
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
umbraco/Umbraco-CMS-MCP-Dev#562 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
bevyengine/dlss_wgpu#37 ·
-
afk-ok area:data-quality importer size:S
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
enorm-labs/event-junkie#3166 ·
Maintainers usually reply within 1 day
-
BUG: Tool.from_gradio raises KeyError for ordinary Python parameter annotationsPossibly taken A pull request linked to this issue is open or already merged. Openbug
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
huggingface/smolagents#2976 ·
Maintainers usually reply within 1 day