スリープ復帰時にチャイムを鳴らしてウエルカム・メッセージを表示するアプリケーション「Okaeri」のLeopard対応版を元旦に配布した。
Ayatsukiさんが言うところによれば、スクリーンセーバーでパスワードロックをかけている場合には、なんにも表示されない(というか、スリープ復帰直後に表示しているが見えない)とのことである。
早速、これに対応しようと思いたった。きっと、対応には2つの選択肢があるはずだ。
(1)まじめに対応するパターン
各プロセスの状態をshell経由で取得して対応するパターン。パスワード入力ウィンドウから通常状態に復帰したことを検出し、それまでメッセージ表示を抑止する。
スクリーンセーバーはScreenSaverEngine.appというプログラムが表示しているので、プロセス一覧を取得してこいつが入っていればスクリーンセーバーの動作中ということになる。
だが、スリープ復帰時にパスワードロックを行っているアプリケーションは、実はScreenSaverではなかった。loginwindowという常時起動しているアプリケーションだ。ログイン復帰時、ASの世界でプロセス管理を行っているSystemEventsに最前面のプロセス名を問い合わせても、loginwindowの名前は出てこない。loginwindowは常時起動しているので、psコマンドで存在確認しても意味がない。
(2)まじめに対応しないパターン
効果があるかどうか分からないが、メッセージ表示ウィンドウのLevelを変更してあげるとよいかもしれない。各WindowはLevelという値を持っている。これは、いわば重ね合わせの優先順位であり、数字が大きいほど上に表示される。通常のWindowでは0だ。これが、フローティングのWindowだと3、サブメニューだと3、パネルだと8、Dockだと20、メインメニューが24、ポップアップメニューが101、ScreenSaverが1001ということになっている。
ためしに、Levelを1001以上に設定してみると……一応、見えるだけは見えるのではないか?
1001に設定してみてもダメだったが、65535に設定したら表示できた(Mac OS X 10.4.11) こっそりこの仕様でいってみよう(^ー^;;;;