macOS SequoiaでSidecarを実行するためのApple Scriptを書いた

私は普段メインでWindowsマシンを使っていますが、仕事ではMacBook Proを使っています。
そもそもモニターの数は足りているし、キーボードも自分のものを使うので、MacBook Proを開いて置く必要はなく、常にクラムシェルで使っています。
今の環境だと更にMac用の普通サイズのモニターを置くのはちょっとスペース的に厳しいのでiPadをSidecarで使えればよかったのですが、有線でつないでいてもたまに接続が切れてしまいます。
これがかなり厄介で、iPad側でSidecarを有効にできないので、いちいちMacBookを開いて、Sidecarを有効にしてというのをやらなければならないのがとにかく辛い。
幸いMacにはAppleScriptとかいう謎の自動化の仕組みがあり、これを使うとどうやらできそうな匂いはあったのですが、OSのバージョンが変わるごとに言語仕様が変わってしまうせいでSequoiaでやっている人があまり見当たらなかったのでまとめておきます。
tell application "System Events"
tell its application process "ControlCenter"
tell its menu bar 1
tell (UI elements whose description is "画面ミラーリング")
click
end tell
end tell
tell its window "コントロールセンター"
delay 0.5
click checkbox 1 of group 1 of its scroll area 1 of group 1
end tell
end tell
end tell
set x to "y"
は変数x
に文字列"y"
を代入する構文です。まあこれくらいのスクリプトならわざわざ使う必要はないです。
tell
はブロック内でのオブジェクトや値の指定を行う構文で、順に
tell application "System Events"
"System Events" アプリのtell its application process "ControlCenter"
ControlCenterプロセスのtell its menu bar 1
1番目のメニューバーのtell (UI elements whose description is "画面ミラーリング")
「画面ミラーリング」というdescrptionであるようなUI要素をclick
クリックする
というのが最初のブロックの意味になります。
あらかじめ画面ミラーリングのメニューバーに常に表示するようにしている前提で、そのメニューバー上のアイコンをクリックする、という処理になります。
同様に2つ目のブロックは、クリックして開いたメニュー(コントロールセンターというwindow扱いのようです)内のグループ1のスクロールエリア1の中のグループ1のチェックボックス1をクリックするという意味です。わからん。
これの厄介なところは、そもそも各UI要素がどんな値をもっているのか、どんな階層構造になっているのかなどがよくわからなかったりすることなのですが、XCodeに入っているAccessibility Inspectorを使うと多少は想像ができるようになります。(あくまで想像できるだけです)
あとはひたすらprintデバッグしました。過去はControlCenter(スイッチアイコンを押すと出てくるやつ)の画面ミラーリングボタンを押す実装だったり、インデックスではなく要素名で指定していたりといくつか実装例は出てくるものの、Sequoiaだとどれもうまく動かなくなっていました。階層構造とか要素名とかが変わってしまっているみたい。
indexを利用した実装は構成が変わったりすると壊れそうではありますが、まあ自分で使う場合はそうそう困らないだろうということで一旦このままにしてあります。
あとはこのテキストファイルを適当に保存し、iPadのショートカットアプリからsshで任意のコマンドを実行できるショートカットが作れるので、MacBookにsshして、osascriptコマンドでこのスクリプトを実行するようにすればOK。
1日くらいは放っておいても途切れませんが、気づいたら途切れているので、その場合はiPadのホーム画面に置いておいたショートカットウィジェットをタップすると、sshで上記AppleScriptが実行されてSidecarモードに入ることができます。
で、ここまで書いておいてなんなんですが、Sidecarの仕様上iPadを単体のディスプレイとしてSidecarすることはできません。(Sidecarで繋いだ状態でMacBookを閉じるとSidecarが終了してしまう)
これを回避する方法はいくつかありそうではありますが、一番簡単なのは適当なディスプレイに繋いでおくこと。でもそれがやりたくなくてこんなことしているのに本末転倒もいいところです。私は余っていたElgatoのHDMIキャプチャを繋いで、そのHDMIキャプチャをメインディスプレイとするようにしています。こうするとSidecarの要件を満たすので、Macbookを閉じてもSidecar状態を継続することができます。
ちなみにSynergyというアプリを使うと、マルチディスプレイの設定をするように複数のPC画面を並べてシームレスに゙移動できる上、メインのWindowsのマウスやキーボードを各モニターで共有することができます。

類似するアプリはいくつかあったり、Synergy自体が一部OSS化されていたりしますが、これが一番安定している感覚を受けました。LogicoolのMXか何かで使える似たようなアプリがあったと思うのでそっちをつかってもいいかもですが、私は違うのでこれを長い事使っています。
まあこんなことしなくても11インチくらいのモバイルモニター買って置けば一発だと思うので、そっちをおすすめします。でもiPadはRetinaだけどこのサイズのモバイルモニターはフルHDがほとんどなのがなあ。かといって4Kとかの11インチモバイルモニターとか一切需要なさそうではある・・・。