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>
- Eine erkannte Form ersetzt den Strich nur noch, wenn sie ihn gut beschreibt
(mittlere Abweichung ≤ 4 % der Strichdiagonale, gemessen gegen den
Linienzug der Form). Vorher wurde fast jeder geschlossene Strich umgewandelt
(Herz → Kreis, Stern/Spirale → Oktaeder, Wolke → Dreieck).
- Vielecke verlangen echte Ecken: Die Richtungsänderung muss sich an den Ecken
konzentrieren; glatte Ovale werden so nicht mehr zu Sechs-/Achtecken.
- Vielecke konkurrieren mit Kreis, Dreieck, Rechteck und Raute (gewichtet:
Rechteck vor Raute/Vieleck, Vieleck vor Kreis); überzählige Punkte der
Vereinfachung (Strichende vor dem Start, Punkte auf einer Geraden) entfallen.
- Tests: Freiformen bleiben unverändert, Fünf-/Sechs-/Achtecke, Ovale;
jeder Einzeldetektor-Test prüft zusätzlich die vollständige Erkennung.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Kreis, Dreieck, Rechteck und Raute konkurrieren; gewählt wird die Form,
deren Kontur am besten zu den Punkten passt (RMS-Abweichung). Vorher gewann
der Kreis immer, weil auch Quadrate nur ~10 % Radiusschwankung haben, und
die Dreieckserkennung griff gestreckte Rechtecke ab.
- Rechteckerkennung über das kleinste umschließende Rechteck (alle Drehwinkel,
Ausreißer-robust), Kanten auf den Median der Punkte; verlangt gezeichnete
Ecken und enge Passung, damit Ovale und Kritzeleien keine Rechtecke werden.
Die alte Variante schnitt bei kleinen/zittrigen Strichen die Ecken ab.
- extract_k_corners wählte die geradesten statt der markantesten Punkte
(Sortierung verkehrt herum); betrifft auch Dreieck und Raute.
- Rechteck wird der Raute vorgezogen, wenn es fast so gut passt.
- Oktaeder nur noch, wenn keine geschlossene Form gut passt.
- Tests mit nachgebildeten Freihandstrichen: Rechtecke in vielen Größen,
Seitenverhältnissen und Drehungen, mit runden Ecken, schiefen Kanten und
Überstrich; Kreise, Dreiecke; Ellipsen und Freiformen nie als Rechteck.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Behebt Datenverlust nach Neustart auf einer späteren Seite (v0.2.3 – v0.3.2); Seitenauswahl mit Vorschaubildern.
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>
Beim Start wurde nur die erste Seite geladen. War zuletzt eine spätere Seite
offen, war sie nach dem Neustart ein leerer, ungeladener Platzhalter: Das
Blatt erschien leer, und Zeichnen/Radieren/Hintergrund wechseln speicherte
den Platzhalter und überschrieb den bisherigen Inhalt der Seite.
- load_notebook lädt zusätzlich die aktuelle Seite
- Autosave schreibt nie ungeladene Platzhalter (Schutz ging beim Merge des
Storage-Branches verloren)
- Regressionstests für beide Fälle
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>
Der Signaturschlüssel wurde mit `rsign generate -W` erzeugt und ist mit
leerem Passwort verschlüsselt; das minisign-CLI aus Ubuntu (0.11) verlangt
dafür ein Terminal und brach in der CI mit "Error while loading the secret
key file" ab.
- Workflow installiert rsign2 0.6.7 (ohne -D warnings) statt minisign
- build-release.sh signiert und verifiziert mit rsign; da rsign bei falscher
Key-ID mit Exit-Code 0 endet, wird zusätzlich die Erfolgsmeldung geprüft
- README: Signierwerkzeug und Fallstrick dokumentiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
setup-rust-toolchain installiert mit --profile minimal; ohne explizite
components fehlen rustfmt und clippy, wodurch die Quality Gates bei jedem
Release-Lauf sofort abbrachen (cargo fmt --check nach 2 Sekunden).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- updater.rs: rustfmt-konforme Formatierung des öffentlichen Schlüssels
(cargo fmt --check ließ die Release-Pipeline scheitern)
- storage.rs: test_io_error_* simuliert den I/O-Fehler über ein Verzeichnis
statt chmod 000, damit er auch als root (CI-Runner) greift
- build-release.sh: findet den öffentlichen Schlüssel auch, wenn rustfmt ihn
in die Folgezeile umbricht
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Öffentlicher Schlüssel (Key-ID 3CFE290C190DA9D9). Der geheime Schlüssel wird
in der CI als Secret MINISIGN_SECRET_KEY erwartet.
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>
- SHA256SUMS.txt muss mit dem eingebauten Minisign-Schlüssel
(UPDATE_SIGNING_PUBLIC_KEY) signiert sein; fehlende oder ungültige
Signaturen und Versionen ohne Schlüssel lehnen Updates ab
- Prüfsummen und Signatur werden vor dem Paket geladen und geprüft
- build-release.sh signiert mit MINISIGN_SECRET_KEY und prüft, dass der
Schlüssel zum eingebauten öffentlichen Schlüssel passt; in der CI ist die
Signatur Pflicht
- publish-gitea-release.sh lädt SHA256SUMS.txt.minisig hoch
- README: Einrichtung des Schlüsselpaars dokumentiert
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bisher wurde nur die Server-URL geprüft. Download-Links aus der Release-API
und Weiterleitungsziele durften auch http:// sein, womit Paket und
SHA256SUMS.txt unverschlüsselt geladen werden konnten. Jetzt wird jede
Anfrage einzeln geprüft (allow_insecure_http bleibt als Ausnahme).
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>