Macのマルチ画面環境の設定

11.6インチ液晶のMacBook Airを買って、13.3インチ液晶の白MacBookをお蔵入りさせた(CD/DVD-ROMドライブが必要な時は引き続き使うのであるが)ら、やっぱり11.6インチのLCDは小さく、使用頻度は激減したが一応まだ残しているWindowsデスクトップPCの17インチのモニターに繋ぎたくなった。
しかし、MacBook Airからケーブル1本でMini DisplayPortからTVにHDMI出力できるらしかったので、やっぱり26インチの液晶TVに接続することにした。

ケーブルを入手して実際に繋いでみると、一発でMacBook Airと同じ画面がTVに表示されて、「ディスプレイ設定」画面が表示された。出力画面サイズを変えたりTVの設定を変えたりしてもどうしても文字がぼやけるが、それでも画面が大きいのは快適であることがわかった。
出力解像度は1600x900(LCDとのミラーリング無し)、TV(Panasonic TH-26LX60)側の設定は、試行錯誤の末、
バックライト「+10」(TV番組受信用は+30)、
ピクチャー「+25」(TV用は+30)、
黒レベル「0」、
色の濃さ「0」、
色あい「0」、
シャープネス「±0」(TV用は+10) 、
色温度「中」(TV用は高) 、
エッジ補正「中」(以下TV用は無設定)、
細部補正「弱」、
ガンマ補正「中」、
黒伸長「+8」、
白文字補正「+8」
にした。これでLCDが狭いことは全く問題でなくなった。13.3インチモデルを買わなくて良かった。


さて、ケーブルを抜き差しして気付いたのが、外部ディスプレイの解像度やLCDをミラーリングするかどうかの設定はずっと残るのに、外部モニター使用時のウィンドウの配置は残らないことだ。何かウィンドウを外部モニターに移動し、ケーブルを抜くと外部モニターにあった全ウィンドウがLCDに移動するが、もう一度ケーブルを挿しても全てLCDに残ったままなのである。これは、特にHDMIの場合、テレビの電源を切ると、ケーブルが接続されたままでも、外部ディスプレイと切断されたことになってしまうので、その状態を保つようにPCをスリープして復帰させるには、

  1. スリープ
  2. TV OFF
  3. TV ON
  4. 復帰
という手順を守らなくてはならず、これを間違えると、せっかく外部モニターに移動した全ウィンドウがLCDに戻ってしまう。これでは外部ディスプレイを使いにくい、というか使えない。

それを解決するアプリケーションとして、Forget-Me-NotStayを見つけた。"Stay"の方が高機能で、外部ディスプレイの着脱に関係なく、ウィンドウの位置を保存することができるツールであるが、明示的にウィンドウ位置の記憶を指示する必要がある(ケーブル差しで自動的に復帰するがケーブル抜きで自動的に保存されない)のと、有料ソフトなのがいまいちである。Forget-Me-Notは、作者のページの見た目が誤解を招くが、フリーソフトであるし、ケーブルを抜いた時にウィンドウ位置が記憶されるので、Forget-Me-Notを導入した。


さてさて、LCD側にJava API Referenceを表示して、EclipseのウィンドウをドラッグしてTV側に移動して、何かJavaアプレットのコードを開いて、これぞ省スペースで理想的な開発環境、と満足してデバッグを開始すると、アプレットのウィンドウがLCD側に表示されてしまうのが非常に面倒であることがわかった。その時大体マウスカーソルがTV側にあるので、アプレット上のボタンを触るために、マウスカーソルを長距離移動しないといけないのである。
それを解決するために、色々調べた。こういう時は、
(a) アプリケーション毎に出力先ディスプレイを設定する
(b) 外部モニターを主にする
(c) キーボード操作でウィンドウを別モニターに移動する
といった方法が常道である。他には、(d)アクティブウィンドウが切り替わった時にマウスポインターがウィンドウ上に無ければ自動的にアクティブウィンドウに移動させるという解も考えられるが、自分が意図しないタイミングでダイアログとかが開いて、ポインターが勝手に移動するのは不便であろう。それに、フォーカスロストした時にワンクリックでフォーカスを復帰させることができなくなるのは不便に違いない。

(a)については、前のMacに最初から入っていたSpaces(仮想デスクトップ)なら、アプリケーション毎にどのデスクトップで開くかを設定できたのだが、新しいMacにはSpacesが無く、代わりにMission Controlというのはあったが、同じような設定をする方法がわからなかった。

(b)は、割と意外な方法で実現できる。「ディスプレイ環境設定」の「調整」ペインを開くと、外部ディスプレイとLCDとの位置関係と、メニューバーをどちらに置くかを決められるが、このメニューバーがある方がメインディスプレイになり、メニューバーを外部ディスプレイに置くと、新たに開くウィンドウは全て外部ディスプレイで開くようになるのである。上記の問題はこれであっさり解決した。

(c)は、ジェスチャー入力を拡張するフリーの超人気ソフト、BetterTouchToolで実現できるので、他の方法を探すまでもない。筆者は元々ジェスチャー入力でなくキー操作でのウィンドウのモニター間移動に病みつきなので、上記の問題とは別に、

Command+Opt+C
Move Window to Next Monitor(隣のモニターへ)
Command+Opt+E
Maximize Window to Next Monitor(隣のモニターで最大化)
という設定にした。

(d)については、意外と方法が見つからず、LazyMouseという、ダイアログが開く時にマウスカーソルを自動的にデフォルトのボタンに移動させる有料ソフトがあったのと、java.awt.Robotクラスを使ってマウスカーソルを移動させるJavaアプリを自分用に作って常駐させている人が世の中に存在するらしいのをどこかで目にしたくらいだった。


java.awt.Robotは興味を惹かれたので、その内、何らかのキー入力をトリガーにして隣のディスプレイにマウスカーソルをジャンプさせるコードを作ろうと思った。

BetterTouchToolの使い方は知り尽くしておく価値がありそうである。

ところで、HDMI出力ならTVから音を鳴らせるのだが、ケーブル接続しただけではその設定にはならず、勝手に開く「ディスプレイ環境設定」でも設定できない。
音声出力先をTVに切り替えるには、HDMI接続中に「システム環境設定」の「サウンド」で設定する。これは結構わかりにくく、ネットで調べないとわからなかった。
一度設定すれば、ケーブルを抜いて差しても、自動的に抜く前の設定に戻る。

筆者はMacBookの蓋を閉じてもスリープしないようにするInsomniaXを以前から愛用しているのだが、MacBook Airに移行後、うまく動かないことが多かった。これの原因もわかった。Mac OSX LionならInsomniaX 2.0を使うべきである他に、InsomniaXを有効にしても、外部ディスプレイと接続したり切断したりする度に、メニューバーのInsomniaXのアイコンは有効のまま、InsomniaXが無効になってしまうのである。外部モニター接続中は、InsomniaXと関係なく、電源ケーブル接続中なら蓋を閉じてもスリープにならない(プレーヤーとして動くため)ので、外部モニターとの接続が切れてInsomniaXのアイコンが有効のままだったら、アイコンを押して"Enable lid sleep" → "Disable lid sleep"すると良いことになる。

外部ディスプレイ接続/切断でInsomniaXのアイコンが無効表示になりさえすれば(All I want it to do is change its icon)、ほとんど問題にならないので、実に惜しい。
関係ないが、この"is (to) change ..."のtoを省くことができるのは、be動詞の前にdoやdidが来る場合に限られるらしいことを今日知ったので、weblogを書くついでにこのように控えておく。

TVにパソコンの画面を表示するのは、昔使ってたMSX以来である。