comment -*- mode: text -*-
comment $Id$

リモートホスト上の w3m での画像表示 (Experimental)

* 必要なもの
  (Win32 以外)
  gdk-pixbuf >= 2.14
  gvfs 又は curl

  (Win32)
  GDI+
  URL Monikers

* 準備
  o mlterm >= 3.1.7
    ./configure ... (3.1.8 以前は --enable-sixel オプションが必要です。)
    make
    make install

  o w3m 0.5.3 with remote image patch
    https://bitbucket.org/arakiken/w3m/downloads から remoteimg ブランチ
    のアーカイブをダウンロード
    ./configure --enable-image ...
    make
    make install

* 使い方
  w3m -ri http://...
  なお、-ri オプションを使用しなくても、環境変数 MLTERM が 3.1.7 以上に set され
  ている場合は、自動的に本機能が有効となります(ssh でリモートホストにログインし
  ている場合、通常は MLTERM 環境変数はセットされないので、注意してください。)。

* 実装方法
  OSC 5379;show_picture file WxH+X+Y により、表示する画像ファイルの URL 及び当該
  画像のどの範囲を表示するかを w3m から mlterm に通知し、mlterm がその URLから
  (gvfs、curl 又は URL Monikers を使って)直接画像ファイルを取得して、表示してい
  ます。
  (mlterm を動かしているホストから画像ファイルの URL に直接アクセスできる必要が
  あるため、例えば、リモートホスト上のローカルディスク内のファイルを w3m で開い
  た場合には、画像を表示することはできません。)

  w3m 側で画像ファイルを sixel などのテキストデータに変換して、端末エミュレータに
  送信する方法も考えられますが、次のデメリットがあり、画像を多用するサイトの閲覧
  で(特にスクロール時に)実用的なパフォーマンスを得るのが困難と判断し、採用しませ
  んでした。
  o 同じ画像ファイルであっても、毎回、画像データを送信する必要があること。
    (URLを通知する方法であれば、端末エミュレータ側で画像をキャッシュしておけば、
    URL が同じ場合は、キャッシュされた画像を再利用することが可能。)。
  o 特に Sixel の場合は、変換後のテキストデータがかなり大きくなり、送信コストが
    かかること。

  なお、w3m は、表示する画像のサイズが分からないとレイアウトができないため、従前
  どおり画像ファイルを取得して、~/.w3m に一時保存します。このため、w3m をローカ
  ルホスト上で動かす場合には、mlterm も、w3m が一時保存した画像ファイルを利用す
  るようにしています(w3m がローカルホスト上で動いているかどうかは、WINDOWID 環境
  変数が定義されているかで判断しています。)。

* 今後の対応
  今のところは、mlterm が従前から使用している OSC 5379 を拡張して実装しましたが、
  端末エミュレータにおける画像表示手法の一つとして、URL を通知する方法が受け入れ
  られるようであれば、専用のシーケンスを提案していくことも考えています。

  また、w3m の patch については、修正個所が最小限に留まるように作成しており、効
  率的な実装にはなっていません。表示画像が一部欠けることがあるなどの問題もあり、
  改善する必要があります。

  なお、今回の実装方法は、w3m 側をあまり修正せずに、一定のパフォーマンスが得られ
  るメリットがありますが、端末エミュレータ側でうまく画像がキャッシュされず、ヒッ
  ト率が下がると、パフォーマンスが著しく低下するという問題があります。
  端末エミュレータが DRCS カラー拡張(RLogin) への対応やこれをベースとした新たな
  シーケンスの定義などした上で、w3m 側で、端末エミュレータに表示する画像の生成・
  破棄のタイミングを細かく制御する方が筋はよいと思われます。
