macOSでプロジェクタを繋ぐたびにスクリーンセーバとかの設定をいちいちしなくて済むようAutomatorにがんばってもらうことにした

# なにに困っていたかというと

- プロジェクタで投影しているとき、スクリーンセーバになったり、画面OFFになったりするの、困る
- 画面OFFの時間を変えたり、スクリーンセーバの時間を変えたりするの、めんどう
 - 画面OFFは電源とバッテリと2ヶ所変えないといけないし
 - プロジェクタを使ったあと、戻し忘れてると、自分の机の上で無駄にバッテリ消費してるのを発見してツラい気持ちになる


# やったこと：基本的な方針

- かの人気のないAutomatorでappをつくり（中身はかの時代遅れのAppleScript）、Spotlightで起動し、さっさと設定を変えられるようにした
- プロジェクタモードとそうでないときの2パターントグル
 - プロジェクタモード：省エネルギーを60分（電源アダプタ／バッテリともに）、スクリーンセーバを30分
 - そうでないモード：省エネルギーをデフォルトに戻す（電源アダプタ／バッテリともに）、スクリーンセーバを2分
- アプリ名は適当。ToggleProjector.appとか


# やらなかったこと：検討はしたけど

Automatorとshell scriptでやろうと思った
が考え直してAutomatorとAppleScriptでやることにした


# 手順

- Automatorでappをつくる
- AppleScriptを書く
- システム環境設定で、appに実行許可を与える
- Spotlightで起動


### Automatorでappをつくる

Automatorを開き、新規書類で「アプリケーション」を選ぶ


### AppleScriptを書く

~~~AppleScript
set projectorMode to false --仮にプロジェクタモードをオフとする

--
--システム環境設定が開いていたら閉じる
--

if application "System Preferences" is running then
	tell application "System Preferences" to quit
	delay 2 --直ぐに次の動作をするとエラーとなるので待つ
end if

--
--まず省エネルギーを切り替える
--

tell application "System Preferences"
	--"電源アダプタ"タブを開く
	reveal anchor "Options" of pane id "com.apple.preference.energysaver"
	activate
	--アンカー名称取得コード --
	--set current pane to pane "com.apple.preference.energysaver"
	--get the name of every anchor of pane "com.apple.preference.energysaver"
	--アンカー名称取得コード --
end tell


tell application "System Events"
	if UI elements enabled then
		
		tell application "System Events"
			tell process "System Preferences"
				
				--"電源アダプタ"ラジオボタンを押す
				click radio button "電源アダプタ" of tab group 1 of window "省エネルギー"
				delay 0.1
				
				--30分未満なら projectorModeをオンにする（プロジェクタモード）
				if value of slider 1 of tab group 1 of window "省エネルギー" < 270 then set projectorMode to true
				
				if projectorMode then
					--プロジェクタモードなら
					--スライダ値を62分ぐらいに
					set value of slider 1 of tab group 1 of window "省エネルギー" to 550
					--値が保存されないので、キーを使ってスライダを動かす
					delay 0.1
					keystroke tab
					delay 0.1
					keystroke tab
					delay 0.1
					keystroke (ASCII character 28) --左矢印
					delay 1 --アラートが出るまで少し時間がかかるので待つ
					keystroke return --アラートに対しOK（return）
				else
					--プロジェクタモードではないなら
					--"デフォルトに戻す"ボタンを押す
					click button "デフォルトに戻す" of tab group 1 of window "省エネルギー"
				end if
				
				--"バッテリー"ラジオボタンを押す
				click radio button "バッテリー" of tab group 1 of window "省エネルギー"
				delay 0.1
				
				if projectorMode then
					--プロジェクタモードなら
					--スライダ値を62分ぐらいに
					set value of slider 1 of tab group 1 of window "省エネルギー" to 550
					--値が保存されないので、キーを使ってスライダを動かす
					delay 0.1
					keystroke (ASCII character 28) --左矢印
					delay 0.1
					keystroke return
				else
					--プロジェクタモードではないなら
					--"デフォルトに戻す"ボタンを押す
					click button "デフォルトに戻す" of tab group 1 of window "省エネルギー"
				end if
				
			end tell
		end tell
		
	else
		
		tell application "System Preferences"
			activate
			set current pane to pane "com.apple.preference.universalaccess"
			display dialog "UI element scripting is not enabled."
		end tell
	end if
end tell


--
--次にスクリーンセーバを切り替える
--

tell application "System Preferences"
	reveal anchor "DesktopPref" of pane id "com.apple.preference.desktopscreeneffect"
	activate
	delay 1 --paneが切り替わるまで時間かかるので待つ
	--アンカー名称取得コード --
	--set current pane to pane "com.apple.preference.desktopscreeneffect"
	--get the name of every anchor of pane "com.apple.preference.desktopscreeneffect"
	--アンカー名称取得コード --
end tell

tell application "System Events"
	if UI elements enabled then
		
		tell application "System Events"
			tell process "System Preferences"
				--"スクリーンセーバ"ボタンを押す
				click radio button "スクリーンセーバ" of tab group 1 of window 1
				delay 1 --ラジオボタン押してから切り替わるまで時間かかるので待つ
				
				if projectorMode then
					--プロジェクタモードなら"30分"を選ぶ
					tell pop up button 1 of tab group 1 of window 3
						click
						delay 0.1
						click menu item "30分" of menu 1
					end tell
				else
					--プロジェクタモードでないなら"2分"を選ぶ
					tell pop up button 1 of tab group 1 of window 3
						click
						delay 0.1
						click menu item "2分" of menu 1
					end tell
				end if
				
			end tell
		end tell
		
	else
		
		tell application "System Preferences"
			activate
			set current pane to pane "com.apple.preference.universalaccess"
			display dialog "UI element scripting is not enabled."
		end tell
	end if
end tell



return input
~~~


### システム環境設定で、appに実行許可を与える

システム環境設定 > セキュリティとプライバシー > プライバシー > アクセシビリティ
で、該当アプリのチェックボックスにチェック


### Spotlightで起動

command + space > Tog　ぐらいまで打てば自動補完でアプリ起動


# その他覚書き

- delayを入れないと、スクリプトの挙動のほうが速くて、システム環境設定がついてこれない
- UIオブジェクトを取得するのがめっちゃめんどくさかった（xcodeでちまちま解析）

# 環境の記録
マシン｜MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
　　　　2.9 GHz Intel Core i5　16 GB 2133 MHz LPDDR3
OS｜macOS Mojave 10.12.2 （18C54）
ソフト｜Automator　2.9 (444.39)