Document today's config-path, window-chrome and tooling gotchas
AGENTS.md gains the rules the day's debugging produced: never put the config in the install dir (the build script wipes it, silently costing all local-only fields), never branch app_dir() on sys.frozen (two diverging configs), the consequences that come with a frameless window, and why the resize grip must be placed rather than packed. Also records that Claude's Bash and PowerShell tools can see different files under AppData, which made "the notes are in the file" and "the app shows no notes" both true at once -- with the diagnostic-module approach that finally settled it. README: config now lives in %APPDATA%\VersaPadViewer, plus the frameless window and notes in the feature list.
This commit is contained in:
parent
91bac353b4
commit
9464cafaab
2 changed files with 85 additions and 9 deletions
67
AGENTS.md
67
AGENTS.md
|
|
@ -117,6 +117,28 @@ Dokumentation und Verifikation unten für die Größeneinschätzung).
|
||||||
vorhanden, und fällt sonst auf die klassischen `versapad_config{1,2,3}.json`
|
vorhanden, und fällt sonst auf die klassischen `versapad_config{1,2,3}.json`
|
||||||
zurück — beide Ansichten müssen dieselbe Quelle zeigen, sonst wirkt eine
|
zurück — beide Ansichten müssen dieselbe Quelle zeigen, sonst wirkt eine
|
||||||
Bearbeitung "verschwunden".
|
Bearbeitung "verschwunden".
|
||||||
|
- **Config-Pfad darf NIE im Installationsverzeichnis liegen (2026-08-15,
|
||||||
|
Datenverlust-Bug):** `build_and_deploy.ps1` räumt sein Zielverzeichnis vor
|
||||||
|
jedem Deploy komplett ab (`Remove-Item $localDir -Recurse -Force`). Nachdem
|
||||||
|
`app_dir()` am selben Tag auf genau dieses Verzeichnis gezeigt hatte, hat
|
||||||
|
**jeder Rebuild die Nutzer-Config mitgelöscht**; die App hat sie danach
|
||||||
|
kommentarlos leer vom Board neu aufgebaut (`load_or_fetch()` →
|
||||||
|
`fetch_from_board()`), wodurch alle Notizen weg waren. Besonders tückisch:
|
||||||
|
Board-Bindings und LEDs sahen danach völlig normal aus, nur die rein
|
||||||
|
lokalen Felder (Notizen, Profilnamen) fehlten -- der Schaden ist also
|
||||||
|
unsichtbar, wenn man nur aufs Grid schaut. Fix: `app_dir()` liefert jetzt
|
||||||
|
`%APPDATA%\VersaPadViewer` (Roaming), getrennt vom Installationsordner in
|
||||||
|
`%LOCALAPPDATA%`; zusätzlich rettet `build_and_deploy.ps1` vorgefundene
|
||||||
|
`versapad_config*.json` aus dem Zielverzeichnis über den Deploy hinweg
|
||||||
|
(für Altinstallationen). **Regel für künftige Änderungen: Programm- und
|
||||||
|
Datenverzeichnis nie zusammenlegen, egal wie praktisch "alles an einem
|
||||||
|
Ort" klingt.**
|
||||||
|
- **Nur EIN Config-Pfad, unabhängig vom Startweg (2026-08-15):** `app_dir()`
|
||||||
|
hat bewusst KEINEN `sys.frozen`-Zweig mehr. Vorher sah die gebaute `.exe`
|
||||||
|
eine andere Datei als der aus dem Quellcode gestartete MCP-Server, was zu
|
||||||
|
zwei auseinanderlaufenden Configs führte (die `.exe` zeigte ein anderes
|
||||||
|
Profil 0 als der MCP-Server meldete). Wer hier wieder nach Startweg
|
||||||
|
unterscheidet, baut denselben Bug erneut ein.
|
||||||
- **Installierbarkeit verbessert 2026-08-14:** Drei Probleme beim
|
- **Installierbarkeit verbessert 2026-08-14:** Drei Probleme beim
|
||||||
Weitergeben an andere Leute behoben. (1) `build_and_deploy.ps1` starb bei
|
Weitergeben an andere Leute behoben. (1) `build_and_deploy.ps1` starb bei
|
||||||
fehlenden Paketen (pyinstaller/pystray/pillow) kommentarlos, v.a. bei
|
fehlenden Paketen (pyinstaller/pystray/pillow) kommentarlos, v.a. bei
|
||||||
|
|
@ -131,7 +153,10 @@ Dokumentation und Verifikation unten für die Größeneinschätzung).
|
||||||
Funktion) liefert bei der gebauten `.exe` deren Installationsordner
|
Funktion) liefert bei der gebauten `.exe` deren Installationsordner
|
||||||
(`sys.executable`-Verzeichnis), sonst den Projektordner (`__file__`-
|
(`sys.executable`-Verzeichnis), sonst den Projektordner (`__file__`-
|
||||||
Verzeichnis) -- `DEFAULT_PATH` hängt jetzt daran, landet also immer neben
|
Verzeichnis) -- `DEFAULT_PATH` hängt jetzt daran, landet also immer neben
|
||||||
der laufenden Installation. `versapad_data.CONFIG_PATHS` (Lese-Interop
|
der laufenden Installation. **Diese app_dir()-Variante ist seit
|
||||||
|
2026-08-15 überholt und war aktiv schädlich, siehe unten "Config-Pfad
|
||||||
|
darf nie im Installationsverzeichnis liegen".**
|
||||||
|
`versapad_data.CONFIG_PATHS` (Lese-Interop
|
||||||
mit der C#-VersaGUI) bleibt bewusst auf dem Desktop, siehe oben. (3) Fehlte
|
mit der C#-VersaGUI) bleibt bewusst auf dem Desktop, siehe oben. (3) Fehlte
|
||||||
die Config UND war kein Board erreichbar, blockierte das Tool mit einer
|
die Config UND war kein Board erreichbar, blockierte das Tool mit einer
|
||||||
Fehlermeldung statt zu starten. Fix: `load_or_fetch()` legt jetzt bei
|
Fehlermeldung statt zu starten. Fix: `load_or_fetch()` legt jetzt bei
|
||||||
|
|
@ -189,6 +214,24 @@ Dokumentation und Verifikation unten für die Größeneinschätzung).
|
||||||
`vcomb.DEFAULT_PATH`, fällt nur bei fehlender/kaputter Datei auf
|
`vcomb.DEFAULT_PATH`, fällt nur bei fehlender/kaputter Datei auf
|
||||||
`default_combined()` zurück. Bei jedem "komisches Layout"-Report hier immer
|
`default_combined()` zurück. Bei jedem "komisches Layout"-Report hier immer
|
||||||
ALLE 3 Profile prüfen, nicht nur das gemeldete.
|
ALLE 3 Profile prüfen, nicht nur das gemeldete.
|
||||||
|
- **Randloses Fenster (seit 2026-08-15):** Die Titelleiste ist per reinem Tk
|
||||||
|
`overrideredirect(True)` ausgeblendet -- **niemals** per ctypes/WinAPI
|
||||||
|
nachhelfen (kein `SetWindowLongW`/`ShowWindow` auf das eigene Fenster),
|
||||||
|
siehe Speicher-Notiz "keine Selbstversteck-Fenstertricks": genau diese
|
||||||
|
Kombination hat in einem anderen Projekt Bitdefender-Fehlalarme
|
||||||
|
ausgelöst. Konsequenzen, die mitgebaut werden müssen: kein
|
||||||
|
Taskleisten-Eintrag (Rückweg nur über das Tray-Icon), kein Ziehen am
|
||||||
|
Rahmen (Kopfzeile ist deshalb per `<B1-Motion>` verschiebbar), keine
|
||||||
|
System-Buttons (eigene `✕`/`—` in der Kopfzeile, beide legen ins Tray)
|
||||||
|
und **keine Resize-Ränder**.
|
||||||
|
- **Der Größen-Anfasser hängt per `place()` an der Fensterecke, nicht
|
||||||
|
gepackt am Ende des Inhalts.** Gepackt verschwindet er, sobald das Fenster
|
||||||
|
kleiner als der Inhalt ist -- also exakt dann, wenn man ihn zum
|
||||||
|
Vergrößern bräuchte. `MIN_W/MIN_H` begrenzen das Verkleinern.
|
||||||
|
- Fensterhöhe muss zum Karteninhalt passen: seit die Karten eine Notizzeile
|
||||||
|
haben (`CARD_H` 84 → 114) braucht das Fenster ~960px, sonst liegen
|
||||||
|
Encoder-Bereich und Fußzeile unterhalb des Rands. Wer `CARD_H` ändert,
|
||||||
|
muss `geometry()` mit anpassen.
|
||||||
- HID-Tasten-Auswahl im Programmiermodus ist ein Dropdown, kein
|
- HID-Tasten-Auswahl im Programmiermodus ist ein Dropdown, kein
|
||||||
Tastendruck-Capture (bewusst — kein WinAPI-Hook, um keinen AV-Fehlalarm
|
Tastendruck-Capture (bewusst — kein WinAPI-Hook, um keinen AV-Fehlalarm
|
||||||
wie bei den Fensterverstecktricks in anderen Projekten zu riskieren).
|
wie bei den Fensterverstecktricks in anderen Projekten zu riskieren).
|
||||||
|
|
@ -239,6 +282,28 @@ Byte-Identität), nicht nur gegen Beispieldaten. Vor jedem Schreibvorgang
|
||||||
aufs Board: erst mit unveränderten Daten testen (Identity-Write), bevor
|
aufs Board: erst mit unveränderten Daten testen (Identity-Write), bevor
|
||||||
echte Änderungen geschrieben werden.
|
echte Änderungen geschrieben werden.
|
||||||
|
|
||||||
|
**Änderungen an der Config immer aus der Sicht prüfen, die die laufende App
|
||||||
|
hat (2026-08-15 gelernt):** Claudes Bash- und PowerShell-Werkzeuge sehen
|
||||||
|
unter `C:\Users\chris\AppData\...` teilweise *unterschiedliche* Dateien —
|
||||||
|
derselbe Pfad lieferte gleichzeitig 29826 Bytes (Bash/MCP-Server) und
|
||||||
|
28455 Bytes (PowerShell/`.exe`). Konkret heißt das: **Config-Schreibvorgänge
|
||||||
|
über den versapad-MCP-Server (`save_local()`) erreichen die installierte
|
||||||
|
`.exe` nicht zuverlässig.** Das hat eine Fehlersuche über viele Runden
|
||||||
|
verschleppt, weil "Notizen sind in der Datei" (Bash) und "App zeigt keine
|
||||||
|
Notizen" gleichzeitig stimmten. Vorgehen:
|
||||||
|
- Config-Dateien, die die installierte App lesen soll, über **PowerShell**
|
||||||
|
schreiben/prüfen (`Get-Item`, dort ausgeführtes `python`), nicht über Bash.
|
||||||
|
- Bei "Änderung wirkt nicht"-Symptomen als Erstes Dateigröße/mtime aus
|
||||||
|
*beiden* Sichten vergleichen, bevor Code-Ursachen gesucht werden.
|
||||||
|
- `Z:\Git\...` (SMB-Share) ist von diesem Effekt nicht betroffen — Quellcode
|
||||||
|
und Build verhalten sich normal.
|
||||||
|
|
||||||
|
Verlässlich zum Ziel führt bei solchen Widersprüchen ein temporäres
|
||||||
|
Diagnose-Modul, das im gebauten Bundle mitläuft und `app_dir()`,
|
||||||
|
`DEFAULT_PATH`, `os.stat()` und den tatsächlich geladenen JSON-Inhalt in eine
|
||||||
|
Datei schreibt — damit war die Ursache in einem Durchlauf sichtbar, nachdem
|
||||||
|
Vermutungen mehrfach danebenlagen.
|
||||||
|
|
||||||
## Naming
|
## Naming
|
||||||
|
|
||||||
Code-Identifier englisch (Python-Konvention: `pack_config`, `read_macros`,
|
Code-Identifier englisch (Python-Konvention: `pack_config`, `read_macros`,
|
||||||
|
|
|
||||||
27
README.md
27
README.md
|
|
@ -12,9 +12,9 @@ echtes Board getestet (Read-Modify-Write ist byte-identisch zum Original,
|
||||||
inklusive CRC). Nicht vorhanden: automatisierte Tests (Verifikation läuft
|
inklusive CRC). Nicht vorhanden: automatisierte Tests (Verifikation läuft
|
||||||
manuell gegen ein angeschlossenes Board), eine vorgefertigte `.exe` zum
|
manuell gegen ein angeschlossenes Board), eine vorgefertigte `.exe` zum
|
||||||
Download (siehe unten, warum), und Mehrbenutzer-/Netzwerkbetrieb. Die eigene
|
Download (siehe unten, warum), und Mehrbenutzer-/Netzwerkbetrieb. Die eigene
|
||||||
Config-Datei (`versapad_config_all.json`) liegt automatisch neben der
|
Config-Datei (`versapad_config_all.json`) liegt automatisch unter
|
||||||
Installation (siehe „Aufbau" unten) und wird bei Bedarf automatisch neu
|
`%APPDATA%\VersaPadViewer\` (siehe „Aufbau" unten) und wird bei Bedarf
|
||||||
angelegt — kein manuelles Pfad-Anpassen mehr nötig. Nur die *optionale*
|
automatisch neu angelegt — kein manuelles Pfad-Anpassen mehr nötig. Nur die *optionale*
|
||||||
Lese-Interop mit den JSON-Exports der offiziellen VersaGUI
|
Lese-Interop mit den JSON-Exports der offiziellen VersaGUI
|
||||||
(`versapad_data.CONFIG_PATHS`) ist noch für eine bestimmte Windows-Maschine
|
(`versapad_data.CONFIG_PATHS`) ist noch für eine bestimmte Windows-Maschine
|
||||||
hartkodiert (OneDrive-Desktop) — für einen anderen Rechner dort anpassen,
|
hartkodiert (OneDrive-Desktop) — für einen anderen Rechner dort anpassen,
|
||||||
|
|
@ -41,6 +41,11 @@ falls gewünscht.
|
||||||
Tool-Aufruf ändern, ohne Klicks in der GUI (siehe unten)
|
Tool-Aufruf ändern, ohne Klicks in der GUI (siehe unten)
|
||||||
- **Tray-Icon** — minimiert/schließt ins Tray statt in die Taskleiste, wie
|
- **Tray-Icon** — minimiert/schließt ins Tray statt in die Taskleiste, wie
|
||||||
die offizielle VersaGUI
|
die offizielle VersaGUI
|
||||||
|
- **Randloses Fenster** — ohne Windows-Titelleiste, dafür kompakter Kopf
|
||||||
|
(Modus-Checkboxen direkt neben dem Titel). Verschieben durch Ziehen an
|
||||||
|
der Kopfzeile, Größe ändern am Anfasser unten rechts, `✕`/`—` legen ins
|
||||||
|
Tray. Einen Taskleisten-Eintrag gibt es dadurch nicht — das Fenster kommt
|
||||||
|
über das Tray-Icon zurück.
|
||||||
|
|
||||||
## Voraussetzungen
|
## Voraussetzungen
|
||||||
|
|
||||||
|
|
@ -111,14 +116,20 @@ VersaMCU-Firmware-Quellen übernommen und gegen ein echtes Board validiert
|
||||||
(Read → unpack → pack ist bytegenau identisch zum Original, inklusive CRC).
|
(Read → unpack → pack ist bytegenau identisch zum Original, inklusive CRC).
|
||||||
|
|
||||||
Die eigene Config-Datei (`versapad_config_all.json` — alle 3 Profile +
|
Die eigene Config-Datei (`versapad_config_all.json` — alle 3 Profile +
|
||||||
Makros + lokale Profilnamen, siehe `versapad_combined.py`) liegt neben der
|
Makros + lokale Profilnamen + Notizen, siehe `versapad_combined.py`) liegt
|
||||||
Installation: bei der gebauten `.exe` im selben Ordner, beim Start aus dem
|
unter `%APPDATA%\VersaPadViewer\` (`versapad_data.app_dir()`), also
|
||||||
Quellcode im Projektordner (`versapad_data.app_dir()`). Fehlt sie (z.B.
|
**getrennt vom Installationsordner** und unabhängig davon, ob die `.exe`
|
||||||
frische Installation), wird sie automatisch angelegt — per Serial vom
|
oder der Quellcode gestartet wurde. Beides ist Absicht: das Build-Skript
|
||||||
|
räumt sein Zielverzeichnis vor jedem Deploy komplett ab (läge die Config
|
||||||
|
dort, würde jeder Rebuild sie löschen), und ein vom Startweg abhängiger
|
||||||
|
Pfad hatte zu zwei auseinanderlaufenden Configs geführt. Fehlt die Datei
|
||||||
|
(z.B. frische Installation), wird sie automatisch angelegt — per Serial vom
|
||||||
Board, falls eins angeschlossen ist, sonst als leere Default-Config.
|
Board, falls eins angeschlossen ist, sonst als leere Default-Config.
|
||||||
Profilnamen (`profile_names`) stehen direkt in dieser Datei und lassen sich
|
Profilnamen (`profile_names`) stehen direkt in dieser Datei und lassen sich
|
||||||
per Doppelklick auf einen Tab (in jedem Modus — Nur-Lesen, Live-Sync oder
|
per Doppelklick auf einen Tab (in jedem Modus — Nur-Lesen, Live-Sync oder
|
||||||
Programmiermodus) oder `rename_profile()` (MCP) ändern.
|
Programmiermodus) oder `rename_profile()` (MCP) ändern. Notizen ebenso —
|
||||||
|
im Bearbeiten-Dialog des Programmiermodus oder per
|
||||||
|
`set_button_note()`/`set_encoder_note()` (MCP).
|
||||||
|
|
||||||
Die klassischen `versapad_config1/2/3.json` sind kein von diesem Tool
|
Die klassischen `versapad_config1/2/3.json` sind kein von diesem Tool
|
||||||
geschriebenes Format, sondern optionale Lese-Interop mit einem JSON-Export
|
geschriebenes Format, sondern optionale Lese-Interop mit einem JSON-Export
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue