Switch Controlを起動するAppleScriptです。macOS標準搭載のScript Menuに入れて呼び出して使っています。Switch Controlは、障害者向けの支援機能を提供するmacOSの標準機能で、標準のマウス/トラックパッド、キーボードなどの利用が困難なユーザーに向けて少ないボタンや音声で操作する機能を提供するものです。
一般のユーザーにとってもSwitch Controlは有効活用できる機能であるため、個人的にいろいろ試しています。
もともと、Switch Controlを起動するためのコマンドは用意されていません。AppleScriptのコマンドで起動できるとか、コマンドラインから起動できるとかいった手軽な起動手段は存在していません。
……というわけで、仕方なくGUI Scriptingで画面上のチェックボックスをクリックするという不毛な処理を書いたわけですが、ただダラダラとGUI部品の階層をなぞるだけの知性のカケラもないコードを書くだけでは意味がありません。
この、クリックする対象のチェックボックスを実行言語環境が変わっても自動で検出できるようにチャレンジしてみました。
結果:失敗 追いかける対象が大きすぎたようです。システム環境設定の画面上のチェックボックスについているタイトル文字を特定するだけの話なのですが、システム環境設定(System Preferences.app)の各機能はプラグインで提供されており、システム環境設定のバンドル内のstringsファイルを追いかけても希望の文字列は得られません。
# このため、チェックボックスのタイトルを言語環境ごとに書き換える必要があります
では、実際に各プラグインのバンドル構造内でstringsファイルを取得することを試みたのですが、これにも失敗。それらしい文字列は得られるものの、文章すべてが1エントリに登録されているわけではないようで、stringsファイルでキーを指定すれば各ロケールごとの対象文字列が得られる……という理想的な処理はできませんでした。
今回のアプローチは技術的には失敗してしまいましたが、他の誰かが突破する日も来るかもしれません。自分のマシンのSSD内には、割とそうした「失敗作」のScriptも存在しており、そうした失敗作が別の機会の土台になることも多々あります。
仕事で作り込む必要のあるScriptであれば、スクリプトバンドル内に各言語ごとの文字列テーブルを自分で作って、localized stringでその値を引けるようにする感じでしょうか。OS側で対象箇所の文言を変更した場合には自分のテーブル側もアップデートする必要が出てきてしまいます。
本Scriptの冒頭でSwitch Controlが起動しているかどうかのチェックを行い、起動中であれば起動処理を行わないようにしています。この判定処理自体は、単体ではほぼ意味がありませんが、こうして組み合わせることで「不要な処理を行わない」ための部品として有効に活用できているといえます。
AppleScript名:Switch Controlを起動 |
— – Created by: Takaaki Naganoya – Created on: 2020/05/13 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aRes to launchSwitchControl() of me on launchSwitchControl() if current application’s NSWorkspace’s sharedWorkspace()’s isSwitchControlEnabled() = true then return true set aLoc to (current application’s NSLocale’s currentLocale()’s languageCode()) as string –Current Language detection if aLoc = "en" then set aStr to "Enable Switch Control" –English else if aLoc = "ja" then set aStr to "スイッチコントロールを有効にする" –Japanese else error "Make current language entry" end if tell application "System Preferences" activate tell pane id "com.apple.preference.universalaccess" reveal anchor "Switch" end tell end tell set hitF to false tell application "System Events" tell process "System Preferences" repeat 200 times delay 0.1 if (exists checkbox aStr of tab group 1 of group 1 of window 1) then click checkbox aStr of tab group 1 of group 1 of window 1 set hitF to true exit repeat end if end repeat end tell end tell tell application "System Preferences" to quit return hitF end launchSwitchControl |