键盘背光
笔记本电脑的键盘背光亮度级别控制通常分为两大类,具体取决于特定硬件。
- 背光完全由笔记本电脑固件处理,操作系统看不到任何操作(例如 HP EliteBook 745 G4#Function keys),
- 按键组合必须由操作系统处理,分为两个子类。
- 固件完全不参与,原始按键序列留给操作系统处理(例如 Toshiba Portege Z30-A#Keyboard backlight control 中描述的内容)。
- 按键组合发送一个特定的
XF86键符号(例如 ASUS ROG STRIX G17 (2022)#Function keys 中描述的那样)。
可以通过安装 xev(来自 xorg-xev)或 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 可以根据制造商进行替换,例如联想(ThinkPads)为 tpacpi,华硕为 asus,戴尔为 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
您可以使用脚本来切换键盘背光,每次调用切换一次,例如:
#!/bin/bash
leds_path="/sys/class/leds"
for dir in "$leds_path"/input*[0-9]::scrolllock; do
if [ -d "$dir" ]; then
FILE="$dir/brightness"
CONTENT=$(cat "$FILE")
if [ "$CONTENT" = "0" ]; then
echo "1" > "$FILE"
elif [ "$CONTENT" = "1" ]; then
echo "0" > "$FILE"
fi
exit 0
fi
done
xset
一些键盘制造商未被 brightnessctl 或 lightAUR 识别,但如果您正在运行 Xorg,则可以使用 xorg-xset 来控制其灯光。
第一个参数 led 打开 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