読者です 読者をやめる 読者になる 読者になる

ゆず日記

戦う Vimmer 兼 Dvorakユーザ 兼 Kinesisユーザ 兼 おぺらー が戦わないブログ

OS X maverics で Fn キーの機能を簡単に切り替えられるようにする

Mac AppleScript

やりたいこと

FTL では F1, F2, etc. のキーを多用するが, 普段は明暗/音量切替を多用する為, ファンクションキーのモードを簡単に切り替えたい.

f:id:Yuzuemon:20131122170542p:plain
この設定の切り替え.


AppleScript

アプリケーションでは既に Mac App Store - Palua があるが, 環境設定の切り替えだけなのでこれって AppleScript でも出来るよねーと思って書こうと思ったらこちらも既にあった.

--Check if GUI Scripting is Enabled
tell application "System Events"
    if not UI elements enabled then
        set UI elements enabled to true
    end if
end tell

--Enable/Disable "Use all F1, F2, etc. keys as standard function keys" option in Keyboard & Mouse Preference pane and close System Preferences
tell application "System Events"
    tell application "System Preferences"
        reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
    end tell
    click checkbox 1 of tab group 1 of window 1 of application process "System Preferences"
end tell
if application "System Preferences" is running then
    tell application "System Preferences" to quit
end if

osx - Enable/Disable Fn keys from the command line on the Mac - Stack Overflow

後はこの Script を簡単に呼び出せるようにすればいい.


Automator での実装

Quicksilver も Alfred も使っていないので, Spotlight + Automator での実装を行う.
まず Automator を起動し, Application として新しいワークフローを立ち上げる.

f:id:Yuzuemon:20131122165227p:plain



次に, Action の中から "Run AppleScript" を探し出し, 右ペインへドラッグ & ドロップする. ("AppleScript" などで検索するとすぐ見つかる.)

f:id:Yuzuemon:20131122165535p:plain



そして, テキストエリア内に先程のコードをちょっと短くした*1 以下の AppleScript コードを書き込む.

--Enable/Disable "Use all F1, F2, etc. keys as standard function keys" option in Keyboard Preference pane and close System Preferences
tell application "System Events"
	tell application "System Preferences"
		reveal anchor "keyboardTab" of pane "com.apple.preference.keyboard"
	end tell
	click checkbox 1 of tab group 1 of window 1 of application process "System Preferences"
end tell
if application "System Preferences" is running then
	tell application "System Preferences" to quit
end if

f:id:Yuzuemon:20131122174010p:plain
また今回は引数不要の為, テキストエリア下の Options 内の "Ignore this action's input" にチェックを入れる.
テスト実行すると, Dock 内の環境設定がちょっと起動した後にすぐ終了する筈. テスト実行の度に F1 等を押してみて Fn 機能が切り替わっているようなら成功.

テスト実行に失敗する場合

f:id:Yuzuemon:20131122173442p:plain
こんな感じのエラーが出た場合には, 環境設定から, Automator によるコントロールを許可する必要がある.

環境設定 > セキュリティとプライバシー > プライバシータブ から, アクセシビリティを選択し, Automator にチェックを入れる.
f:id:Yuzuemon:20131122171130p:plain

この状態でもう一度実行すると, キチンと動作するようになる.

Automator Application の書き出しと実行

Automator 上での動作が確認できたら, テキトーにファイル名を付けて保存する. (自分が呼び出し易い名前にしとく. ここでは "change_fn_mode" とした.)
保存したら今度は spotlight から呼び出して実行してみる.
f:id:Yuzuemon:20131122171841p:plain

きっとまたエラーが出るか, もしくは Accessibility の設定を促す画面が出る.
f:id:Yuzuemon:20131122173442p:plain
f:id:Yuzuemon:20131122173457p:plain

再度, 環境設定 > セキュリティとプライバシー > プライバシータブ から, アクセシビリティを選択し, 今度は自分が作った Application ファイル名にチェックを付ける.
f:id:Yuzuemon:20131122172936p:plain


これで Application も動作するようになる筈だ.

自分がハマった所

  • Mavericks になって Accessibility の設定箇所が変わった.
  • Automator Application内のコードや設定を変更する度に, System Preferences 内の Accessibility のチェックを付け直さないと再度エラーが出る.
    • Debugで設定を変更する度にエラーが出て困った.
  • AppleScriptの楽な呼び出し方が未だに分からない.
    • 今回の実装は, はじめは QuickSilver や Alfred で試したのだが上手く行かなかった. 多分その際にも Accessibility 周りで引っ掛かってたのだと思う.
    • Alfred は PowerPack を導入しないとフルに使えない気がしつつ, 尚且つそこまでメリットをまだ感じられないのでイマイチ気が乗らない.

OS X: GUI Scripting - Accessibility Access Controls

*1:Mavericks では UI elements enabled を Script 内で有効に出来ない模様.