2 Commits
Author SHA1 Message Date
Michael A. CojocariandClaude Opus 5.5 c7156b446e touch: chat icon initials are the first letters of the first and last word (#785)
The Initials look took the first two letters of the name, so "Eddie Smith"
showed ED. It now takes the first letter of the first word and of the last
word: ES, "john paul jones" JJ, "Eddie-Base" EB, "kd2abc_mobile" KM.

- Words break on whitespace and the separators node names use
  (- _ . / | , ; : + &); a combining accent is not a break.
- A word with no letter the font can draw (an emoji on its own) does not
  count. A name left with one word keeps the first two letters, which also
  covers scripts written without spaces.
- The #674 rules stay: undrawable accents fall back to the plain letter,
  "?" when there is nothing to draw.

test/test_avatar_text.cpp: the four expectations the rule changes, and the
#785 cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01He9DHDrX4s3uz37C3QzfdU
2026-11-01 19:59:34 -05:00
Kaj SchittecatandClaude Opus 5.5 993856dd5d touch: avatars never go blank for names with emoji or accents (#674)
A name that opens with emoji, such as a flag and an island, drew an empty
avatar. The chat icon taken from the first emoji in a name (#640) took the
first code point with ANY row in the emoji table, and the table maps the
invisible joiners (U+200D, the U+FE0E/FE0F variation selectors) to an empty
2 x 2 image so text never shows them. The island's U+FE0F won, and the icon
was that empty image. A ZWJ sequence such as man + laptop did the same
through its U+200D.

- The emoji pick skips the empty joiner rows; the real emoji after them
  still becomes the icon. A picked chat icon that is a joiner, or a text
  symbol the font cannot draw, keeps the plain avatar instead of a blank.
- Initials take whole code points and only letters or digits: emoji,
  flags, symbols and combining accents are skipped, so the flag name shows
  "TR" instead of two flag halves, "ana" with a tilde shows its capital. A
  letter the font only has as the '*' stand-in becomes its plain letter, or
  the next letter; "?" when the name has none, never blank.
- The logic lives in src/ui-touch/AvatarText.h (pure) with a host test
  (test/test_avatar_text.cpp) that first reproduces the blank pick with the
  old rule. The section-label uppercase table moved there unchanged.
- web demo backend: WADA_DEMO_CONTACTS="a|b|..." adds contacts for a
  scripted headless run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 13:32:33 +01:00