Repository navigation
v0.9.1
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, souse gpui::*,use gpui_core::*, and the
internalcollections/util/refineableimports are unchanged; only thepackageyou write
inCargo.tomlchanges.Old package New package adabraka-gpuifc-gpuiadabraka-gpui-corefc-gpui-coreadabraka-gpui-wgpufc-gpui-wgpuadabraka-gpui-linuxfc-gpui-linuxadabraka-gpui-macosfc-gpui-macosadabraka-gpui-windowsfc-gpui-windowsadabraka-gpui-platformfc-gpui-platformadabraka-gpui-macrosfc-gpui-macrosadabraka_utilfc-gpui-utiladabraka_util_macrosfc-gpui-util-macrosadabraka_collectionsfc-gpui-collectionsadabraka_semantic_versionfc-gpui-semantic-versionadabraka_derive_refineablefc-gpui-derive-refineableadabraka_refineablefc-gpui-refineableadabraka_sum_treefc-gpui-sum-treeadabraka_http_clientfc-gpui-http-clientadabraka_mediafc-gpui-mediaadabraka_perffc-gpui-perfDownstream packages that rename the facade dependency keep working; the GPUI macros now probe
fc-gpuiandfc-gpui-coreinstead 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_clipboardno longer
constructsMacPlatformon a libtest worker, whereMainThreadMarker::newisNone. Production
MacPlatform::newstill panics off the AppKit main thread.
Improvements
-
Workspace lockfile no longer records legacy
objcorblock— a workspace-only
[patch.crates-io]forzed-scapomits unused macOS cocoa/objcdeps (Linux/Windows/FreeBSD
capture still uses the 0.0.8-zed API). Residualblockfromcore-video/core-graphics2is
gated behind unuseddisplay-link/display-streamfeatures (default-features = falseplus
linkoncore-video). Downstream lockfiles without these patches still see registryobjc/
block. -
MacWindowState::native_windowisOption<Retained<NSWindow>>— typed AppKit replaces most
rawidmsg_send!for frame, screen, tabbing, fullscreen, IME, and dock progress. Drop takes
theRetainedto unwind the window-ivarArccycle. A few private or deprecated selectors stay
as objc2msg_send!(_zoomFill:, nil tabbing identifier). Outboundstart_external_drag
remains deferred. -
fc-gpui-mediadrops leftoverobjc— bindgen generates C bindings instead of an
Objective-C path; Core Video return and pixel-format constants come from thecore-videocrate.
Public media API names are unchanged. -
fc-gpui-macosdrops theobjccrate — leftoverwindow.rs/platform.rsmsg_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-rsmetalcrate andConcreteBlock
presentable completed handlers are replaced byobjc2-metal,CAMetalLayer, andblock2. The
metalpackage is gone from the workspace lockfile. -
macOS AppKit classes via objc2
define_class!—GPUIApplication/
GPUIApplicationDelegateandGPUIWindow/GPUIPanel/GPUIView/BlurredViewplus the
window-state archiver and unarchiver (inwindow_classes.rs) replace legacyClassDecl+ ivars. -
macOS screen-capture stream on objc2 — SCStream start/stop, sample/output handlers, and the
remaining streamClassDecl/ConcreteBlockpath use objc2define_class!andblock2
RcBlock. CI's macOS visual smoke compilesfc-gpui-macoswithscreen-capture. Exactly-once
Ended/Cancelled/Failedcallbacks 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 leftoverobjc/ConcreteBlockcall 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 /falseon other platforms. This crate has nofullscreen_modesetting; 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 returnNone/ 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 tozoom:if that selector is missing. -
GitHub release request timeout — GitHub release list and tag lookups attach a 10-second
RequestTimeoutcovering the full response body, so a stalled GitHub connection cannot hang callers indefinitely. Client implementations that honor the extension apply it; this workspace has noreqwest_clientcrate. -
Windows Git Bash / PowerShell discovery — Git Bash lookup uses
GIT_INSTALL_ROOTand walks up fromgitso amingw64\binPATH prefix (launching from Git Bash) still findsbin\bash.exe. PowerShell discovery also checks .NET global tools, MSIX package family names, and Windows PowerShell;get_powershell()returnsNoneif none are found, andget_windows_system_shellthen falls back toSystemRoot\System32\cmd.exe. Windows app restart uses a discovered PowerShell instead of a hard-codedpowershell.exe. -
Opt-in
increase_open_file_limiton Unix —adabraka_util::increase_open_file_limit()raises the process softRLIMIT_NOFILEtoward 65,536 (10,240 on macOS) without changing the hard limit. GPUI does not call this fromApplication::newor 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. ReturnsNoneat other times, or when no such ancestor exists. -
on_file_drop_exitfor 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-localFileDropEvent::Exited, not notification that an outbound drag session ended. -
all_font_nameslists only real families —TextSystem::all_font_namesno longer appends the hardcoded fallback stack or.SystemUIFont. Suggestions include platform fonts and fonts registered withadd_fonts. Virtual aliases such as.SystemUIFontstill resolve; they are just omitted from the list. -
Malformed
${...}shell variables no longer panic —ShellKind::to_cmd_variableandto_powershell_variableusestrip_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)keepson_hoverhit-testing after keyboard input (menus that pause on hover). DefaultInputModalityAwarestill 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 beforeclamp_scrollso fractional rem sizes do not grow
phantom scrollbars;svg().data(bytes)renders from raw SVG bytes;SvgSize::ExactSizeand
render_parsedrasterize at exact device-pixel dimensions while the scale-factor path stays 2×;
TestWindowreturnsHandleError::NotSupportedinstead of panicking on raw handles;
Hitbox::is_hovered_athit-tests a position against the last frame;Window::painted_quads
exposes scene quads undertest-support. -
Windows mixed-DPI placement and COLR emoji clear — place new windows using the target
monitor's DPI instead ofGetDpiForWindowafterCW_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'slogfeature so connection
errors cannot panic when stderr is gone; write a trailing NUL on X11WM_CLASS; clear the ICCCM
urgency hint when a window becomes active; reject a null XKB context instead of using it; drop the
X11 clientRefMutbeforeWM_DELETE_WINDOWclose callbacks; drain x11rb-buffered events after
foreground idle work and stop forcingSetInputFocus(keep_NET_ACTIVE_WINDOW) so the first map
is not blank. -
Every dependency now resolves from crates.io —
fc-gpui-wgpudepends on the published
wgpu 29.0.4instead of thezed-industries/wgpuv29branch, whose only two commits ahead of
the upstreamv29release (the XCB EGL display handle and an examples README edit) both landed
in 29.0.4. The root[patch.crates-io]override forwindows-captureis replaced by a
>=1.3.6, <1.5requirement onfc-gpui-core'sscreen-capturefeature, which keeps
zed-scap 0.0.8-zedon the five-argumentSettings::newfor downstream builds too instead of
only inside this workspace. Windows capture source titles lose Zed'sMonitor::namedisplay
detection fix, which is not in any publishedwindows-capture;zed-scapfalls back to the GDI
device name whenname()fails.