fix(ui): Emojis und Umlaute in Nachrichten (Issue #11) #12

Merged
ppfeiffer merged 3 commits from fix/issue-11-emoji-umlauts into main 2026-06-10 07:17:54 +02:00
Owner

Problem

In empfangenen Nachrichten werden zwei Kategorien von Zeichen nicht korrekt angezeigt:

1. Emojis → Platzhalterboxen

Die kOpsEmoji-Tabelle in emoji_data.h enthält nur 15 spezifische Codepoints. Alle anderen Emoji (z. B. 😀 😃 ) fallen auf LVGLs Montserrat-Fallback zurück, der keine Emoji-Glyphen kennt → LV_USE_FONT_PLACEHOLDER zeigt hässliche Rechteckkästen.

2. Umlaute → Platzhalterboxen

LVGLs eingebaute Montserrat-Fonts (lvgl@8.3.4) decken nur Basic Latin (U+0020–007E) ab. Die Behauptung in TextUtils.h, Montserrat würde U+00A0–00FF enthalten, war falsch. Umlaute (ä ö ü Ä Ö Ü ß) liegen in U+00C0–00FF und haben keine Glyphen.

Lösung

Emoji-Fix (sofort wirksam)

  • Emoji.cpp::_pathCb(): Für unbekannte Codepoints in den Emoji-Ranges (U+1F000–U+1FFFF, U+2600–U+27FF) wird ein transparentes 1×1-Pixel-Bild zurückgegeben statt false
  • LVGL rendert das Bild unsichtbar → keine Platzhalterbox
  • Die 15 unterstützten Emoji funktionieren weiterhin über imgfont

Umlaut-Fix (Custom Fonts über CI)

  • src/ui/OpsFont.h (neu): Makros OPS_FONT_12/14/16 — nutzen Custom-Fonts wenn OPS_CUSTOM_FONTS definiert, sonst Fallback auf eingebaute Fonts
  • pre_build.py: Prüft ob src/ui/fonts/ops_montserrat_14.c existiert → setzt -DOPS_CUSTOM_FONTS=1
  • scripts/gen_latin_fonts.sh: Erweitert um 12px-Größe und robustere Fehlerbehandlung
  • CI (release.yml, build-firmware.yml): Generiert die Font-Dateien automatisch via lv_font_conv bevor die Firmware gebaut wird; commitet sie beim ersten Lauf
  • ScreenHome.cpp, UIScreen.cpp: Nutzen jetzt OPS_FONT_14/OPS_FONT_16 für Nachrichten-Labels und Notification-Popup

Ablauf beim Merge

  1. PR wird in main gemergt
  2. CI läuft: Font-Dateien fehlen noch → gen_latin_fonts.sh generiert sie
  3. CI committet Fonts + Version-Bump ([skip ci])
  4. Ab dem nächsten Build sind Umlaute in allen Nachrichten korrekt dargestellt

Closes #11

## Problem In empfangenen Nachrichten werden zwei Kategorien von Zeichen nicht korrekt angezeigt: ### 1. Emojis → Platzhalterboxen Die `kOpsEmoji`-Tabelle in `emoji_data.h` enthält nur 15 spezifische Codepoints. Alle anderen Emoji (z. B. 😀 😃 ✨ ⭐) fallen auf LVGLs Montserrat-Fallback zurück, der keine Emoji-Glyphen kennt → `LV_USE_FONT_PLACEHOLDER` zeigt hässliche Rechteckkästen. ### 2. Umlaute → Platzhalterboxen LVGLs eingebaute Montserrat-Fonts (lvgl@8.3.4) decken **nur Basic Latin (U+0020–007E)** ab. Die Behauptung in `TextUtils.h`, Montserrat würde U+00A0–00FF enthalten, war falsch. Umlaute (ä ö ü Ä Ö Ü ß) liegen in U+00C0–00FF und haben keine Glyphen. ## Lösung ### Emoji-Fix (sofort wirksam) - `Emoji.cpp::_pathCb()`: Für unbekannte Codepoints in den Emoji-Ranges (U+1F000–U+1FFFF, U+2600–U+27FF) wird ein transparentes 1×1-Pixel-Bild zurückgegeben statt `false` - LVGL rendert das Bild unsichtbar → keine Platzhalterbox - Die 15 unterstützten Emoji funktionieren weiterhin über imgfont ### Umlaut-Fix (Custom Fonts über CI) - `src/ui/OpsFont.h` (neu): Makros `OPS_FONT_12/14/16` — nutzen Custom-Fonts wenn `OPS_CUSTOM_FONTS` definiert, sonst Fallback auf eingebaute Fonts - `pre_build.py`: Prüft ob `src/ui/fonts/ops_montserrat_14.c` existiert → setzt `-DOPS_CUSTOM_FONTS=1` - `scripts/gen_latin_fonts.sh`: Erweitert um 12px-Größe und robustere Fehlerbehandlung - CI (`release.yml`, `build-firmware.yml`): Generiert die Font-Dateien automatisch via `lv_font_conv` bevor die Firmware gebaut wird; commitet sie beim ersten Lauf - `ScreenHome.cpp`, `UIScreen.cpp`: Nutzen jetzt `OPS_FONT_14`/`OPS_FONT_16` für Nachrichten-Labels und Notification-Popup ## Ablauf beim Merge 1. PR wird in main gemergt 2. CI läuft: Font-Dateien fehlen noch → `gen_latin_fonts.sh` generiert sie 3. CI committet Fonts + Version-Bump (`[skip ci]`) 4. Ab dem nächsten Build sind Umlaute in allen Nachrichten korrekt dargestellt Closes #11
**Emojis (Platzhalterboxen):**
Unbekannte Emoji-Codepoints (U+1F000–U+1FFFF, U+2600–U+27FF) außerhalb
der 15-Einträge-imgfont-Tabelle fielen auf LVGL's Montserrat-Fallback
zurück, der diese Glyphen nicht kennt → LV_USE_FONT_PLACEHOLDER zeigte
Rechteckkästen. Behoben: _pathCb gibt für unbekannte Emoji ein
transparentes 1×1-Pixel zurück, das LVGL unsichtbar rendert.

**Umlaute (fehlende Glyphen):**
LVGLs eingebaute Montserrat-Fonts decken nur U+0020–007E (Basic Latin)
ab. Umlaute (ä ö ü Ä Ö Ü ß) liegen in U+00C0–00FF (Latin-1 Supplement)
und haben keine Glyphen → Platzhalterboxen.
Fix: Custom Montserrat-C-Dateien mit erweitertem Glyph-Range, generiert
von scripts/gen_latin_fonts.sh (lokal via lv_font_conv) oder automatisch
im CI vor dem Firmware-Build.

Closes #11

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- scripts/gen_emoji.py: lädt Twemoji-PNGs (72px → 16×16), konvertiert
  in LVGL TRUE_COLOR_ALPHA, generiert .c-Dateien + emoji_data.h.
  40 Emoji vordefiniert: positive/negative Gesichter, Gesten, Symbole.
- Emoji.cpp: Blank-Range erweitert auf U+2000-U+2FFF und U+2B00-U+2BFF
  zusätzlich zu U+1F000-U+1FFFF — verhindert Platzhalterboxen für alle
  Symbol-Ranges außerhalb der Montserrat-Abdeckung.
- CI (release.yml, build-firmware.yml): führt gen_emoji.py automatisch
  aus und committet neue Emoji-Dateien beim ersten Lauf.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hinzugefügt: ✌ (victory hand), ☀ (sun), 🌞 (sun face),  (coffee),
🙋 (raising hand). Skin-Tone-Modifier und ZWJ-Codepoints (✌🏻 🙋🏻‍♂️)
werden als Basisglyphe + unsichtbare Modifier dargestellt.

Fix: U+FE0F (Variation Selector) und U+200D (ZWJ) gaben bisher `false`
zurück → LVGL zeigte Platzhalterboxen. Jetzt korrekt: blank-Image,
keine sichtbaren Artefakte nach Emoji mit Variation Selector (☀️).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ppfeiffer deleted branch fix/issue-11-emoji-umlauts 2026-06-10 07:17:54 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ppfeiffer/OpenMeshOS!12
No description provided.