Skip to content

fix: keep emoji composed and preserve terminal cell layout - #101

Merged
simota merged 3 commits into
mainfrom
fix/emoji-presentation
Oct 16, 2026
Merged

simota merged 3 commits into
mainfrom
fix/emoji-presentation

Conversation

@simota

@simota simota commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Ordinary shell and agent output can split emoji sequences, select
monochrome fallback glyphs, or overlap following characters. Enable
grapheme clustering by default and keep Unicode emoji presentation,
stored cell spans, and shaped glyph advances consistent through the font
and render paths. Text-default wide symbols retain the configured font.
Applications can query or disable mode 2027 for scalar-width accounting.

Mixed color/outline faces are checked using the requested cluster's
shaped glyphs and actual raster formats. Presentation choices are cached
by full cluster, including modifiers and selectors, with a bounded cache.

Synthetic attachment seeds restore stored cell boundaries and widths,
including output created under different mode-2027 settings, wrap
latches, and hidden screen contents.

Compatibility:

  • Raw attach seeds now require protocol version 3. Update clients and
    servers together; older peers are rejected during noa.hello.
  • Rolling back requires matching client and server protocol versions.

Validation:

  • cargo fmt --all -- --check and
    cargo build --workspace --locked --offline passed.
  • Current head:
    cargo test --workspace --locked --offline --quiet --no-fail-fast
    passed: 2,762 passed, 0 failed, 15 existing ignored tests.
  • cargo clippy -p noa-font -p noa-render --all-targets --locked --offline -- -D warnings passed.
  • Both new mixed-face / cluster-cache regression tests failed before the
    glyph-presentation fix and pass with it applied. Fixtures are generated
    from the vendored font, without depending on installed system fonts.
  • Regression coverage includes PTY feed partitioning, Hangul and Thai
    clusters, configured text fonts, emoji presentation selectors, raster
    cache scaling, and mixed-mode seed replay with wrap and cursor state.
  • GPU output was checked at 16px and 28px for composed color emoji,
    following-text overlap, and Thai glyph placement.

Replaying cells through mode 2027 can join independently printed scalars
and infer different widths from cells created under mixed mode settings.
A remote attach can therefore lose characters or shift following text.

Restore stored widths and cluster contents explicitly, including wrap
latches and hidden screens, before expanding default cluster handling.

BREAKING CHANGE: raw attach seeds require protocol version 3. Update
clients and servers together; older peers are rejected during hello.
Ordinary shell and agent output does not negotiate grapheme mode, while
font fallback can trap emoji selectors in monochrome faces or let color
artwork overlap neighboring text.

Cluster boundaries, stored grid spans, and glyph pen advances must agree
across ingest, font selection, and rendering. Keep those changes together
so enabling clustering also preserves Thai and Hangul layout and makes
results independent of PTY read boundaries.

Prefer emoji faces by Unicode presentation and selectors, leaving
text-default wide symbols in the configured font. Applications can query
or disable mode 2027 when they require scalar-width accounting.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T02:06:50.495525Z d4d0ae3 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d4d0ae317d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/noa-font/src/grid.rs Outdated
Color tables can coexist with monochrome glyphs in the same face. Selecting by table presence alone leaves VS16 monochrome and skips valid VS15 text glyphs.

Check the requested cluster with the drawing pipeline and cache by full cluster, within a bounded budget, so modifiers cannot reuse a base-only choice. Cover mixed bitmap/outline faces and cluster cache separation with deterministic fixtures.
@simota
simota merged commit c0cbe96 into main Oct 16, 2026
1 check passed
@simota
simota deleted the fix/emoji-presentation branch October 16, 2026 13:30
@simota simota mentioned this pull request Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant