Skip to content

v0.9.1

Choose a tag to compare

@cursor cursor released this 01 Oct 12:41
· 59 commits to main since this release

0.9.1 (2026-10-01)

Breaking changes

  • Published package names moved to the fc-gpui* family — the 18 release crates are renamed
    on crates.io. Cargo target names are untouched, so use gpui::*, use gpui_core::*, and the
    internal collections/util/refineable imports are unchanged; only the package you write
    in Cargo.toml changes.

    Old package New package
    adabraka-gpui fc-gpui
    adabraka-gpui-core fc-gpui-core
    adabraka-gpui-wgpu fc-gpui-wgpu
    adabraka-gpui-linux fc-gpui-linux
    adabraka-gpui-macos fc-gpui-macos
    adabraka-gpui-windows fc-gpui-windows
    adabraka-gpui-platform fc-gpui-platform
    adabraka-gpui-macros fc-gpui-macros
    adabraka_util fc-gpui-util
    adabraka_util_macros fc-gpui-util-macros
    adabraka_collections fc-gpui-collections
    adabraka_semantic_version fc-gpui-semantic-version
    adabraka_derive_refineable fc-gpui-derive-refineable
    adabraka_refineable fc-gpui-refineable
    adabraka_sum_tree fc-gpui-sum-tree
    adabraka_http_client fc-gpui-http-client
    adabraka_media fc-gpui-media
    adabraka_perf fc-gpui-perf

    Downstream packages that rename the facade dependency keep working; the GPUI macros now probe
    fc-gpui and fc-gpui-core instead of the old names, and the
    [package.metadata.gpui-macros] crate = "…" override is unchanged.

Fixes

  • macOS clipboard tests under cargo's worker-thread harness — test_clipboard no longer
    constructs MacPlatform on a libtest worker, where MainThreadMarker::new is None. Production
    MacPlatform::new still panics off the AppKit main thread.

