给外接显示器增加环境光亮度调节

macOS会根据环境光的强弱,自动调节显示器亮度,但如果有外接显示器,亮度则并不会被随之调整。从白天工作到晚上,两个屏幕的亮度差距会越来越大。

在网上找了一些方案开源和商业的方案,都不是很满意,主要原因是它们都会占用顶部一个menu位,而对于一个系统自动调节的功能来说,并没有用鼠标单击这个menu的必要。还有一些并不太需要的功能,比如根据调节颜色和色温等。另外一些应用,同步亮度居然还需要订阅。

这个方案很简单,只使用了AppleScriptShell,优点如下:

  • 自动调节亮度
  • 开机自动启动
  • 不占用dock和menu item

当然因为能力有限,还有一些改进的空间:

  • 更优雅的方式获取系统当前亮度,目前用的是两个正则表达式
  • 通过监听系统调节亮度的事件,而不是30秒的定时去监控

制作流程

前提

  • 需要显示器支持ddc/ci.
  • 需要用ddctl提供的调节亮度工具:
brew install ddcctl

开始

脚本制作

打开Script Editor编辑器,复制下面代码,保存为AutoBrightness,:

on idle --设置定时任务
	set brightness_num to do shell script "ioreg -c AppleBacklightDisplay | grep -oE '(?:\"brightness\").*?(\"value\").*?},' | grep -oE '\"value\"=(\\d{1,5})'|awk -F= '{print $2}'" --获取当前系统亮度,能力实在有限,只能通过两个正则获取,help needed.
	set brightness_num to (brightness_num / 65535) * 100 --单位转换
	do shell script "/usr/local/bin/ddcctl -d 1 -b " & brightness_num --调整亮度, 需要确认外接显示器是在display(-d) 1
	return 30 --每30秒运行一次
end idle

保存时,文件格式选择 Application,否则 timer 不会触发。

开机自动启动

System Preferences -> User & Groups -> (tab)Login Items -> 添加AutoBrightness

隐藏应用图标

  1. 右键点击 AutoBrightness.app -> Show Package Contents -> Contents
  2. 打开info.plist
  3. 在第一个<dict></dict>中插入下面代码,保存退出。
    <key>LSUIElement</key>
    <string>1</string>

EOF