2004/09/28
スクリーンやウインドウの画像を撮りたいのだけどどうしたらよいの?
との質問を受けました。
Plan 9 はこのような問題をとても面白い方法で、そう、Plan 9 らしい方法で処理しています。それを紹介しましょう。
page から紹介します。page は実際には PS ファイルや PDF なども読み取りかなり守備範囲が広い。マニュアルには general purpose document viewer と書かれている。(詳しくはマニュアルを参照してください。)
page には多くのオプションがあるが、普通はオプションなしの
page ファイル ...の形で使用する。ファイルは複数指定できる。
/dev/screenに置かれています。
page /dev/screenを実行しているとその事が確認できます。
/dev/windowであるが
page /dev/windowを実行しても何も見えないはずです。(なぜでしょう?)
cp /dev/window /tmp/a page /tmp/aを実行してみれば、ヒントがつかめます。(今度は
/tmp/a に page を実行する直前のウインドウの様子が画像ファイルとして記録されているのが確認されます。)
我々がウインドウの内容を画像ファイルとして記録したい場合には、たいていの場合、そのウインドウの中でコマンドを投入するわけには行きません。従って他のウインドウから目的のウインドウの内容をコピーすることになります。
/dev/wsysの下にはスクリーン上の全てのウインドウ情報が置かれています。
cat /dev/winidで確認できます。数字が表示されますが、ウインドウごとに異なる数字を表示するのが確認されるでしょう。
ls /dev/wsysを実行すると全てのウインドウの ID が表示されます。
N を ID とします。ls /dev/wsys/Nを実行すると ID が
N のウインドウに関する情報を収めたいろいろなファイルがあることが分かります。これらはもちろん仮想ファイルです。term% ls /dev/wsys/1 --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cons ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/consctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cursor ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/kbdin --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/label --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/mouse --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/screen --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/snarf --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/text --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wdir --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/window --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winid --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winname d-r-x------ M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wsys/dev/wsys/1/windowが ID が 1 のウインドウの画像です。実際他のウインドウから
page /dev/wsys/1/windowを実行してみるとそのことが確認されます。
/tmp/1.png とすれば)topng /dev/wsys/1/window > /tmp/1.pngを実行します。
topng で生成した PNG ファイルを page が読み取れない事があります。page は内部で png を使用しており、png に問題があると思えます。その場合でも topng によって生成されたファイルは Mac OSX では正しく読み取れています。
PNG ファイルへの変換の他に GIF ファイルへ変換する事もできます。マニュアル jpg(1) を参照してください。残念ながら JPEG ファイルへの変換ツールは無いようです。
rio はどういうわけか、その情報をユーザに提供しません。(もちろん rio の内部ではその情報を持っているはずです。) その事が例えば acme を複数個開いたときに plumping が全ての acme で発生するなどの問題の原因になっています。rio の現在の仕様ではウインドウを特定するのに/dev/wsys/*/labelが役に立つでしょう。この内容を読めば、そこで実行中のプログラムの名前が分かります。例えば
acme のウインドウはgrep acme /dev/wsys/*/labelで分かります。
grep page /dev/wsys/*/labelでウインドウ ID を調べ (例えば 3 とします)
sleep 10; topng /dev/wsys/3/window >/tmp/a.pngで得られたものです。