c8f5714b1e
- 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
55 lines
3.1 KiB
Markdown
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`.
|