55 ポイント 投稿者 GN⁺ 2025-09-11 | まだコメントはありません。 | WhatsAppで共有
  • 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ベースのカスタムディスプレイサーバーを使って、別の実験的なアイデアも実装できる可能性がある
    • 例: 出力デバイスをターミナルではなく、まったく別の媒体(例: プリンター、物理アート作品など)へ接続する活用

まだコメントはありません。

まだコメントはありません。