rwait - ウィンドウが出てくるまで待つプログラム

指定したウィンドウが出てくるまで待つ小さいプログラム。どこかにありそうなんだけど、ratpoison版で作ってみた。きっとウィンドウマネージャー非依存で作れるだろうけど俺はそこまでX Window Systemに精通してないので。

Xプログラムを起動し、N(1〜)枚のウィンドウが出てくるまで待ち、出てきた時点で終了するxtoolwaitというプログラムが存在するが、スクリプト内でxtoolwaitを使っても立ち上げたXプログラムがスクリプトの子プロセスにならないのでwaitが使えない。

次のRubyスクリプトratpoison -c windowsの出力結果の1行1行を配列 _ に格納し、Rubyの式の評価結果が真になるまで待つ。俺の現在の状態では _ は次の値である。

%w[0+rxvt
   1*emacs0
   2-langhelp
   9-Iceweasel]

短いのでソースを見れば何やってるかは明白であろう。0.1秒ごとに ratpoison -c windows を実行して、その結果の配列を引数で指定された式に渡して真になるまでループしてるだけ。

#!/usr/bin/env ruby
def rwait
  ws = nil
  begin
    sleep 0.1
    ws = `ratpoison -c windows`.sub(/ No managed windows /,'').split(/\n/)
  end until yield(ws)
end

if __FILE__ == $0
  script = ARGV.first
  if script
    rwait{|_| eval script}
  end
end

たとえばIceweaselというウィンドウが出るまで待つには、

rwait '_.grep(/Iceweasel/).first'

とすればよい。

拡張しようと思えばいくらでもできるが、実用上これで十分。