今は主にMacBook Proを使っていますが、 普段机の上では外付けディスプレイや外付けキーボード等を付けて使っています。 ネットワークも有線。
机以外に持ち出すことも良くするのでこれらの機器やネットワーク環境が 良く変わったりしますが、 そのような時に ControlPlane を使うと色々設定を自動的に行なってくれる様に出来ます。
ControlPlaneの導入
以前、
の所で書きましたが、 普段、WindowsのCtrl-Tab の様にウィンドウ事の切り替えが出来る様にするために HyperSwitch を使っていますが、 これが外付けディスプレイをつけたり外したりすると ウィンドウ一覧の背景が選択色と一緒になってしまって見づらくなってしまいます。
これを再起動するのに毎回メニューバーから一度消すなり 表示させてない場合はタスクバーで消すなりして、 再びアプリを起動、とかしたりしなくてはいけなくて結構煩わしかったので、
の所で作った様なアプリの再起動スクリプトを作ってスクリプトを呼ぶだけで 再起動出来る様にしていました。
さらに
で書いたようにAutomatorを使ってもっと簡単なResetApps.appという アプリケーションを作ってDockに置いてクリックするだけで再起動できるようにしました。
ただ、これでも毎回ディスプレイをつけたり外したりするたびにやるには面倒です。
そんな時に
ControlPlane: http://www.controlplaneapp.com/
を使えばディスプレイの接続状態を感知して自動で再起動をしてくれます。
ControlPlaneもともと MarcoPolo というアプリを引き継いだもので、 Macのあらゆる状態を感知してその状況に応じた設定に変更したり アプリやスクリプトを実行することが出来ます。
CodePlaneはCaskが用意されてるのでHomebrew Caskを使って
$ brew cask install codeplane
でインストールできます。
もしくは 公式ページ からダウンロード。
感知出来る状態、状態変化
感知できる状態は Feature List にありますが、例えば
- 特定のアプリケーションがアクティブかどうか、または起動しているかどうか
- 現在繋がってるネットワークの種類
- 現在のIPアドレス
- 特定のモニタがつながっているかどうか
- 特定のUSBデバイスがつながっているかどうか
- ラップトップの蓋の開け閉め
- 特定のディスクをマウントしているかどうか
- 電源アダプタがつながっているかどうか
- スリープに入る、スリープの解除
等の状況に応じて何らかのアクションを起こせます。
シャットダウンやブート時に関しては指定出来ない様です。 (ブート時に関してはデフォルトMac機能でユーザー設定のログイン項目からアプリの指定とかは簡単に出来ますが。)
取り敢えず使ってみる
上で書いた外部ディスプレイをつなげたり外したりする時に ResetApps.appを呼ぶには
GeneralタブのConfidence required to switchのレベルを確認。(デフォルトは75%)Contextsタブで新たにMonitor ConnectedというContextを作る。Evidence SourcesでAttached Monitorにチェック。RulesでAdd 'Attached Monitor' Rulesを追加し、An attached monitor named: 外部ディスプレイの名前1。Context: 上で作成したDisplay ConnectionConfidence: 上で調べたConfidence required to switchよりも高くする(90%とか)。Negate: チェックを入れない。
Actionsタブで以下の物を作成。Parameter: /path/to/ResetApps.appDescription: Reset Applications (HyperSwitch, BetterTouchTool)Context:Display Connection,BothDelay:NoneEnabled: チェックを入れる。
と言った感じで新たなコンテクストやアクションを作ります。
General

Context

Evidence Sources

Rules


Actions


正しく作ってから指定の外部ディスプレイが繋がっている状態になっていると、
Contextsの所のMonitor Connectedの所に90%と出ているはずです。

さらに、これがGeneralのConfidence required to switch
の値よりも高ければ
メニューバーのCodePlaneのマークが強い白になって、
押してみるとActive Context:の欄にMonitor Connectedが
表示されてるはずです。

外部ディスプレイを外すとこれらが消えるはずです。
Confidenceレベルについて
上で、Confidenceという値を指定していますが、
Rulesで指定している状態の結果が、
Generalで指定している
Confidence required to switchよりも高い状態になると、
そのContextの状態がActiveになったりInactiveになったりします。
上の例ではDisplay Connectionというコンテクストに対して
一つのルールしか指定しなかったのでこの場合は
単にこのルールが適用される時のConfidenceレベルが
そのままDisplay ConnectionのConfidenceレベルになるので、
これが
Confidence required to switch
より大きくなるようにしないといけません。
もし小さくするとディスプレイをつなげても外してても常に Inactiveな状態になります。
このConfidenceレベルが重要になるのは複数の
ルールを同じContextに指定する場合です。
それぞれ一つでも該当する場合にActiveにしたければ
全てのルールにおいてConfidenceレベルを
Confidence required to switchより大きくしてあげれば良いだけです。
複数の条件を組み合わせたいとき、
- 指定のIPで繋がってる
- かつ指定のディスプレイが繋がってる時のみ
みたいな物を指定したいとき、
Attached MonitorルールでのConfidence: 60%Assigned IP AddressルールでのConfidence: 60%
として、これらをIP/Monitorというコンテクストに結びつけておくと、
片方だけが有効な時は
IP/MonitorのConfidenceレベルは60%になります。
両方が有効な時は
1 - (1-0.60)*(1-0.60) = 0.84
で、84%になります。
つまり、複数のルールを同じコンテスクトに指定すると、 有効な物が複数ある場合、 それらがActiveでないconfidenceレベルを掛けあわせて1から差っ引いた形になります。
これで、片方のルールだけが有効な時には
IP/MonitorはActiveにはなりませんが、
両方が有効な時に限りActiveになるように出来ます。
音量調整
ControlPlaneのアクションに
Sound and Music Actionsというものがあって、
ここでMuteを指定することが出来、音量調整が出来ます。
また、Evidence SourcesにはSleep/Wake Eventという
スリープに入る時と解除される時にトリガーをかけれる物もあるので、
これらを使うとスリープ時に音量をmuteにする、ということが出来ます。
の所でいくつかこれ系のアプリを試してみたりしましたが、 これが代用になるかな、と思ってちょっと試してみました。
たしかにスリープに入る時に音量をMuteにすることは出来ました。
ですが、上にも書いたように、シャットダウン時のSourceが無いので 特にいきなり電源を切って他に持ち出す、といった際に 外でジャーンと鳴ってしまうのを防ぐことは出来ません。
ということで、取り敢えず素直に上の記事で書いたとおり、ボリューム調整に関しては Volume Resetを使おうかな、と思います。
ちなみに、このSound and Music Actions等一部のアクションに関しては、
初回実行時にアクセシビリティの設定が要求されることがあります。

環境設定ディスプレイで 該当ディスプレイの方に出てるウィンドウのタイトルから調べられる ↩