パスワードを忘れた? アカウント作成
12511074 journal
日記

dodaの日記: 端末がびよんびよんしたりぴょんぴょんしたり 4

日記 by doda

元ネタはこの辺

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 の時との差から
一文字の大きさを求める。
これで動かす範囲が決まるので、あとは適当にぴょんぴょんしている感じに端末の位置を移動させる。

こっちも頑張ればシェルスクリプトでも作れるかも。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by wedge (14149) on 2015年09月11日 20時57分 (#2880813) 日記

    http://www.kaoriya.net/blog/2015/09/05/ [kaoriya.net]

    ※ タイトルで検索

  • by Anonymous Coward on 2015年09月12日 9時44分 (#2881031)

    xdpyinfo でピクセル単位のスクリーンサイズ、
    xwininfo -id $WINDOWID で端末のサイズ(ピクセル単位、文字単位の両方)
    がわかるけどなぁ(環境変数 WINDOWID はふつう設定してあるよな?)。

    • by doda (31157) on 2015年09月13日 2時38分 (#2881524) 日記

      xdpyinfo や xwininfo はX環境じゃないと使えないですよね。

      これは ECMA-48 や VT100 の制御シーケンスの延長にある dtterm の制御シーケンスを使って実現している所に意味が有って、
      dttermの制御シーケンスをサポートしていれば Tera Term や mintty のような非 X 環境の端末でも動いたり、
      telnet や ssh 等でリモートホストに接続したり、シリアル接続でも動くんです。
      # ssh 接続時は X 転送が使えますが、環境変数 WINDOWID は接続先に引き継がれません

      親コメント
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...