macOS: IME preedit text ignores font-thicken (composing text renders thinner than committed text; most visible with Korean/Hangul) #13758
Unanswered
imgoldbug
asked this question in
Issue Triage
Replies: 1 comment 1 reply
I don't see any screenshots here. Also please test the Ghostty.app build yourself before opening a discussion here. |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

Uh oh!
There was an error while loading. Please reload this page.
Issue Description
On macOS with
font-thicken = true, glyphs that are still being composed by an IME (the underlined preedit text) are rendered without thickening, while committed text on the same line is thickened. The composing syllable looks noticeably thinner and dimmer than its neighbours, and snaps to the correct weight the instant it is committed.This is most visible with Korean (Hangul) input, because every syllable is assembled over 2–5 keystrokes: preedit text is on screen almost continuously while typing, so the weight difference shows up on essentially every syllable. The code path is IME-agnostic (Japanese, Chinese, etc. go through the same one) — Hangul just makes it obvious.
Root cause
addGlyphpasses the thicken options to the font renderer, butaddPreeditCellomits them:src/renderer/generic.zig#L3182-L3189src/renderer/generic.zig#L3325-L3330The glyph cache key includes the whole
RenderOptions(SharedGrid.renderGlyph:const key: GlyphKey = .{ .index = index, .glyph = glyph_index, .opts = opts };), so the unthickened preedit glyph is cached under its own key. The difference is therefore deterministic — not a first-frame or cache-warmup race.For what it's worth, the other
renderGlyphcall sites that omit.thickenare the sprite paths (underline / overline / strikethrough), where thickening does not apply.addPreeditCelllooks like the only text glyph path missing it.Suggested fix —
renderCodepointforwards itsRenderOptionsstraight through torenderGlyph, so passing the two options along should be all that is needed:Not a duplicate of #10424 / #10277 ("IME Preedit characters getting thicker when idle"): that one was identical preedit cells being layered on top of each other on a non-dirty row, fixed in #10772, which did not touch the thicken options. I searched open and closed issues and discussions and could not find an existing report about preedit ignoring
font-thicken.Expected Behavior
Preedit (composing) glyphs honour
font-thicken/font-thicken-strengthand render at the same weight as committed text.Actual Behavior
Preedit glyphs are always rendered unthickened, so composing text is visibly thinner and dimmer than the committed text surrounding it. In a capture of Korean text reading
예전처럼 보여서, the six committed syllables예전처럼 보여are thickened while the trailing underlined서, still in composition, is rendered with visibly thinner strokes; committing it makes it match the rest immediately.Reproduction Steps
font-thicken = true(config below).Ghostty Logs
No response
Ghostty Version
Full disclosure: this is libghostty embedded in a third-party application (cmux), which is why
app runtimeis.none, and I do not have an official Ghostty.app build on this machine to re-verify the pixels. Please weigh the screenshot accordingly. The affected code, though, is in the shared renderer and is apprt-independent, and it is unchanged onmainas of 9f9b8d1 — so it should reproduce on official builds as well.OS Version Information
macOS 26.5.2 (build 25F84), Apple silicon.
(Linux only) Display Server
No response
(Linux only) Desktop Environment/Window Manager
No response
Minimal Ghostty Configuration
Any monospace font reproduces it; D2Coding is just what is in use here.
Additional Relevant Configuration
No response
I acknowledge that:
All reactions