键盘背光

来自 ArchWiki

笔记本电脑上的键盘背光亮度级别控制通常分为两类,具体取决于硬件

可以通过安装 xev (来自 xorg-xev) 或 wev (来自 wev) 然后按下背光控制热键来测试

  • 如果你看到 XF86 键符,例如 XF86KbdBrightnessUp,那么你属于“通过键符由操作系统处理”类别。
  • 如果你看到原始按键序列,例如 key: serial: 4887; time: 8232514; key: 55; state: 1 (pressed) sym: v (118), utf8: 'v',那么你属于“通过原始序列由操作系统处理”类别。
  • 如果你什么都没看到,那么你属于“由固件处理”类别。

你的笔记本电脑属于哪个类别将影响你用来控制背光的方法。

纯粹由固件控制的热键应该始终有效,并且日常使用无需配置。这种情况会使脚本编写变得复杂,因为没有事件可以基于其构建。

相比之下,任何由操作系统控制的场景都允许更轻松地编写脚本,但缺点是在运行的操作系统之外缺乏背光控制。

控制背光

即使亮度由固件控制,你也可以通过编程方式调整级别。有很多方法可以管理亮度级别,并且有不同的辅助工具可以完成此操作,例如 brightnessctllightAUR

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

某些键盘制造商无法被 brightnessctllightAUR 识别,但如果你正在运行 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 中的一个示例实现,需要安装 upowerpython-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 上

本文或本节需要改进语言、wiki 语法或风格。请参阅 Help:Style 以供参考。

原因:描述非正式且不清楚。与 MATE 无关。(在 Talk:Keyboard backlight 中讨论)

如果你使用 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