Unter WSLg trennt der Wayland-Compositor die Verbindung, kurz nachdem die App
ein Bild über Vulkan übergibt ("Connection reset by peer", ExitFailure). Über
X11 (Xwayland) läuft die App stabil – deshalb funktionierte sie als root, wo
der Wayland-Socket nicht gefunden wird und winit auf X11 ausweicht.
- WSL-Erkennung (WSL_DISTRO_NAME/WSL_INTEROP, /proc/sys/kernel/osrelease)
- Unter WSL mit gesetztem DISPLAY wird die Ereignisschleife mit X11 erzeugt
- INK_NOTES_DISPLAY=x11|wayland übersteuert die Wahl
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ohne Zugriff auf die Grafikkarte (z. B. Benutzer nicht in der Gruppe render)
lieferte EGL/Zink zunächst Darstellungsmodi, später eine leere Liste; die
nächste Neueinrichtung der Surface ließ wgpu abstürzen ("Requested present
mode Mailbox is not in the list of supported present modes: []").
- Adapter der Reihe nach prüfen (GPU, dann Software-Renderer); nur Adapter
mit Formaten und Darstellungsmodi für das Fenster werden genommen
- Darstellungsmodus: Mailbox, sonst Fifo, sonst der erste angebotene
- Bei Größenänderung/verlorener Surface Fähigkeiten neu abfragen statt blind
neu einzurichten; ohne Modi wird nicht eingerichtet (einmalige Meldung)
- Ohne nutzbaren Adapter verständliche Meldung (Gruppe render, /dev/dri,
Software-Renderer, WGPU_BACKEND) statt Panic; WGPU_BACKEND wird beachtet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Kacheln zeigen eine verkleinerte A4-Vorschau jeder Seite (Striche als
Linien, Textmarker halbtransparent, volle Seiten auf ~1500 Punkte
ausgedünnt), Seitenzahl darunter, aktuelle Seite blau umrandet
- Noch nicht geladene Seiten werden bei offener Seitenauswahl nachgeladen
(UiAction::LoadAllPages)
- Kachelgröße über PAGE_TILE (vorher feste Werte)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Dialoge (Notizbücher, Updates, Warnfenster) mit gemeinsamem deckendem
Rahmen, ohne doppelte Titelleiste, zentriert neben der Werkzeugleiste;
Schließen-Knopf 36 px, größere Knöpfe, Eingabefelder und Schieberegler
- Seitenauswahl als Popover neben dem Seitenknopf mit Kachelraster
(56 × 48 px) und „Neue Seite anhängen“
- Immer nur ein Dialog oder Popover gleichzeitig offen (close_overlays);
Seitenauswahl schließt bei Tippen daneben
- Stift-/Marker-Popover: Farbtupfer 30 px, Stärke-Vorschau 40 px hoch,
breiterer Schieberegler, deckender Rahmen
- Auswahl-Überlagerung und Griff-Trefferprüfung rechnen mit der
Display-Skalierung (lag bei Skalierung ≠ 1 neben den Strichen);
Trefferradius der Griffe 18 Punkte für Finger
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Regression aus v0.3.0: Die UI-Trefferprüfung (egui layer_id_at) wertete eine
bildschirmfüllende egui-Ebene der Ordnung Background als UI. Dadurch galt jeder
Punkt auf dem Blatt als Oberfläche, und Maus, Stift und Touch zeichneten nicht.
Background-Ebenen zählen jetzt nicht mehr als UI; die Prüfung liegt in ui.rs
und ist durch einen Test abgedeckt (Blattpunkte, Leiste, Skalierung 1 und 2).
Außerdem:
- 25 ungültige vormultiplizierte Farben (RGB > Alpha) auf unmultipliziert
umgestellt: Knöpfe in Dialogen waren weiße Kästen mit unlesbarer Schrift,
die Auswahlfüllung war deckend statt durchscheinend
- Zeichen ohne Glyphe in den egui-Schriften ersetzt (✓ ✕ ● ↑ ↓, Variantenzeichen
U+FE0F hinter ⚠)
- Tests finden künftig ungültige Farben und nicht darstellbare Zeichen in
ui.rs, selection.rs und main.rs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Werkzeugleiste
- Schmale senkrechte Leiste statt ~30 Elemente in einer Zeile; seitlich oben
angedockt (links, im ☰-Menü auf rechts umschaltbar, gespeichert in
~/.config/ink-notes/ui.json)
- Symbol-Knöpfe 40 px, auf niedrigen Fenstern schrittweise bis 28 px; Größe
richtet sich nach dem höchsten Fall, damit Knöpfe beim Werkzeugwechsel
nicht springen (fester Platz für die Farbpalette)
- Selten genutztes (PDF, Hintergrund, Zoom, Finger-Zeichnen, Leistenseite,
Updates, Speicherstatus) im ☰-Menü; Popover öffnen zur Blattseite hin
- Blatt wird im freien Bereich neben der Leiste zentriert
- Symbole ohne Glyphe in den egui-Schriften (🖍 ⌫ ⬚ ◄ ► ● ✕ ▾) ersetzt bzw.
selbst gezeichnet; Hover-Farbe korrigiert (falsch vormultipliziert)
Eingabe
- UI-Trefferprüfung in logischen Punkten (vorher physische Pixel gegen
egui-Koordinaten: bei Skalierung ≠ 1 trafen Stift und Touch die Leiste nicht)
und über egui::Context::layer_id_at für alle egui-Bereiche
- Stift-Ereignisse über egui_input_mut() statt ctx.input_mut() (wurden vom
nächsten Frame verworfen); Stiftbewegungen für Hover/Ziehen weitergereicht,
Stift bleibt vom Aufsetzen bis Abheben bei der UI
- Berührungen, die auf der UI beginnen, bleiben bis zum Abheben bei egui
- egui-Neuzeichenwünsche (repaint_delay) werden beachtet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Konfliktlösung: Speicher-Architektur des Branches (Formatversionierung,
Papierkorb, Backups, Instance-Lock, robuster Autosave) übernommen und die
dort fehlenden Korrekturen aus main darauf übertragen:
- Autosave gleicht das Manifest bei jeder Änderung mit dem Notizbuch ab
(mark_dirty); per Taste N/Bild-ab angelegte Seiten gingen sonst nach
einem Neustart verloren
- Start öffnet keine beschädigten Notizbücher automatisch und verwendet den
Ordner eines nicht ladbaren Notizbuchs nicht wieder
- PDF-Export lädt nicht geöffnete Seiten nach (load_all_pages), verweigert
unvollständige Exporte und meldet das echte Ergebnis an die UI
- Cargo.toml: minisign-verify und fs2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Beschädigte Seiten werden als page_<id>.json.corrupt-<zeit> gesichert statt
leer überschrieben; bei I/O-Fehlern wird die Ersatzseite als load_failed
markiert und nie gespeichert
- Autosave gleicht das Manifest (page_ids, Zähler) mit dem Notizbuch ab, damit
neu angelegte Seiten nach einem Neustart nicht verloren gehen
- Start: nicht ladbares Notizbuch bleibt unverändert, stattdessen wird ein
neues angelegt
- Aktuelles Notizbuch löschen: ausstehende Schreibvorgänge vorher abarbeiten,
damit der Ordner nicht wieder angelegt wird
- PDF-Export lädt nicht geöffnete Seiten nach und verweigert unvollständige
Exporte; Ergebnis wird per Kanal an die UI gemeldet
- Strg+S speichert alle geladenen Seiten und meldet Schreibfehler; flush()
liefert Fehler zurück statt immer "Gespeichert"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>