Files
marcus.hinz c8f5714b1e libghostty als zweite Terminal-Engine integriert (Default ghostty, SwiftTerm Fallback)
- vendor/libghostty: vorgebaute macOS-libghostty.a (arm64) + Header + Build-Patches + README
- Sources/CGhostty: C-Modul der libghostty-C-API
- Sources/MiniTerm/Ghostty.swift: GhosttyApp + GhosttySurfaceView (Surface, Input, Größe, Fokus)
- main.swift: Engine-Wahl per Info.plist MTEngine
- Package.swift: CGhostty-Target + Link gegen libghostty + Frameworks
- STATUS.md: Stand, Build-Weg (macOS-15-VM), offene Punkte
2026-06-21 21:40:00 +02:00

55 lines
3.1 KiB
Markdown

# Stand: libghostty-Integration in MiniTerm
Stand 2026-06-21. MiniTerm baut pro Aufruf eigenständige macOS-`.app`s (eigene
Bundle-ID → eigenes Dock-Icon/⌘-Tab). Bisher SwiftTerm als Terminal. Ziel:
SwiftTerm durch **libghostty** (GPU/Metal-Renderer von Ghostty) ersetzen.
## Erreicht
- **libghostty gebaut** (volle macOS-Variante mit Metal-Renderer, Surface-/App-API),
liegt als `vendor/libghostty/` (lib/`libghostty.a` arm64 ~135 MB, `include/`,
`patches/`, `README.md`). Quelle Ghostty **v1.3.1** + Zig **0.15.2**.
- **In MiniTerm integriert, kompiliert, linkt, läuft** — Test-`.app` startet ohne
Crash mit GPU-gerenderter Login-Shell. Mausrad/Scrollback funktioniert.
## Warum der Build aufwändig war
- Zig 0.15.2 linkt auf dem **Host (macOS 26.5)** kein natives Binary (libSystem-
Inkompatibilität mit dem 26er-SDK; Auto-Erkennung von `26.x` scheitert).
Neuere Zig (0.16/0.17) linken, bauen aber Ghostty 1.3.1 nicht (API-Drift).
- Lösung: Build in **macOS-15-VM** (tart, cirruslabs-Image, Apple-Silicon-Host)
mit aktivem **CLT (15.5-SDK)** → Zig linkt. `metal`-Shader-Compiler nur per
`DEVELOPER_DIR` aus dem installierten Xcode geholt.
- 3 Build-Patches an Ghostty (in `vendor/libghostty/patches/…patch`):
build.zig (macOS-`libghostty.a`-Install frei, shared `.so` raus),
GhosttyXCFramework.zig (nur macOS-Slice, kein iOS), MetallibStep.zig
(metal via Xcode-`DEVELOPER_DIR`).
- libghostty.a aus VM herauskopiert; Host-Swift linkt sie problemlos (Cross-SDK
unkritisch). VM + Scratch danach abgeräumt.
## Neue/geänderte Dateien
- `Sources/CGhostty/` — C-Modul (`include/ghostty.h` + `module.modulemap`,
leeres `shim.c`) für die libghostty-C-API.
- `Sources/MiniTerm/Ghostty.swift``GhosttyApp` (einmalig `ghostty_init`,
Config laden/finalize, `ghostty_runtime_config_s`-Callbacks, `ghostty_app_tick`
via wakeup) + `GhosttySurfaceView` (NSView, `ghostty_surface_new` mit
nsview-Zeiger; Größe/Content-Scale/Fokus; Tastatur inkl. Shift+Enter→
`ghostty_surface_text`; Maus/Scroll).
- `Sources/MiniTerm/main.swift` — Engine-Wahl per Info.plist **`MTEngine`**
(Default `ghostty`, `swiftterm` = Fallback, auch wenn libghostty-Init scheitert).
- `Package.swift` — CGhostty-Target + linkerSettings:
`-L vendor/libghostty/lib -lghostty` + Frameworks AppKit/Metal/MetalKit/
QuartzCore/CoreText/CoreGraphics/CoreVideo/IOSurface/Carbon, `-lc++`.
## Offen / bewusst weggelassen
- **Kein Scrollbalken** — der ist in Ghostty.app host-seitig (`SurfaceScrollView`),
nicht in libghostty; unsere View bildet ihn nicht nach (Scrollback per Mausrad
geht). Nachrüstbar.
- **Clipboard-Callbacks no-op** — kein ⌘C/⌘V über libghostty.
- **Font-Family** wird nicht gesetzt (nur `font_size`; Family ginge nur über eine
Ghostty-Config-Datei via `ghostty_config_load_file`).
- **arm64-only** (kein x86_64-Slice).
- Visuelle Vollprüfung (Tippen/Resize/Reflow) durch Marcus noch offen.
## Reproduzieren ohne VM
`vendor/libghostty/lib/libghostty.a` + `include/` genügen zum Bauen. Neu bauen
nur nötig bei Ghostty-Update → Rezept in `vendor/libghostty/README.md`.