僕が知っている AppleScript Studio で Floating Window を作る方法をまとめます。AppleScript は他のアプリケーションをコントロールしてなんぼですから、他のアプリケーションのインターフェースに寄生する方法は重要でしょう。その一つとして最も自由度が高いのが Floating Window ではないでしょうか。残念ながら AppleScript Studio で真の Global Floating Window は作れませんが、近いものを作る事はできます。
また、この文書で解説されているさまざまな Floating Window のサンプルをご用意しました。
MacOS X の Window System には level とよばれるレイヤー構造があり、window の重なり具合は level という属性で決定されているようです。level の値が大きい window は level の値の小さいものより常に前面に表示されます。
普通の window の level は 0です。window の level を 0 以上にしてやれば、すべてのアプリケーションの window の上に表示される window を作る事ができます。window がどの level に属すべきかは決まっているようで、Floating Window の場合は「3」のようです。AppleScript Studio の Reference の Window Class の解説部分に記述があります。
「will open」handler か 「awake from nib」handler で level を設定するコードを書けば、その window は Floating Window になります。
このように、Finder が active な状態で Finder の window の上に表示させことができます。
しかし、この Floating Window をクリックすると Floating Window を所有するアプリケションが前面に出て来てしまいます。残念ながら、Floating Window を所有するアプリケーションをバックグラウンドに置いたまま、Floating Window を操作できる方法はわかりません。Background Application にすることでメニューバーを変更させない事はできますが(あとで解説します)、それでも Floating Window を所有するアプリケーションは前面に出て来てしまいます。
Floating Palette を作るには Window より Panel を使う方がいろいろ得する事があります。
Panel を使うと新たに「floating」と「hides when deactivated」という property が使えるようになります。また、Utility Window にすると見た目を Floating Palette っぽくできます。
「floating」 property を true に設定する事は 「level」 を 3 に設定する事と同じようです。
property「hides when deactivated」 は Interface Builder で設定する事ができます。初期状態では、true に設定されています。
「Hide on deactivate」が On になっていると Panel は所有しているアプリケーションが active になっている時だけ表示されます。他のアプリケーションが active になると自動的に隠されてしまいます。他のアプリケーションの上に表示させるには、「Hide on deactivate」を Off にします。
「Utility Window」の option を ON にすると、見た目を Floating Palette っぽくする事ができます。
「Utility Window」を On にすると、自動的に property「floating」と「hides when deactivated」が true に設定されます。またどういうわけか、Interface Builder で「Hide on deactivate」を Off にできなくなってしまいます。
しかし、スクリプトから property「hides when deactivated」を設定する事で、すべてのアプリケーションの上に表示させることができます。
なお、property「hides when deactivated」を false にすると、Interface Builder での「Visible at launch time」の設定が無効になってしまうようです。ですから、launch ハンドラなどで明示的に window を開く必要があります。
以上で、自分のアプリケーションが active の時だけ表示される Floating Window と、すべてのアプリケーションの上に表示される Floating Window を作れるようになったと思います。しかし・・・この Floating Palette をクリックすると Floating Window を所有している application が全面にでてきてしまいます。残念ながら、この辺が AppleScript Studio の限界のようです。すなわち 真の Global Floating Palette は作る事はできません。しかし、Backgound Application にすることでメニューバーは変わらないようにする事ができます。
このように、Info.plist に LSUIElement という Entry を新たにつくり、その値を1に設定します。このようにすると、メニューバーを持たないアプリケーションになります。また、Dock にも表示されなくなります。しかし、Floating Window をクリックすると Floating Window を所有するアプリケーションが前面に出てくるのは変わらないようです。メニューバーは変わらないのですが、もともと前面にあったアプリケーションの Floating Window は消えてしまいますし、選択されていた window が active でなくなってしまいます。
このように、真の Global Floating Window は作る事はできませんが、それでもかなり使えるものが作れると思います。
Interface Builder の Panel の設定で「Non activating Panel」という option があります。
この option を On にすれば、Floating Window をクリックしても active にならないアプリケーションが作れそうな気がしそうですが、残念ながらそうはなってくれませんでした。AppleScript Studio を使わない純粋な Cocoa アプリケーションだと、Floating Window を選択しても active にならないアプリケションを作ることができます。
AppleScript Stuido の場合、On にすると Floating Window の表示時に自分自身を activate するアプリケーションになってしまいます。Off にしたままが良いでしょう。
どんなアプリケーションが前面にあっても、最前面に表示される window は作る事ができるようになりました。次にやりたくなるのは、特定のアプリケーションでだけ表示される Floating Window だと思います。残念ながら、その為に特別な仕組みは見当たりません(あるのなら誰か教えて下さい)。idle handler 内で 最前面のアプリケーションを監視し、自分で Floating Window を表示したり隠したりするしか無いようです。しかし、1秒間隔で最前面のアプリケーションを監視しても、システムに大きな負荷がかかる事はないですし、また Floating Window もスムーズに表示/非表示されます。
スマートに行おうとすると、アプリケーション切り替えのイベントを取得しなければならないのですが、それには Carbon Event を使う必要があります。すなわち、AppleScript だけでは無理です。