Big Surにしたら外部ディスプレイのTrue Toneがスリープ解除時にほぼ毎回オフになるようになったのでAppleScriptで対応した

タイトルの通りですが、macOSを11 Big Surにアップデートしてから、Macのスリープを解除するごとに外部ディスプレイのTrue Toneがほぼ毎回、実質オフになってしまう(機能的にはオンになっている)症状に悩まされています。

Catalinaのときよりも悪化した

ひとつ前のバージョンmacOS 10.15 Catalinaでも同様の現象があり、5回に1回くらいの割合で発生していました。この時はそんなに回数も多くないので、諦めてシステム環境設定を毎回開いてTrue Toneをオフ→オンするか、ケーブルを抜き差しするか、ディスプレイの電源をオフ→オフするかしていました。

そして今。Big SurはありがたいことにメニューバーからシュッとTrue Toneのオンオフができるようになりました。しかしこのTrue Toneをオフにしてオンにするという動作を手でやろうとするとポップアップメニューを閉じるところまで4クリックもしなければなりません。メニューバーに並んだ小さいアイコンの中からディスプレイのアイコンを見つけるのも意外と認知負荷が高く、やっているうちにだんだんつらくなってきました。

display-setting

Touch Barで必要なときにオフ→オンできるようにした

そこで、AppleScriptでなんとかできないの?と思って見つけたのがこちらの記事です。

MacのTrue ToneのオンオフをTouch Barから切り替えるショートカットの作り方

Touch Barはほとんど使ってないのでTouch Barでトリガーするのがいいのかどうかよくわかりませんでしたが、Touch Barをつかう良い機会になるかなと思ってやってみました。毎回かならず症状が発生するのではないので自動化は見送りです。

AppleScriptはトグルするだけじゃなくてオフにしたあとオンにしてほしいので click を2回してもらうようにアレンジ。

on run {input, parameters}
  tell application "System Preferences"
    activate
    set current pane to pane "com.apple.preference.displays"
  end tell

  delay 0.5

  tell application "System Events"
    tell process "System Preferences"
      tell tab group 1 of window "Built-in Retina Display"
        click second checkbox
      end tell
    end tell
  end tell

  delay 0.5

  tell application "System Events"
    tell process "System Preferences"
      tell tab group 1 of window "Built-in Retina Display"
        click second checkbox
      end tell
    end tell
  end tell

  delay 0.5

  tell application "System Preferences"
    quit
  end tell

  return input
end run

それから、もうひとつアレンジした箇所がここです。

tell tab group 1 of window "Built-in Retina Display"

参考にした記事で window 1 と書いてあったところにシステム環境設定のウィンドウ名を入れています。

僕のMacはMacBookに外部ディスプレイを繋ぎ、外部ディスプレイをメインのディスプレイとして設定しているので、ここが1だとエラーになってしまうのですね。

ディスプレイの設定ウィンドウは画面の数だけ表示されるわけですが、True ToneのオンオフのチェックボックスはMacBookの方のウィンドウにしかありません。そのためウィンドウ名の指定が必要になったのです。

Touch Barがなんか好きになった

Touch Barはほぼ使ったことなかったのですが、今回の対応を経てスリープ復帰後にほぼ毎回触るようになりました。True Toneのオフ→オンも楽になり(というか、外部ディスプレイまわり直ってほしいな……)、前々から使っていた日付入力スクリプトも同じところで使えることがわかりちょっとお得な気分になったりしました。

touchbar1

touchbar2