QA@IT

Terminal.app のフルスクリーン化を検知したい

1977 PV

OSX(Lion) の Terminal.app のフルスクリーン化/解除を検知してプロセスを起動することは可能でしょうか。
Terminal.app 内で実行中の tmux の設定を、フルスクリーン状態か否かに応じて変更したいと思っています。

現在は tmux のステータスの更新間隔を1秒にして、ステータスの設定内容の中に外部コマンドの実行(#(...))を組み込み、その中でフルスクリーンとそうでない時に応じた設定をしています。

毎秒コマンドを実施するのはあまりスマートではないので、通知を受ける仕組みがあれば利用したい。何かないでしょうか。

回答

ポーリングによってフルスクリーンを検出できるなら、それをデーモン化してみてはどうでしょうか?
Terminal.app自身が通知を発行しない限り、通知の受信は無理だと思いますよ。

編集 履歴 (0)
  • なるほど、ということで、(検出方法がApple Scriptなので)そのようなApple Scriptを作ってみました。[gist: https://gist.github.com/2896293 ]

    あとはこれがDockに出ないようになれば完璧ですが、ひとまず目的は果たせたと思います。
    -
  • アプリケーションとして保存したスクリプトのContents/Info.plistに以下の設定を追加したらDockに表示されなくなりました。

    <key>LSUIElement</key>
    <true/>
    -
  • 追記: フルスクリーン状態をApple Scriptで取得するためには「システム環境設定」→「ユニバーサルアクセス」→「補助装置にアクセスできるようにする」にチェックが入っている必要があるようです。 -

SIGWINCH を使うのはどうでしょうか?

tmux では試していないのですが、 ssh で入った先の GNU screen の中では
ruby -e 'trap(:WINCH){puts "changed!"}; sleep'
のようにして試してみたところ、変更のタイミングは検出出来ているようです。
(なぜかフルスクリーンにしたときも戻したときも2回呼ばれましたが。)

編集 履歴 (0)
  • SIGWINCHハンドラを設定したプロセスをバックグラウンドに持っていったらシグナルを受け取れなくなってしまいました。tmuxセッション内でフォアグラウンド実行し、そのセッションをデタッチしても受け取れなくなりますね。何か一つ専用に開きっぱなしにしないとダメなのかな。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。