- Linux向けのCLIプログラムで、GUIアプリケーションをターミナルから直接実行できる
- 独自実装のWaylandコンポジタを使い、モニターの代わりにターミナルへGUI出力を送る仕組み
- ssh環境でも実行可能で、Webブラウザー、ファイルマネージャー、さらにはDoomまでターミナル内で実行できる
- ターミナルの解像度(行数・列数)によって出力品質が変わり、iTerm2やkittyのような画像対応ターミナルではフル解像度レンダリングもサポート
- Typescriptとbunを基盤に開発され、一部C++コードも含まれており、現時点では一部アプリのみ対応だが、「Term everything❗」 を目標に拡張中
プロジェクトの重要性と優位性
- Term.everythingは既存のターミナル向けファイルビューアや単純な画像出力ツールと異なり、「あらゆる」GUIアプリケーションをターミナル内で実行できる
- SSHを含むネットワーク環境でもGUIインターフェースを利用でき、サーバー管理、リモート開発に強みがある
- kitty、iTerm2など最新ターミナルの画像機能を最大限活用し、解像度・フレームレート向上オプションを提供
概要
- Term.everythingはLinux CLIプログラムで、ターミナルでGUIウィンドウを直接実行できるのが特徴
- 独自開発のWaylandベースのコンポジタが中核で、通常のモニターの代わりにターミナルへGUIをレンダリングする
- x11、Waylandの両方をサポートし、ssh経由でリモートからも利用可能
- 限られたターミナルの行数・列数がウィンドウ品質に影響し、ターミナル解像度を上げることで品質改善が可能(ただし性能低下の可能性あり)
主な利用例
- ゲーム実行: ターミナル内でFontemonのようなゲームやDoom(シェアウェア版エピソード)を実行可能
- 動画再生: Wing It! の映像再生が可能で、解像度調整によってフレームレートと画質のバランスを設定できる
- ブラウザー実行: iTerm2 + ssh環境でUbuntuに接続し、Firefoxを実行可能
- ファイルビューアの代替: わざわざターミナル専用ファイルビューアを作らずとも、既存のGUIファイルマネージャーをターミナルで直接使える
- 再帰実行: ターミナルの中でさらに別のターミナルを実行する "terminal in a terminal"
動作原理と開発情報
-
基本概念
- かつては、プログラムが画面に何かを描画するにはRAMの特定領域へ直接書き込むことができた
- 現代のシステムでは**ディスプレイサーバー(Display Server)**が入出力を管理し、マウスやキーボードのような入力とグラフィック/画像出力を調整する
- Linux環境では主にWaylandプロトコルまたはX11が使われ、Term.everythingはWaylandを基盤に動作する
-
Waylandプロトコル
- Waylandはディスプレイサーバーそのものではなく、サーバーとプログラム間の通信を定義するプロトコル
- プログラムは自前でレンダリングした結果をディスプレイサーバーに渡し、サーバーがそれを画面へ出力する
- 重要なのはレンダリングモデルが強制されないこと → プログラムは望む方法で描画できる
- そのため、出力結果を画面ではなく別の場所(例: ターミナル)へ送ることも可能
-
Term.everythingの出力処理
- Waylandクライアント(実行中のGUIアプリ)が描画した画像を受け取り、ターミナル文字出力へ変換する
- 変換プロセス:
- 1. クライアントから渡された画像データを受信
- 2. これをUTF-8文字 + ANSIエスケープコードへ変換
- 3. 変換にはchafaライブラリを活用し、ピクセルをターミナル文字へマッピング
- 入力はstdin経由で渡されたキーボード、マウスイベントをWaylandクライアントへ転送
-
実装の詳細
- 中核アイデアはシンプルだが、実際の実装には約1万行超のコードが必要
- Typescript(bunベース)と一部C++で書かれており、カスタムWaylandディスプレイサーバーとして機能する
- ソースコードは src/ ディレクトリ で確認可能
-
拡張可能性
- Term.everythingは単にターミナルでGUIを実行するだけにとどまらないことを目指している
- Waylandベースのカスタムディスプレイサーバーを使って、別の実験的なアイデアも実装できる可能性がある
- 例: 出力デバイスをターミナルではなく、まったく別の媒体(例: プリンター、物理アート作品など)へ接続する活用
まだコメントはありません。