Shared groundwork:
- paths.rs: folders for data, settings and downloads per system (Linux XDG
unchanged, Windows %APPDATA%/%LOCALAPPDATA%, Android app folder)
- Linux-only parts behind cfg: Wayland on-screen keyboard (osk/wayland.rs),
display backend and app id, the vendored winit touch extensions
- run_with(event_loop) so that other entry points can start the app
Windows (#48):
- cross-compiled with MinGW into a portable ink-notes_<version>_x86_64.exe
(system DLLs only), no console window in release builds
- file picker: user folders and drives; held notebook locks are detected
(ERROR_LOCK_VIOLATION)
- updater: replaces the running .exe via rename, active at the next start
- octotablet panicking without the Tablet PC components no longer crashes
the app
- release: .exe built in CI and part of the signed checksums
- all library tests pass under wine
Android (#42):
- android_main entry point, winit with android-native-activity,
android_logger; octotablet and arboard left out there
- cargo check and the cdylib build for aarch64-linux-android pass; the window
surface does not follow the activity lifecycle yet
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Alle Oberflächentexte und Fehlermeldungen stehen in t!("…"); der deutsche
Text ist zugleich der Schlüssel für die englische Fassung in
src/i18n/en.rs (430 Einträge). Platzhalter heißen {name}. ink-notes folgt
der Systemsprache (Deutsch bei de…, sonst Englisch); im ☰-Menü lässt sie
sich unter „Sprache / Language“ auf System, Deutsch oder English
festlegen, gespeichert in ui.json.
Ein Test prüft, dass jeder markierte Text übersetzt ist, keine
Übersetzung verwaist und die Platzhalter übereinstimmen.
Konsolenausgaben bleiben deutsch.
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>
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>