- Ein CLI-Programm für Linux, mit dem sich GUI-Anwendungen direkt im Terminal ausführen lassen
- Verwendet einen selbst entwickelten Wayland-Compositor, der die GUI-Ausgabe statt an einen Monitor an das Terminal weiterleitet
- Funktioniert auch in SSH-Umgebungen; Webbrowser, Dateimanager und sogar das Spiel Doom lassen sich im Terminal ausführen
- Die Ausgabequalität hängt von der Terminalauflösung (Anzahl der Zeilen und Spalten) ab; in bildunterstützenden Terminals wie iTerm2 und kitty wird auch Rendering in voller Auflösung unterstützt
- Entwickelt auf Basis von Typescript und bun, mit etwas C++-Code; derzeit werden nur einige Apps unterstützt, aber das Projekt wird mit dem Ziel „Term everything❗“ weiter ausgebaut
Bedeutung des Projekts und Vergleichsvorteile
- Im Unterschied zu bestehenden Terminal-Dateibetrachtern oder einfachen Bildausgabetools kann Term.everything „alle“ GUI-Anwendungen im Terminal ausführen
- Da sich die GUI auch in Netzwerkumgebungen einschließlich SSH nutzen lässt, ist es besonders stark bei Serververwaltung und Remote-Entwicklung
- Nutzt die Bildfunktionen moderner Terminals wie kitty und iTerm2 maximal aus und bietet Optionen zur Verbesserung von Auflösung und Framerate
Überblick
- Term.everything ist ein Linux-CLI-Programm, dessen Besonderheit darin besteht, GUI-Fenster direkt im Terminal auszuführen
- Das Herzstück ist ein selbst entwickelter Wayland-basierter Compositor, der die GUI nicht auf einem normalen Monitor, sondern im Terminal rendert
- Unterstützt sowohl x11- als auch Wayland-basierte Anwendungen und kann auch remote über SSH verwendet werden
- Die begrenzte Zahl an Terminalzeilen und -spalten beeinflusst die Fensterqualität; mit höherer Terminalauflösung lässt sich die Qualität verbessern, allerdings möglicherweise auf Kosten der Performance
Wichtige Einsatzbeispiele
- Spiele ausführen: Im Terminal lassen sich Spiele wie Fontemon oder Doom (Shareware-Episode) starten
- Video abspielen: Der Film Wing It! kann wiedergegeben werden; über die Auflösung lässt sich ein Gleichgewicht zwischen Framerate und Bildqualität einstellen
- Browser starten: In einer iTerm2- + SSH-Umgebung kann man sich mit Ubuntu verbinden und Firefox starten
- Alternative zu Dateibetrachtern: Statt eigens einen terminalspezifischen Dateibetrachter zu bauen, kann man bestehende GUI-Dateimanager direkt im Terminal verwenden
- Rekursive Ausführung: Ein weiteres Terminal innerhalb des Terminals ausführen, also ein "terminal in a terminal"
Funktionsweise und Entwicklungsinformationen
-
Grundkonzept
- Früher konnten Programme, wenn sie etwas auf dem Bildschirm darstellen wollten, direkt in einen bestimmten Bereich des RAM schreiben
- In modernen Systemen verwaltet ein Display Server die Ein- und Ausgabe und koordiniert Eingaben wie Maus und Tastatur sowie Grafik- und Bildausgabe
- Unter Linux werden hauptsächlich das Wayland-Protokoll oder X11 verwendet; Term.everything basiert auf Wayland
-
Das Wayland-Protokoll
- Wayland ist nicht der Display Server selbst, sondern ein Protokoll, das die Kommunikation zwischen Server und Programmen definiert
- Programme übergeben ihre selbst gerenderten Ergebnisse an den Display Server, der sie auf dem Bildschirm ausgibt
- Wichtig ist, dass kein bestimmtes Rendering-Modell erzwungen wird → Programme können auf die von ihnen gewünschte Weise zeichnen
- Dadurch kann das Ausgabeergebnis statt auf den Bildschirm auch an einen anderen Ort gesendet werden, z. B. an ein Terminal
-
Ausgabeverarbeitung in Term.everything
- Nimmt die von Wayland-Clients (den gestarteten GUI-Apps) gezeichneten Bilder entgegen und wandelt sie in Terminal-Zeichenausgabe um
- Umwandlungsprozess:
- 1. Empfang der vom Client übermittelten Bilddaten
- 2. Umwandlung in UTF-8-Zeichen + ANSI-Escape-Codes
- 3. Für die Umwandlung wird die chafa-Bibliothek verwendet, die Pixel auf Terminalzeichen abbildet
- Eingaben werden über stdin übergebene Tastatur- und Mausereignisse an die Wayland-Clients weitergereicht
-
Tatsächliche Implementierung
- Die Kernidee ist einfach, aber für die tatsächliche Implementierung sind etwa zehntausend Zeilen Code nötig
- Geschrieben in Typescript (auf bun-Basis) und teilweise in C++; es übernimmt die Rolle eines benutzerdefinierten Wayland-Display-Servers
- Der Quellcode ist im Verzeichnis src/ einsehbar
-
Erweiterbarkeit
- Term.everything will mehr sein, als nur GUI im Terminal auszuführen
- Mit einem benutzerdefinierten, Wayland-basierten Display Server lassen sich möglicherweise auch andere experimentelle Ideen umsetzen
- Zum Beispiel könnte das Ausgabegerät statt eines Terminals an ein völlig anderes Medium angebunden werden, etwa einen Drucker oder physische Kunstwerke
Noch keine Kommentare.