Mac OS Xでは、ウインドウ上のボタンの機能で「全画面」というのがありません。きっちり画面いっぱいの領域を使いたいときには、ウインドウ左上の緑色のボタンをクリックするか、ウインドウの右下をドラッグするなどの作業が必要であるため、Windows に慣れた人には、不便な仕様に見えるかもしれません。

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に登録しておくとよいと思います。
保存した、アプリケーションのアイコンを見やすいものに変更しておくと、さらに使いやすくなるでしょう。

すぐ使ってみたい人はこちら

注意)Microsoft Excel や Word にはバグがあるため、このスクリプトでウインドウサイズを変更すると表示がおかしくなります。


※記事内容は執筆時点のものです。最新の内容をご確認ください。
※OSやアプリ、ソフトのバージョンによっては画面表示、操作方法が異なる可能性があります。