今は主に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 Connection
Confidence
: 上で調べたConfidence required to switch
よりも高くする(90%とか)。Negate
: チェックを入れない。
Actions
タブで以下の物を作成。Parameter
: /path/to/ResetApps.appDescription
: Reset Applications (HyperSwitch, BetterTouchTool)Context
:Display Connection
,Both
Delay
:None
Enabled
: チェックを入れる。
と言った感じで新たなコンテクストやアクションを作ります。
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
等一部のアクションに関しては、
初回実行時にアクセシビリティの設定が要求されることがあります。
環境設定
ディスプレイ
で 該当ディスプレイの方に出てるウィンドウのタイトルから調べられる ↩