先日公開したSave Panel Extenderの動作原理についてちょっと書きたいと思います。特にファイルの保存を検知するあたり。OMSavePanelのときもどこかで書いたかもしれませんが、だいたい同じです。
SPEでは、保存パネルの保存ボタンが押されるとそのイベントをアプリケーションより早く拾い上げて、ユーザが指定したファイル名を取得します。いわゆるMethod Swizzlingを用いてアクションの中に割って入っているわけです。
保存先のファイル名がわかったら、ファイルシステムイベントAPI (FSEvents) を使って監視体勢に入るわけですが、このFSEventsはディレクトリ単位での監視しかできないので、とりあえず親ディレクトリを監視登録します。
ディレクトリの内容が変更されるとFSEventsのデーモンがそれを検知して通知してくれるわけですが、この変更が対象ファイルの保存によるものなのかはわかりません。新規保存ならファイルが存在するかどうかで保存したかどうかがわかりますが、既存のファイルを置き換えて保存する場合にはそれではうまくいきません。そこで、SPEではファイルの更新日が新しくなったかどうかをチェックして、保存されたかどうかを判定し、そこからオプションの適用を行っています。
おそらくこういった作業をするにあたってはごく普通の手順だと思いますが、いくつか弱点があって、ファイルの更新日が古い日付のままだったり、FSEventsがディレクトリ内容の変更を検知しなかったりしたらオプションの適用は失敗してしまいます。そんなケースがあるのかは知りませんが。
0 件のコメント:
コメントを投稿