键盘背光
笔记本电脑上的键盘背光亮度级别控制通常分为两类,具体取决于硬件
- 背光完全由笔记本电脑固件处理,操作系统看不到任何操作(例如 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