ディスプレイの輝度変更を行うAppleScriptです。
AppleScriptにディスプレイの輝度変更を行う機能はないので、GUI Scripting経由で(画面上のGUI部品を野蛮に操作して)変更するか、あるいは「他の方法」を採用することになります。
本Scriptは「他の方法」をとってみたものです。画面の輝度変更については、そのようなニーズがあり、割とまともにOSに機能が実装されていることもあり、IOKitを呼び出して変更している例がいろいろ見つかります(Objective-Cとかで)。そういったものをFramework化してAppleScriptから呼び出すか、あるいはコマンドライン上で動作するプログラムをAppleScript内に入れて呼び出すか、といったところになります。
Github上で探し物をしてみたところ、nriley氏の「brightness」というツールがコマンドライン上から呼び出せるようになっており、AppleScriptのバンドル内に突っ込んで呼び出しやすそうでした。
そこで、実際にAppleScriptバンドル書類中に突っ込んで、いい感じに呼び出せるように最低限の機能を実装してみました。ディスプレイの接続数の確認(getDisplayNumber)、指定ディスプレイの現在の輝度確認(getBrightNess)、そして指定ディスプレイの輝度設定(setBrightNess)です。
–> Download displayBrightness.scptd (Script Bundle with brightness binary in its bundle)
ディスプレイ番号は1から始まるものとして扱っています。輝度は0.0〜1.0(1.0が一番明るい)までの値を指定します。
一応、brightnessユーティリティでは複数のディスプレイが接続された状態を前提に処理しているのですが、どうせ輝度変更ができるのはMacBook ProやiMacなどの内蔵ディスプレイだけです。外部接続したディスプレイの輝度は変更できません。
本Scriptのようなお気楽実装だと問題になってくるのが、
(1)デスクトップマシン(MacPro、Mac miniなど)で外部ディスプレイを接続していない(ヘッドレス運用)の場合への対処
(2)ノート機+iMac/iMac Proで、メインディスプレイを本体内蔵ディスプレイ「以外のもの」に指定している場合への対処
(3)ノート機で、Lid Closed Mode運用している(本体を閉じて外部ディスプレイをつないで使っている)状態への対処
などです。本Scriptはそこまで厳密な対応を行っていません。ただ、実用上はこのぐらいで問題はなさそうだ、という「割り切り」を行って手を抜いています。
各条件でテストを行って「使える」という確証が得られたら、sdef(AppleScript用語辞書)をつけたライブラリにでもするとよさそうです。
また、本Script中に同梱しているbrightnessツールの実行ファイルはNotarizationを通していないため、2020年2月3日を過ぎると10.15.2以降のmacOSで何らかのダイアログが出て実行をキャンセルされる可能性がありますが、正直なところmacOS 10.15.xは「バグが多すぎ」「実用性なし」と判断。macOS 10.15.xは自分としては「パス」するつもりなので、現時点において対処する必要性を感じません(仕事で納品するバイナリについては全力で対処しますが)。
AppleScript名:displayBrightness.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/01/04 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions set dRes to getDisplayNumber() of me –> 1 set bRes to getBrightNess(1) of me –> 0.763672 set sRes to setBrightNess(1, 0.7) of me on getDisplayNumber() set myPath to POSIX path of (path to me) set cmdPath to myPath & "Contents/Resources/brightness" set aRes to do shell script quoted form of cmdPath & " -l" set pList to paragraphs of aRes return (length of pList) div 2 end getDisplayNumber on getBrightNess(displayNumber as integer) set dRes to getDisplayNumber() of me if dRes < displayNumber then error "Your parameter is too large (" & "there is " & (dRes as string) & " display only)." set targDispNumber to displayNumber – 1 set targString to "display " & (targDispNumber as string) & ": brightness " set myPath to POSIX path of (path to me) set cmdPath to myPath & "Contents/Resources/brightness" set aRes to do shell script quoted form of cmdPath & " -l" repeat with i in (paragraphs of aRes) set j to contents of i if j begins with targString then set aOffset to offset of targString in j set resStr to text (aOffset + (length of targString)) thru -1 of j return resStr end if end repeat error "Display’s brightness information is not present" end getBrightNess on setBrightNess(displayNumber as integer, targBrightnewss as real) set dRes to getDisplayNumber() of me if dRes < displayNumber then error "Your parameter is too large (" & "there is " & (dRes as string) & " display only)." set targDispNumber to displayNumber – 1 set targString to "display " & (targDispNumber as string) & ": brightness " set myPath to POSIX path of (path to me) set cmdPath to myPath & "Contents/Resources/brightness" set aRes to do shell script quoted form of cmdPath & " -l" set hitF to false repeat with i in (paragraphs of aRes) set j to contents of i if j begins with targString then set hitF to true exit repeat end if end repeat if hitF = false then error "There is no display (" & (displayNumber as string) & ")" set bRes to do shell script quoted form of cmdPath & " " & (targBrightnewss as string) set curBright to getBrightNess(displayNumber) of me –結果を評価する if (targBrightnewss as real) is not equal to (curBright as real) then return false else return true end if end setBrightNess |