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

イメージに染まるまで……

Mac,iOSなどAppleの製品についての記事や、セキュリティだったりGTDの記事を書いています。

OSXの画面スリープ制御アプリ、CaffeineをApple Scriptで制御する

Mac AppleScript

イントロダクション

OSXの画面のスリープ防止アプリといえば、Caffeineは定番アプリのひとつになっています。

Caffeine

Caffeine

  • Lighthead Software
  • ユーティリティ
  • 無料

メニューバーに表示されるコーヒーカップをクリックすれば、すぐに画面のスリープを妨害してくれます。

そんな便利なCaffeineですが、狭い画面では困ったことが起こります。

それは、メニューバーのアイテムが隠れてしまうこと。

Caffeineの状態を確認したり、ON/OFFを切り替えるのが面倒になってしまいます。

私は、メニューバーで隠れてしまうアイテムを表示させるときには、ザリガニが見ていた…。さんが制作されたMinimumMenuをよく利用させていただいています。(公開されたときの記事はこちら)

MinimumMenuは、全てのメニューバーのアイテムを見えるようにしてくれる、素晴しいアプリです。特に、画面のサイズが小さくて困っている場合には本当にありがたいです。

ただ、それでも面倒に思ってしまうことがあります。状態を確認したり、ON/OFFを切り替えたり……

そこで、Caffeineにアクティブな状態か否か、それを受けて有効あるいは無効にするかを尋ねるApple Scriptを作ってみることにしました。

CaffeineがApple Scriptに対応していることは、何の気なしにApple Scriptのライブラリに読み込ませたときに気付いていたので、早速とりかかりましょう。

スクリプト完成まで

まず、Caffeineには3つのApple Scriptに対応したコマンドがあります。

ON/OFFさせることが出来るturn onturn offです。それと、現在のCaffeineが有効か否かを知らせてくれるactiveの3つです。

ちょっと、試してみましょう。

tell application "Caffeine"
    turn on
end tell

これで、アクティブになりました。

tell application "Caffeine"
   turn off
end tell

これで、CaffeineがOFFになります。

tell application "Caffeine"
    active
end tell

これで、Apple Scriptの結果の部分を見ると、CaffeineがONのときはtrue

f:id:nya-0:20140810101500p:plain

OFFのときはfalseが返されることが分かります。

f:id:nya-0:20140810101514p:plain

というわけで、activeの返答によって、場合分けできることが判明しました。

まずはactiveの返答による場合分けのスクリプトを組んでみます。

tell application "Caffeine"
active

set cafst to active
    if cafst is false then
    display alert "Caffeineは有効になっていません"

    else
    display alert "Caffeineは動作中です"
    end if

end tell

これで雛形が出来ました。

f:id:nya-0:20140810101540p:plain

これを、display alertではなくdisplay dialogを利用して、OKに相当する部分をturn onあるいはturn offを走らせるように変えれば、完成となります。

ただ、私自身は今までダイアログに触るとコマンドが走るというスクリプトを書いたことがありません。

困りました……今までのスクリプトを見ても、全くヒントになりません。

こんなときは、Apple Scriptの、Appleディベロッパーサイトにあるヘルプを見ればヒントがあるかも?

display dialogから探してみると……

あった!

AppleScript Langage Guide: Command Referenceのdisplay dialogの説明に希望のものが載っていました。こちらですね。

見ると、ダイアログの前で色々と弄っています。display dialogの選択をsetで囲むことで、ボタンの押したあとの動作を設定していました。

というわけで、このスクリプトもボタンのダイアログの前と、ボタンもそれらしく弄ってみることにしました。

tell application "Caffeine"
-- Caffeineの状態を尋ねる
    active

    set cafst to active
-- Caffeineの状態を尋ねる際に利用したactiveをcafstとして設定
-- active=cafstがfalseの場合
        if cafst is false then
        set dialogResult to display dialog "Caffeineは有効になっていません。有効にしますか?" with icon note buttons {"有効にしない", "有効にする"} default button "有効にする" cancel button "有効にしない"
        -- 有効にするの場合、CaffeineをONにするturn onを走らせる
            if button returned of dialogResult is "有効にする" then
            turn on
            end if


    else
-- cafstがfalseでない場合=Caffeineが有効(true)
        set dialogResult to display dialog "Caffeineは有効です。無効にしますか?" with icon note buttons {"有効のままにする", "無効にする"} default button "無効にする" cancel button "有効のままにする"
        -- 無効にするの場合、CaffeineをOFFにするturn offを走らせる
            if button returned of dialogResult is "無効にする" then
            turn off
            end if
    end if
end tell

出来た!

これで、Caffeineのアイコンを見なくても、Caffeineを切り替えることができるようになりました。

私はQuicksilverを利用して、Apple Scriptを呼び出します。

f:id:nya-0:20140810101559p:plain

保存する形式をアプリケーションにすれば、Dockに登録しておくだけで利用出来るはずです。

  • Caffeineが有効の場合

f:id:nya-0:20140810101613p:plain

「無効にする」を押せば、Caffeineが無効になります。

  • Caffeineが有効でない場合

f:id:nya-0:20140810101625p:plain

「有効にする」を押せば、Caffeineが有効になります。

[2014/08/30追記]

そもそも起動していない場合もあるとおもったので、最初にCaffeineを起動するようにしてみました。

tell application "Caffeine"activeの間に以下の行を入れるだけです。

activate --起動
delay 2 --一応少し待ってみる

以上です。Caffeineがすでに起動していてもエラーはありませんので、ご心配なく。