键盘背光
笔记本电脑上的键盘背光亮度级别控制通常分为两类,具体取决于硬件
- 背光完全由笔记本电脑固件处理,操作系统看不到任何操作(例如 HP EliteBook 745 G4#功能键),
- 快捷键绑定必须由操作系统处理,分为两个子类别
- 固件完全不参与,原始按键序列留给操作系统处理(例如 Toshiba Portege Z30-A#键盘背光控制 中描述的情况)
- 快捷键绑定发送特定的
XF86键符(例如 ASUS ROG STRIX G17 (2022)#功能键 中描述的情况)。
可以通过安装 xev (来自 xorg-xev) 或 wev (来自 wev) 然后按下背光控制热键来测试
- 如果你看到 XF86 键符,例如
XF86KbdBrightnessUp,那么你属于“通过键符由操作系统处理”类别。 - 如果你看到原始按键序列,例如
key: serial: 4887; time: 8232514; key: 55; state: 1 (pressed) sym: v (118), utf8: 'v',那么你属于“通过原始序列由操作系统处理”类别。 - 如果你什么都没看到,那么你属于“由固件处理”类别。
你的笔记本电脑属于哪个类别将影响你用来控制背光的方法。
纯粹由固件控制的热键应该始终有效,并且日常使用无需配置。这种情况会使脚本编写变得复杂,因为没有事件可以基于其构建。
相比之下,任何由操作系统控制的场景都允许更轻松地编写脚本,但缺点是在运行的操作系统之外缺乏背光控制。
控制背光
即使亮度由固件控制,你也可以通过编程方式调整级别。有很多方法可以管理亮度级别,并且有不同的辅助工具可以完成此操作,例如 brightnessctl 或 lightAUR。
sysfs
sys 伪文件系统公开了键盘背光的接口。可以通过读取 /sys/class/leds/vendor::kbd_backlight/brightness 来获取当前亮度级别,其中 vendor 可以根据制造商替换,例如 Lenovo (ThinkPads) 为 tpacpi,ASUS 为 asus,Dell 为 dell。例如,要获取最大亮度级别
$ cat /sys/class/leds/vendor::kbd_backlight/max_brightness
将亮度设置为 1
# echo 1 > /sys/class/leds/vendor::kbd_backlight/brightness
当使用 brightnessctl 时,你可以使用 brightnessctl --list 获取可用亮度控制的列表,然后显示 kbd 背光信息
$ brightnessctl --device='vendor::kbd_backlight' info
这将显示绝对和相对当前值以及最大绝对值。要设置不同的值
$ brightnessctl --device='vendor::kbd_backlight' set 1
xset
某些键盘制造商无法被 brightnessctl 或 lightAUR 识别,但如果你正在运行 Xorg,则可以使用 xorg-xset 来控制其灯光。
第一个参数 led 打开 led,-led 关闭它,NUMBER 参数接受 1 到 32 的整数(每个数字对应于你系统中的一个 led,键盘通常似乎是数字 3),或者 'on' 和 'off'(on 将打开所有灯,off 将关闭所有灯)。
打开灯
$ xset led NUMBER
关闭灯
$ xset -led NUMBER
D-Bus
你可以通过 D-Bus 接口控制你的计算机键盘背光。使用它的好处是不需要修改设备文件,并且它与供应商无关。
以下是 Python 中的一个示例实现,需要安装 upower 和 python-dbus。然后你可以映射你的键盘快捷键来运行 /usr/local/bin/kb-light.py + x 和 /usr/local/bin/kb-light.py - x,以将键盘背光级别增加和减少 x 个量。
- 你应该尝试 x =
1来确定键盘背光级别的限制。 - 不要忘记使脚本可执行。
/usr/local/bin/kb-light.py
#!/usr/bin/env python3
import dbus
import sys
def kb_light_set(delta):
bus = dbus.SystemBus()
kbd_backlight_proxy = bus.get_object('org.freedesktop.UPower', '/org/freedesktop/UPower/KbdBacklight')
kbd_backlight = dbus.Interface(kbd_backlight_proxy, 'org.freedesktop.UPower.KbdBacklight')
current = kbd_backlight.GetBrightness()
maximum = kbd_backlight.GetMaxBrightness()
new = max(0, min(current + delta, maximum))
if 0 <= new <= maximum:
current = new
kbd_backlight.SetBrightness(current)
# Return current backlight level percentage
return 100 * current / maximum
if __name__ == '__main__':
if len(sys.argv) == 2 or len(sys.argv) == 3:
if sys.argv[1] == "--up" or sys.argv[1] == "+":
if len(sys.argv) == 3:
print(kb_light_set(int(sys.argv[2])))
else:
print(kb_light_set(17))
elif sys.argv[1] == "--down" or sys.argv[1] == "-":
if len(sys.argv) == 3:
print(kb_light_set(-int(sys.argv[2])))
else:
print(kb_light_set(-17))
else:
print("Unknown argument:", sys.argv[1])
else:
print("Script takes one or two argument.", len(sys.argv) - 1, "arguments provided.")
或者使用 bash,可以使用以下命令获取当前亮度
$ dbus-send --type=method_call --print-reply=literal --system --dest="org.freedesktop.UPower" /org/freedesktop/UPower/KbdBacklight org.freedesktop.UPower.KbdBacklight.GetBrightness
将亮度设置为特定值
$ dbus-send --system --type=method_call --dest="org.freedesktop.UPower" "/org/freedesktop/UPower/KbdBacklight" "org.freedesktop.UPower.KbdBacklight.SetBrightness" int32:value
在 GNOME 上
以下命令可以从终端运行或映射到快捷键。
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Keyboard.StepUp $ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Keyboard.StepDown
在 MATE 上
如果你使用 MATE 环境,你可能会厌倦在登录、解锁屏幕或唤醒变暗的显示器时反复点亮键盘背光。以下设置可防止在任何操作期间自动点亮。唯一的触发因素仍然是插入适配器和重新启动。之后,你只能通过热键(例如 ThinkPad Fn + 空格键)控制键盘背光。
要防止自动点亮,只需按如下方式编辑文件 /usr/share/dbus-1/system.d/org.freedesktop.UPower.conf(两次出现“deny”)
/usr/share/dbus-1/system.d/org.freedesktop.UPower.conf
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Only root can own the service -->
<policy user="root">
<allow own="org.freedesktop.UPower"/>
</policy>
<policy context="default">
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.DBus.Introspectable"/>
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.DBus.Peer"/>
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.freedesktop.UPower.Device"
send_interface="org.freedesktop.DBus.Properties"/>
<deny send_destination="org.freedesktop.UPower.KbdBacklight"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.freedesktop.UPower.Wakeups"
send_interface="org.freedesktop.DBus.Properties"/>
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.UPower"/>
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.UPower.Device"/>
<deny send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.UPower.KbdBacklight"/>
<allow send_destination="org.freedesktop.UPower"
send_interface="org.freedesktop.UPower.Wakeups"/>
</policy>
</busconfig>
故障排除
休眠后恢复
在某些笔记本电脑上(例如 Dell XPS 15),背光在休眠后始终关闭。为了恢复之前的亮度级别,你可以使用以下服务。
~/.config/systemd/system/keyboard-brightness.service
[Unit] Description=Set keyboard brightness after resume StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=/sys/class/leds/vendor::kbd_backlight/ ExecStart=bash -c "cat brightness >> /var/tmp/kbd_brightness_current" ExecStop=bash -c "sleep 3s && cat /var/tmp/kbd_brightness_current > brightness && rm /var/tmp/kbd_brightness_current" [Install] WantedBy=sleep.target