Find a file
Pelotrio 679ad7c304
gpui: Fix uniform_list item layout far down long lists (#65288)
## Summary

`uniform_list` computed the visible range and each item's origin from
the scroll offset in `f32`. Past 2^27px, adjacent `f32` values are 16px
apart. In a list of 24px items, that point is about 5.6 million items
in. From there:

- items are placed with alternating 16px and 32px gaps instead of 24px;
- the visible range can start one item late, leaving a blank strip at
the top of the list (and sometimes at the bottom);
- smaller errors start earlier, such as a 1px offset at about a million
items, because the large offset is added to the viewport origin in
`f32`.

This change computes the visible item indices and the viewport-relative
item offsets in `f64`, then converts only the small offsets back to
`Pixels`. The arithmetic stays local to `uniform_list`'s prepaint, and
nothing changes for ordinary list sizes.

The stored scroll offset (`ScrollHandle`) is still `f32`, so very far
down a long list the scroll position itself stays quantized.
`scroll_to_item` can land up to half a step (8px at this depth) away
from the item's exact top, and very small scroll deltas can be lost.
Fixing that would mean changing the scroll offset representation used by
every scrollable element, so I left it out of this PR.

I hit this in a GPUI file search app showing ~9.8 million results in a
table built on `uniform_list`:

<img width="1336" height="874" alt="image"
src="https://github.com/user-attachments/assets/c25b2c1d-3151-4a87-9742-c3820c1d4aac"
/>


## Testing

- Added `test_item_positions_far_down_long_list`: 10M items of 24px in a
200px list, with the scroll offset set 16px into item 9,000,002. It
asserts which items render and their tops (`-16, 8, 32, … 176`).
- On `main` it fails: item 9,000,002 is missing and the tops are `0, 32,
64, 80, 96, 128, …`.
  - With this change it passes.
- `cargo test -p gpui --lib uniform_list` passes, including the existing
`test_scroll_strategy_nearest`. `cargo clippy -p gpui --lib --tests` is
clean.
- Manually on Windows, in a real window with 9,824,090 rows of 24px, I
checked 12 scroll positions, including odd rows reached from far away.
Each check verifies consecutive rows, uniform 24px spacing, and that
rows cover the viewport top and bottom.
  - Before: 7 of 12 failed.
  - After: 12 of 12 passed.

To reproduce: run the new test against `main`, or render a
`uniform_list` with ~10M fixed-height items and scroll near the end.

## Self-review

- [x] I've reviewed my diff for quality, security, reliability, and
performance.
- [x] UI changes follow the
[checklist](https://zed.dev/docs/development/ui-checklist). (No visible
UI changes in Zed.)
- [x] Tests cover the new or changed behavior.

I used Claude to help investigate this and write the change. I've
reviewed it and understand it.

Release Notes:

- [GPUI] Fixed layout glitches for uniform_lists with a lot of
virtualized content.

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
2026-10-09 08:03:37 +00:00
.agents/skills gpui: Add seeded benchmarks and heap allocation metrics (#64843) 2026-09-28 13:02:30 +00:00
.cargo Reduce release binary sizes (#65168) 2026-10-07 14:56:09 +00:00
.cloudflare Improve docs AI readiness (#59577) 2026-07-08 20:54:51 +00:00
.config extensions_ui: Sync suggested extensions with the live registry (#63211) 2026-09-23 20:50:24 +00:00
.factory Add humanizer skill for AI writing pattern detection (#50021) 2026-02-24 14:58:52 -06:00
.github wezel: Use bundle-linux for size measurements (#65234) 2026-10-06 11:30:37 +00:00
.wezel wezel: Use bundle-linux for size measurements (#65234) 2026-10-06 11:30:37 +00:00
.zed Move some configuration files out of the repository root (#64303) 2026-09-16 14:08:49 +00:00
assets Make mermaid diagram font family configurable (#63430) 2026-10-06 12:47:57 +00:00
ci Move Nightly release to gh-workflow (#41349) 2025-10-28 13:57:23 -06:00
crates gpui: Fix uniform_list item layout far down long lists (#65288) 2026-10-09 08:03:37 +00:00
docs Update edit prediction messaging for the Free plan (#65258) 2026-10-07 16:40:00 +00:00
extensions html: Bump to v0.3.2 (#64371) 2026-09-17 09:59:21 +00:00
legal legal: Use absolute URLs for Terms of Service and Privacy Policy links (#62684) 2026-08-17 09:35:54 +00:00
nix Update nixpkgs and use its WebRTC package (#65203) 2026-10-05 21:03:45 +00:00
script Reduce release binary sizes (#65168) 2026-10-07 14:56:09 +00:00
tooling Fix incorrect LLD used when bundling (#65183) 2026-10-05 15:03:19 +00:00
.git-blame-ignore-revs Add PR 50413 to .git-blame-ignore-revs (#50421) 2026-03-01 00:50:33 +01:00
.gitattributes
.gitignore edit_prediction: Adjust to support Ollama to be used for AI edit prediction (#63519) 2026-09-01 16:07:40 +00:00
.mailmap Update .mailmap (#47413) 2026-01-22 23:57:26 +05:30
.prettierrc
.rules gpui: Add bench_metrics for multi-metric Criterion benchmarks (#64753) 2026-09-27 17:37:29 +00:00
AGENTS.md ai: Symlink an AGENTS.md file to .rules (#45939) 2026-01-19 15:29:42 +01:00
Cargo.lock gpui: Measure frame pacing against each window's refresh rate (#65351) 2026-10-09 05:44:50 +00:00
Cargo.toml gpui_apple: Share CoreText, Keychain, and thermal services (#65058) 2026-10-09 05:35:20 +00:00
CLAUDE.md
clippy.toml Revert "Revert scheduler update (#46659)" (#46671) 2026-01-14 07:19:13 +00:00
CODE_OF_CONDUCT.md
compose.yml Move some configuration files out of the repository root (#64303) 2026-09-16 14:08:49 +00:00
CONTRIBUTING.md Improve contribution guidelines and experience (#64296) 2026-09-25 15:42:49 +00:00
corgi.toml gpui_macos: Migrate screen capture to objc2 (#64251) 2026-09-17 01:46:02 +00:00
default.nix nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00
Dockerfile-collab Bump Rust to 1.98.1 (#63010) 2026-09-11 09:13:44 +00:00
Dockerfile-collab.dockerignore
Dockerfile-cross.dockerignore
Dockerfile-distros Removal of mold/wild scripts and mentions in docs (#53078) 2026-04-08 21:20:02 +03:00
Dockerfile-distros.dockerignore
flake.lock Update nixpkgs and use its WebRTC package (#65203) 2026-10-05 21:03:45 +00:00
flake.nix ci: Remove garnix substitutor (#58033) 2026-05-29 05:56:42 +00:00
GEMINI.md
LICENSE-APACHE
LICENSE-GPL
Procfile
Procfile.web Remove PostgREST (#41299) 2025-10-27 13:27:59 -04:00
README.md markdown: Restore fallback language highlighting for untagged code blocks (#63023) 2026-08-21 16:00:50 +00:00
rust-toolchain.toml Bump Rust to 1.98.1 (#63010) 2026-09-11 09:13:44 +00:00
rustfmt.toml nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00
shell.nix nix: Use flake-parts, partitions, and treefmt-nix (#45321) 2026-02-02 14:26:42 +00:00

Zed

Zed CI

Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.


Installation

On macOS, Linux, and Windows you can download Zed directly or install Zed via your local package manager (macOS/Linux/Windows).

Other platforms are not yet available:

Developing Zed

Contributing

See CONTRIBUTING.md for ways you can contribute to Zed.

Also... we're hiring! Check out our jobs page for open roles.

Licensing

Zed source code is licensed primarily under GPL-3.0-or-later, with Apache-2.0 components where marked.

License information for third party dependencies must be correctly provided for CI to pass.

We use cargo-about to automatically comply with open source licenses. If CI is failing, check the following:

  • Is it showing a no license specified error for a crate you've created? If so, add publish = false under [package] in your crate's Cargo.toml.
  • Is the error failed to satisfy license requirements for a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to the accepted array in script/licenses/zed-licenses.toml.
  • Is cargo-about unable to find the license for a dependency? If so, add a clarification field at the end of script/licenses/zed-licenses.toml, as specified in the cargo-about book.

Sponsorship

Zed is developed by Zed Industries, Inc., a for-profit company.

If you’d like to financially support the project, you can do so via GitHub Sponsors. Sponsorships go directly to Zed Industries and are used as general company revenue. There are no perks or entitlements associated with sponsorship.