3 min read

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

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 - Share one mouse & keyboard across computers
Synergy is an app that shares one mouse and one keyboard across multiple computers and monitors. Instant download, easy to setup in minutes.

類似するアプリはいくつかあったり、Synergy自体が一部OSS化されていたりしますが、これが一番安定している感覚を受けました。LogicoolのMXか何かで使える似たようなアプリがあったと思うのでそっちをつかってもいいかもですが、私は違うのでこれを長い事使っています。

まあこんなことしなくても11インチくらいのモバイルモニター買って置けば一発だと思うので、そっちをおすすめします。でもiPadはRetinaだけどこのサイズのモバイルモニターはフルHDがほとんどなのがなあ。かといって4Kとかの11インチモバイルモニターとか一切需要なさそうではある・・・。