Mac のこういった特徴は、できるだけデスクトップを隠さないようにという配慮によるものです。不要な領域をウインドウで隠さないため、異なるウインドウ間のドラッグ&ドロップや、別の資料を見ながらの編集作業がやりやすくなる利点があります。
さらに、メニューバーがウインドウと分離され上部に固定されているので、ウインドウの横幅をどんなに狭くしても、メニュー操作に影響しないのです。
Mac OS 9以前のMac OSでは、ほとんどのアプリケーションでズームボックス(Mac OS Xでは緑のボタンが該当)を押すことにより、最適なウインドウサイズになる仕組みが実装されていることが当たり前だったのですが、Mac OS Xのアプリケーションの多くがこれらのルールを全く意識していないため、正直言って使いにくくなってしまいました(Appleのソフトウェアですら、Finder以外はそういった配慮がほとんどないのです)。
せめて、縦方向のサイズだけでもきっちりデスクトップのサイズに合わせてくれれば……
というわけで、AppleScriptで作ってしまいましょう。
注意)この記事中のスクリプトを実行するには、システム環境設定-ユニバーサルアクセス にて「補助装置を使用可能にする」をオンにする必要があります。
AppleScriptでウインドウサイズを変更する
AppleScript対応のアプリケーションならウインドウサイズの調整は簡単です。set bounds of window 1 of application "'アプリケーション名'" to {左上X座標,左上Y座標,右下X座標,右下Y座標}
とすれば、ウインドウのサイズと位置が調整されます。Safariなら以下のようになります。
set bounds of window 1 of application "Safari" to {0,0,800,600}
次に、AppleScriptを実行するたびに、サイズを自動計算するスクリプトを作ってみましょう。
まず画面のサイズがどれくらいか?調査します。これは、Finderのデスクトップのウインドウサイズを調べることでわかります。とりあえず、displayBounds という変数に覚えます。
tell application "Finder" set displayBounds to bounds of window of desktop end tell
次に、対象のアプリケーションの最前面のウインドウの現在のサイズを取得して、winBoundsという変数に覚えます。Safariなら、以下の通り。
set winBounds to bounds of window 1 of application "Safari"
縦方向のサイズを変更するだけなので、座標指定{左上X座標,左上Y座標,右下X座標,右下Y座標}のうち、右下Y座標の数値を変更します。画面のサイズより20ドットくらい小さいくらいがちょうどよいでしょう。
set item 4 of winBounds to (item 4 of displayBounds) - 20
変更したwinBoundsをアプリケーションに適用します。
set bounds of window 1of application "Safari" to winBounds
AppleScript非対応のアプリケーションも操作する
AppleScriptに対応していないアプリケーションのウインドウサイズを変更する場合は、少し工夫が必要で、System Events というバックグラウンドアプリケーションを通して実行します。例えば、「ComicStudio EX 3.0」の最前面のウインドウを800x600にしたい場合、以下のようなスクリプトになります。tell application "System Events" tell process "ComicStudio EX 30" set topWindow to item 1 of (every window whose focused is true) set size of topWindow to {800, 600} end tell end tell
ウインドウを取得する場合に少し特別な方法(every window whose focused is true)を使用していますが、これは、ツールパレット類のウインドウが対象になってしまわないための工夫です。
Dock上でクリックする度にAppleScriptを実行する
Dockにアプリケーションとして登録したAppleScriptをすばやく実行できるようにするには、アプリケーションを自動的に終了しないようにして、reopen イベントを処理します。on reopen set bounds of window 1 of application "Safari" to {0,0,800,600} end reopen
さらに、アイドル状態で最前面のアプリケーションを調べておくようにすると、状況に応じて目的のアプリケーションを切り替えることができるでしょう。propery appName に覚えておきます。
property appName:"" on idle tell application "System Events" set pList to name of every process whose frontmost is true set appName to item 1 of pList end tell return 1 end idle
先ほどのreopenイベントも改造して
property appName:"" on idle tell application "System Events" set pList to name of every process whose frontmost is true set appName to item 1 of pList end tell return 1 end idle on reopen set bounds of window 1 of application appName to {0,0,800,600} end reopen
ここまでできたら、あとは変更するウインドウの取得方法をいろいろなアプリケーションで使えるように工夫します。
property appName : "" on idle tell application "System Events" set pList to name of every process whose frontmost is true set appName to item 1 of pList end tell return 1 end idle on reopen tell application "Finder" set displayBounds to bounds of window of desktop end tell tell application "System Events" tell process appName try set topWindow to item 1 of (every window whose focused is true) on error set topWindow to window 1 end try set winSize to size of topWindow set winPos to position of topWindow set item 2 of winSize to ((item 4 of displayBounds) - (item 2 of winPos) - 20) set size of topWindow to winSize end tell end tell end reopen
以上のスクリプトを自動的に終了しないようにしたアプリケーションとして保存し、Dockに登録しておくとよいと思います。
保存した、アプリケーションのアイコンを見やすいものに変更しておくと、さらに使いやすくなるでしょう。