Merge pull request #1380 from binaricat/fix/issue-1363-nerd-font-glyphs-on-startup
Some checks failed
build-packages / ${{ needs.dedupe.outputs.skip_heavy_ci == 'true' && 'deduped build-linux-x64' || 'build-linux-x64' }} (push) Has been cancelled
build-packages / ${{ needs.dedupe.outputs.skip_heavy_ci == 'true' && 'deduped build-linux-arm64' || 'build-linux-arm64' }} (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / dedupe push run (push) Has been cancelled
build-packages / dedupe result (push) Has been cancelled
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled

fix(terminal): refresh Nerd Font glyphs on cold start (fixes #1363)
This commit is contained in:
陈大猫
2026-06-10 19:59:13 +08:00
committed by GitHub

View File

@@ -652,6 +652,16 @@ export function useTerminalEffects(ctx: TerminalEffectsContext) {
await fontFaceSet.ready; await fontFaceSet.ready;
if (cancelled) return; if (cancelled) return;
// Ensure bundled Nerd Font icon fallbacks are loaded at the terminal's
// cell size. Shell prompts can arrive before these faces finish loading
// on cold start (Linux), leaving Powerline glyphs cached as tofu (#1363).
try {
await fontFaceSet.load(`${effectiveFontSize}px "Symbols Nerd Font Mono"`);
} catch (err) {
logger.warn("Nerd Font preload failed", err);
}
if (cancelled) return;
const term = termRef.current as { const term = termRef.current as {
cols: number; cols: number;
rows: number; rows: number;
@@ -664,6 +674,13 @@ export function useTerminalEffects(ctx: TerminalEffectsContext) {
logger.warn("Font remeasure failed", err); logger.warn("Font remeasure failed", err);
} }
// remeasureFont does not invalidate cells rasterized before fonts were ready.
xtermRuntimeRef.current?.clearTextureAtlas();
const visibleTerm = termRef.current;
if (visibleTerm) {
forceSyncRenderAfterResize(visibleTerm);
}
try { try {
fitAddon?.fit(); fitAddon?.fit();
} catch (err) { } catch (err) {