web-dev-qa-db-ja.com

urxvtにsixelをサポートさせる方法はありますか?

最近、 lsix と呼ばれる人気のあるgithubリポジトリがあり、端末内に画像を表示するために sixel グラフィックを使用しています。現在、ターミナルエミュレータとして rxvt-unicode を使用していますが、sixelではうまく機能しないようです。

誰かがそれをsixelをサポートさせる方法を知っていますか?

(私はUbuntu 18.04 LTS FYIを使用しています)

2
tjysdsg

rxvt-unicode-sixel フォークを使用する以外に、Perl拡張機能を記述してsixelを実装できる場合があります。そのためのドキュメントは rxvtperl(3) マンページにあります。私はsixelについてあまり知りませんが、それは次の問題だと思います。

  • 6つのエスケープシーケンスをインターセプトし、それらを解釈し、メインのエスケープシーケンスインタープリターに渡さないようにします。シーケンスを改行文字に置き換えて、画像の高さに合わせて正しい行数を置き換えたり、幅に合わせて拡大縮小したりできます。

  • 画像を描画します。 urxvtが拡張機能に提供するAPIを介して正しいウィンドウIDを取得し、必要に応じて通常のxlibまたはxcb関数を使用して画像を描画できます。

  • 必要に応じて画像を再描画するためのスクロールなどのイベントに注意してください。

ここでは、構成可能な可能性がたくさんありますが、sixelの実装に標準があるかどうかはわかりません。たとえば、端末のサイズを変更すると、画像はどうなりますか?クリップされていますか?スケーリングされていますか?作成時のみですか、それともすべてのサイズ変更時ですか?次にカーソルを画像上に移動し、テキストを折り返すのに十分な量を書き込むとどうなりますか?サイズを変更すると、画像と折り返されたテキストはどうなりますか?等.

最初は端子幅と画像サイズの小さい方の縮尺で描き、それを画像の最大サイズに設定するのが理想だと思います。設定された最大サイズを尊重しながら、端末のサイズ変更時に画像を再スケーリングします。その上に描かれたテキストに関しては、画像を再描画するときにそのテキストを画像の上に保持するのは少し複雑になるかもしれません...

申し訳ありませんが、私は少し興奮してあなたの答えの範囲から外れたようです。これに取り組む時間があったらいいのにと思います。

編集:urxvt Perl拡張からのピクセルを操作する機能に関するコメントの懐疑論に答えるために、ここに概念実証があります。左上から座標(10、10)に白色のピクセルを設定します。

use strict;
use warnings;
use X11::Protocol;

my $X = X11::Protocol->new;

sub on_refresh_end {
  my $term = shift(@_);
  my $gc = $X->new_rsrc;
  $X->CreateGC($gc, $term->vt,
    foreground => $X->white_pixel);
  $X->PolyPoint($term->vt, $gc, 0, (10,10));
  $X->flush;
}

この拡張機能をインストールするには、~/.urxvt/ext/sixel-proof-of-conceptに配置し、URxvt.Perl-ext-common: sixel-proof-of-concept行を追加して〜/ .Xresources(または使用する場合は〜/ .Xdefaults)に追加し、xrdb ~/.Xresourcesを実行してロードし、X11::ProtocolPerlモジュールがインストールされていることを確認します。

3
JoL