笔记本屏幕亮度的调节十分方便,使用 acpi 模块提供的硬件接口 /sys/class/backlight
即可进行,我常用的软件包xbacklight
就是基于此
但是外接显示器的亮度调节不像笔记本屏幕那样方便,需要通过 DDC/CI 协议与 i2c 设备进行通信来实现
软件包
配置
为了检测到 i2c 设备,需要载入内核模块 i2c-dev
- 创建 /etc/modules-load.d/i2c.conf,在其中写下:
i2c-dev
这样 Linux 在启动时会自动加载 i2c-dev 模块
- 此时 i2c 设备只有 root 用户才能访问,为了使用普通账户访问,需要将用户添加到 i2c 组
sudo groupadd --system i2c
sudo usermod <user-name> -aG i2c
命令
查看Feature 10
的功能
ddcutil capabilities | grep "Feature: 10"
# output
# Feature: 10 (Brightness)
查询当前亮度
ddcutil getvcp 10 | grep -i 'Brightness' | awk '{print $9}' | sed 's/,$//'
升高/降低当前亮度
current_backlight=$(ddcutil getvcp 10 | grep -i 'Brightness' | awk '{print $9}' | sed 's/,$//')
ddcutil setvcp 10 $((current_backlight + 20))
ddcutil setvcp 10 $((current_backlight - 20))
备注
ddcutil 指令是有些耗时的,如果使用 dwm 这类窗口管理器,在自己编写亮度显示脚本的时候不要一直使用 ddcutil getvcp
来获取亮度,会造成卡顿,正确的做法是,开机时获取一次亮度,并导出成环境变量,然后每次都从环境变量中读取亮度,然后更改亮度的同时,更改环境变量,这样就可以避免卡顿