projektordner
Projektordner wechseln in zid (File → Open Folder…, Ctrl+O): In-App-Ordner-Dialog, openProjectFolder, veraltete git-status-Ergebnisse, Ordner ohne Repo, File-Watcher-Thread, Aufwecken des Frame-Loops;
SKILL.md.claude/skills/projektordner/SKILL.md
GitHubProjektordner und Fenster-Backends
Projektordner wechseln („Open Folder…“)
- Header-Menü File → Open Folder… oder Ctrl+O öffnet einen modalen Dialog
(
src/ui/folder_picker.zig, Logik ohne Clay insrc/ui/folder_ops.zigmit Tests): editierbarer Pfad (~wird expandiert), Liste der sichtbaren Unterordner (Klick steigt ab), ↑ für den Elternordner, Enter/Open bestätigt, Escape/Cancel schließt. - Kein nativer Dialog (zenity/kdialog/Portal): der In-App-Dialog ist headless testbar und braucht keine Systemabhängigkeit.
- Bestätigt →
UI.pending_open_folder;main.zigholt es pertakePendingOpenFolderund ruftopenProjectFolder(auch beim Start): Explorer-Root,current_directory, Git-Branch/-Status und File-Watcher wechseln. Offene Tabs bleiben erhalten. - Veraltete git-status-Ergebnisse verwirft
UI.updateGitStatus: der Status trägtroot:<toplevel>und wird nur angenommen, wenn das zur Repo-Wurzel des aktuellen Projekts passt (git_worker.repoTopLevel,samePath). Sonst überschreibt ein spät eintreffender Status des Start-Projekts den des neuen. - Ordner ohne Repo bekommen keine git-Tasks.
git_worker.isInsideRepo(unit-getestet) sucht.gitaufwärts; schlägt das fehl, bleibtgit_repo_pathnull und weder Branch noch Status werden eingereiht.runGitCwdloggt bei Fehlern Befehl, Ordner und stderr. - Der File-Watcher registriert seinen Baum im eigenen Thread (
~/projectshat tausende Ordner, das darf den Frame-Loop nicht blockieren). - Jedes Async-Result weckt den Frame-Loop:
Scheduler.on_resultist im Fenster-Moduswio.cancelWait(Worker und Watcher rufen es nach jedempush). Ohne Hook schläft der Loop inwio.wait(.{}), die Result-Queue (256) läuft bei ruhigem Fenster voll und der Watcher loggt pro Ereignis „result queue full". Headless braucht keinen Hook (Polling). - E2E:
python3 scripts/e2e_open_folder.py [ordner]startet headless, fährt Menü → Dialog → Pfad tippen → Enter und prüft den neuen Root; Screenshots intmp/e2e_menu.ppmundtmp/e2e_dialog.ppm. RPCs dafür:element_bounds(id),element_bounds_i(id, index),folder_picker_state,get_state.root;key_presskennto,up,down. - Pfadfeld im Dialog (
line_edit, z-Index, waagrechtes Scrollen): Skilleditor.
Fenster-Backends: Wayland und X11
build.zigbaut wio mitunix_backends = "x11,wayland". wio wählt beim Start selbst:XDG_SESSION_TYPEentscheidet, sonst probiert es beide (libs/wio/src/unix.zig).- Die WGPU-Surface braucht je Backend andere Handles.
Platform.nativeWindowliefert sie alsNativeWindow(src/platform/native_window.zig),Renderer.setWindowbaut daraus den Deskriptor: Wayland-Surface, Xlib-Window oder HWND. - Linken der Backend-Bibliotheken und der wio-GLX-Patch: Skill
packaging. - X11 von einer Wayland-Sitzung aus prüfen:
env -u WAYLAND_DISPLAY XDG_SESSION_TYPE=x11 DISPLAY=:0 ./zig-out/bin/zid --e2e --ai=off <datei>, dann Screenshot per RPC. Xwayland reicht dafür. Headless berührt kein Backend, deckt das also nicht ab; ein Fenster nur nach Rückfrage beim User (Skillgrosse-dateien).