Improvements

  • Workspace lockfile no longer records legacy objc or block — a workspace-only
    [patch.crates-io] for zed-scap omits unused macOS cocoa/objc deps (Linux/Windows/FreeBSD
    capture still uses the 0.0.8-zed API). Residual block from core-video / core-graphics2 is
    gated behind unused display-link / display-stream features (default-features = false plus
    link on core-video). Downstream lockfiles without these patches still see registry objc /
    block.

  • MacWindowState::native_window is Option<Retained<NSWindow>> — typed AppKit replaces most
    raw id msg_send! for frame, screen, tabbing, fullscreen, IME, and dock progress. Drop takes
    the Retained to unwind the window-ivar Arc cycle. A few private or deprecated selectors stay
    as objc2 msg_send! (_zoomFill:, nil tabbing identifier). Outbound start_external_drag
    remains deferred.

  • fc-gpui-media drops leftover objc — bindgen generates C bindings instead of an
    Objective-C path; Core Video return and pixel-format constants come from the core-video crate.
    Public media API names are unchanged.

  • fc-gpui-macos drops the objc crate — leftover window.rs / platform.rs msg_send!
    sites (clipboard RTF, notifications, scroller style, recent documents, paths, dispatcher and
    display-link main-thread checks, keyboard, window lifecycle) use typed objc2. A few private
    msg_send! leftovers remain.

  • macOS Metal renderer on objc2-metal — the gfx-rs metal crate and ConcreteBlock
    presentable completed handlers are replaced by objc2-metal, CAMetalLayer, and block2. The
    metal package is gone from the workspace lockfile.

  • macOS AppKit classes via objc2 define_class! — GPUIApplication /
    GPUIApplicationDelegate and GPUIWindow / GPUIPanel / GPUIView / BlurredView plus the
    window-state archiver and unarchiver (in window_classes.rs) replace legacy ClassDecl + ivars.

  • macOS screen-capture stream on objc2 — SCStream start/stop, sample/output handlers, and the
    remaining stream ClassDecl / ConcreteBlock path use objc2 define_class! and block2
    RcBlock. CI's macOS visual smoke compiles fc-gpui-macos with screen-capture. Exactly-once
    Ended / Cancelled / Failed callbacks are unchanged.

  • macOS leftover objc2 islands — biometric LocalAuthentication, SMAppService auto-launch,
    os_info, focused-window lookup, network-path monitor, media keys, tray menus, open_url /
    reveal_path, and thermal-state handlers move from leftover objc / ConcreteBlock call sites
    to typed objc2 + block2.

  • macOS simple fullscreen restore bounds — window_bounds() reports the pre-simple-fullscreen frame so a restart does not reopen the window maximized.

  • Window::toggle_simple_fullscreen / is_simple_fullscreen — macOS-only borderless fullscreen that covers the menu bar and notch without a Mission Control space. No-op / false on other platforms. This crate has no fullscreen_mode setting; apps choose when to call the API.

  • Window::native_window_state / restore_native_window_state — encode and replay an opaque native restorable-state blob. On macOS this is AppKit window restoration (frame and Space); other platforms return None / no-op.

  • macOS titlebar Fill honors tiled-window margins — when System Settings maps double-click to Fill, GPUI prefers AppKit's private _zoomFill: so "Tiled windows have margins" applies, and falls back to zoom: if that selector is missing.

  • GitHub release request timeout — GitHub release list and tag lookups attach a 10-second RequestTimeout covering the full response body, so a stalled GitHub connection cannot hang callers indefinitely. Client implementations that honor the extension apply it; this workspace has no reqwest_client crate.

  • Windows Git Bash / PowerShell discovery — Git Bash lookup uses GIT_INSTALL_ROOT and walks up from git so a mingw64\bin PATH prefix (launching from Git Bash) still finds bin\bash.exe. PowerShell discovery also checks .NET global tools, MSIX package family names, and Windows PowerShell; get_powershell() returns None if none are found, and get_windows_system_shell then falls back to SystemRoot\System32\cmd.exe. Windows app restart uses a discovered PowerShell instead of a hard-coded powershell.exe.

  • Opt-in increase_open_file_limit on Unix — adabraka_util::increase_open_file_limit() raises the process soft RLIMIT_NOFILE toward 65,536 (10,240 on macOS) without changing the hard limit. GPUI does not call this from Application::new or any other startup path; apps that need it must call it themselves.

  • Window::focus_lost_restore_target — while focus-lost listeners run, returns the closest ancestor of the previously focused element that can still receive focus. Returns None at other times, or when no such ancestor exists.

  • on_file_drop_exit for inbound file-drag leave — div().on_file_drop_exit(...) runs when a platform file drag leaves the window while the element is hovered. This is a window-local FileDropEvent::Exited, not notification that an outbound drag session ended.

  • all_font_names lists only real families — TextSystem::all_font_names no longer appends the hardcoded fallback stack or .SystemUIFont. Suggestions include platform fonts and fonts registered with add_fonts. Virtual aliases such as .SystemUIFont still resolve; they are just omitted from the list.

  • Malformed ${...} shell variables no longer panic — ShellKind::to_cmd_variable and to_powershell_variable use strip_suffix('}') and pass through malformed references such as ${ instead of slicing off the last byte.

  • HoverListenerMode for keyboard-modality hover listeners — div().hover_listener_mode(HoverListenerMode::InputModalityIndependent) keeps on_hover hit-testing after keyboard input (menus that pause on hover). Default InputModalityAware still clears hover on key press. Hover styles and tooltips are unchanged.

  • Layout padding snap, SVG data/ExactSize, and test-window handles — snap recomputed
    padding to the device-pixel grid before clamp_scroll so fractional rem sizes do not grow
    phantom scrollbars; svg().data(bytes) renders from raw SVG bytes; SvgSize::ExactSize and
    render_parsed rasterize at exact device-pixel dimensions while the scale-factor path stays 2×;
    TestWindow returns HandleError::NotSupported instead of panicking on raw handles;
    Hitbox::is_hovered_at hit-tests a position against the last frame; Window::painted_quads
    exposes scene quads under test-support.

  • Windows mixed-DPI placement and COLR emoji clear — place new windows using the target
    monitor's DPI instead of GetDpiForWindow after CW_USEDEFAULT; clear the COLR emoji D3D
    render target before compositing layers so uncovered texels do not keep DXGI pool garbage.

  • Linux X11/Wayland correctness ports — enable wayland-backend's log feature so connection
    errors cannot panic when stderr is gone; write a trailing NUL on X11 WM_CLASS; clear the ICCCM
    urgency hint when a window becomes active; reject a null XKB context instead of using it; drop the
    X11 client RefMut before WM_DELETE_WINDOW close callbacks; drain x11rb-buffered events after
    foreground idle work and stop forcing SetInputFocus (keep _NET_ACTIVE_WINDOW) so the first map
    is not blank.

  • Every dependency now resolves from crates.io — fc-gpui-wgpu depends on the published
    wgpu 29.0.4 instead of the zed-industries/wgpu v29 branch, whose only two commits ahead of
    the upstream v29 release (the XCB EGL display handle and an examples README edit) both landed
    in 29.0.4. The root [patch.crates-io] override for windows-capture is replaced by a
    >=1.3.6, <1.5 requirement on fc-gpui-core's screen-capture feature, which keeps
    zed-scap 0.0.8-zed on the five-argument Settings::new for downstream builds too instead of
    only inside this workspace. Windows capture source titles lose Zed's Monitor::name display
    detection fix, which is not in any published windows-capture; zed-scap falls back to the GDI
    device name when name() fails.