Keep a wide pair whole when one half is written or erased #21
No reviewers
Labels
No labels
Area/ci
Area/cli
Area/client
Area/client-core
Area/daemon
Area/deps
Area/docs
Area/grid
Area/manual
Area/nix
Area/protocol
Area/pty
Area/render
Area/shaping
Area/skills
Area/transport
Area/vt
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Performance
Kind/Security
Kind/Testing
perf-regression-accepted
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Blocked
Status
Need More Info
Status
Upstream
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
felis-terminal/felis!21
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/wide-cluster-overwrite"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #11.
The grid's write and erase paths recognized only a bare
Charas the owner of aSpacer, so a multi-codepoint wide grapheme (VS16 emoji, flag, keycap, ZWJ sequence) lost text when one half was overwritten or erased. The selective and rectangle erases and the DECFRA / OSC 66 overwrites had no edge repair at all, so they split a plain字too.Change
Spaceralone: whatever its left neighbor holds is its owner (evict_wide_partner_at, the ASCII bulk path).range_blank_inner, DECSEL, DECSED, DECERA, DECSERA) widen their span to the whole pair through one helper,pair_aligned_span. Both halves of a pair share one protection state, so a protected pair survives whole.Spacerwould pull in a live cell.❤, and🇯🇵turned into🇯🇯.Out of scope: the cell-moving editors (ICH, DCH, IRM, SL/SR, DECCRA, resize) belong to #12.
Verification
crates/felis-grid/tests/snapshot_wide_pairs.rs: 24 cases with a role-aware cell renderer. Each case's pre-fix output was recorded first, and all 24 reproduced the bug.every_spacer_sits_right_of_a_two_cell_glyphintests/proptest_grid.rs: fails on main, passes here.ascii_throughputandunicode_throughputshow no regression.字render correctly. The other cases looked the same before because an orphanSpacerdraws blank; their difference is in captured text.just checkgreen. Design reviewed by sol in two rounds, then luna; code reviewed by sol (PASS).