跳转至内容

键盘背光

来自 ArchWiki

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

可以通过安装 xev(来自 xorg-xev)或 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 可以根据制造商进行替换,例如联想(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

一些键盘制造商未被 brightnessctllightAUR 识别,但如果您正在运行 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 示例实现,需要 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