dodaの日記: 端末がびよんびよんしたりぴょんぴょんしたり 4
元ネタはこの辺
EmacsやVimがびよんびよんしたり、ぴょんぴょんしたりしているのを見て、
「これ、ターミナルエミュレータ一般で出来るんじゃね」と思ったので作ってみた。
どちらも dtterm のウィンドウ操作/情報取得シーケンスを利用している。
以下、簡単な解説。
・端末のウィンドウが勝手にびよんびよんなってたのしいやつ
dtterm の端末サイズ変更シーケンスを利用している。
xterm, urxvt, mlterm, Tera Term, PuTTY, RLogin で動作するのを確認。
iTerm2 は動くけれど Ctrl-C で止まらないという話を聞いているけれど、
試せる環境が無いので詳細は不明。
# 9/13追記: mintty+cygwin, AbsoluteTelnet, ZOC でも動きました
元の端末サイズの取得には stty -a の出力を利用しているが、OS によって微妙に
フォーマットが違ったので動かないのもあるかも。
端末サイズの取得も dtterm のシーケンスを利用するという方法もあるが、情報取得は
応答を受けるのが面倒なので避けた。
io/console で取得するという手もあるが、ruby 1.8 でも動かしたかったのでこれも避けた。
やっている事は端末のサイズを指定した大きさに変更するシーケンスを出力しつづけるだけなので、
sin() と cos() さえなんとか出来ればシェルスクリプトでも作れるはず。
・あぁ^~端末がぴょんぴょんするんじゃぁ^~
dtterm の以下のシーケンスを利用している。
- 端末サイズ取得 (文字単位)
- 端末サイズ変更 (文字単位)
- ウィンドウサイズ取得 (ピクセル単位)
- ウィンドウ位置取得 (ピクセル単位)
- ウィンドウ位置変更 (ピクセル単位)
- ルートウィンドウサイズ取得 (文字単位)
これら全部が問題なく使える端末が意外と無く、試した範囲では xterm と Tera Term でしか動かなかった。
# 9/13追記: mintty+cygwin でも動きました
ぴょんぴょんさせる範囲を得る為にルートウィンドウのサイズを取得するが、
これは文字単位での大きさなので一文字の大きさを調べる必要がある。
そこで取った方法は、まず端末サイズを 81x25 に変更してウィンドウサイズを取得する。
そして次に端末サイズを 80x24 に変更してウィンドウサイズを取得し、81x25 の時との差から
一文字の大きさを求める。
これで動かす範囲が決まるので、あとは適当にぴょんぴょんしている感じに端末の位置を移動させる。
こっちも頑張ればシェルスクリプトでも作れるかも。
3番目はこちらですね (スコア:1)
http://www.kaoriya.net/blog/2015/09/05/ [kaoriya.net]
※ タイトルで検索
Re:3番目はこちらですね (スコア:1)
はい、それです。
URLをコピペする時にミスっていたようです。
本文の方も修正しました。ありがとうございます。
xdpyinfo, xwininfo (スコア:0)
xdpyinfo でピクセル単位のスクリーンサイズ、
xwininfo -id $WINDOWID で端末のサイズ(ピクセル単位、文字単位の両方)
がわかるけどなぁ(環境変数 WINDOWID はふつう設定してあるよな?)。
Re:xdpyinfo, xwininfo (スコア:1)
xdpyinfo や xwininfo はX環境じゃないと使えないですよね。
これは ECMA-48 や VT100 の制御シーケンスの延長にある dtterm の制御シーケンスを使って実現している所に意味が有って、
dttermの制御シーケンスをサポートしていれば Tera Term や mintty のような非 X 環境の端末でも動いたり、
telnet や ssh 等でリモートホストに接続したり、シリアル接続でも動くんです。
# ssh 接続時は X 転送が使えますが、環境変数 WINDOWID は接続先に引き継がれません