技術とかの雑なToday I Learnedメモ

Night Shiftのチェックボックスを押すだけのJXAを書いた

Night Shiftのチェックボックスを押すだけのJXAを書いた

tagucch/toggle-nightshift-checkbox-twice: Night Shiftのチェックボックスを2回切り替えるだけのJavaScript for Automation (JXA)

4/104/11にAppleScriptやJXAをいじくっていたが、これを作りたかった。やっとできた。

何をするのかというと、システム環境設定のディスプレイでNight Shfitを選び、手動で「明日までオンにする」のチェックボックスを2回押すというもの。

それはいったいなぜ?という話なのだが、以下に書いていく。

  • 画面が眩しいので普段からNight Shiftをオンにしている
  • 外部ディスプレイにつないだ状態でMacをスリープから復帰させると、結構な頻度で外部ディスプレイだけNight Shiftが適用されていない状態になる
  • そのため、毎度システム環境設定からディスプレイを開き、そこからNight Shiftを開き、手動で「明日までオンにする」のチェックボックスを一度外してからまたチェックするという手順を、スリープから復帰するたびに踏んでいる
  • これは自動化したいと思ったので自動化した

という感じです。

そもそもAppleScriptの存在を知り、そこからJXAの存在を知り、さらにTypeScriptでJXAを書けるのを知って、標準のスクリプトエディタではなくVS Codeで書かせてもらっていた。

JXA-userland/JXA: JavaScript for Automation(JXA) packages for TypeScript/Node.js.

なので開発体験は比較的マシ……かと思いきや、やはり厳しく、そもそもどのオブジェクトがどのプロパティを持っていてどうアクセスできるのか、といったことが書かれてないのがかなりつらかった。

Google先生も知らないJXAのプライベートメソッド - Qiita

この記事を参考にしたりしたんだけど、そもそも「Night Shiftのボタンを押したあとのダイアログみたいなやつはなんていう名前なの……?」というのも分からず、それがsheetだったというのは、インターネットにあるサンプルコードをとにかく読んで試してみて見つけたという感じだった。

JavaScript for Automation (JXA) | Toggle macOS Accessibility Keyboard

↑sheetの存在を知ったときに見てたコード

また、ボタンを押してからwindowが開くまでの間はdelayで処理を待たないとエラーになったりと、かなり分かりにくかった。

結局完成したものの、スクリプトの起動中は画面上で自動的に動作しているため、結局手を動かすか動かさないかという差だけになった。画面の最前面に移動して動作させないといけないため、バックグラウンドで処理ができない。バックグラウンドで処理ができるのが最も良かったのだが、やり方はあるのだろうか。

あとはこれをRaycastで呼び出せるようにしようとしている最中です。