在 i3 中设置绑定来控制键盘背光

在 i3 中设置绑定来控制键盘背光

为了我的i3 窗口管理器设置,我正在寻找一个命令行工具,类似于xbacklight,但控制键盘中 LED 的亮度。

基本上,我可以通过命令行设置 LED,但它需要 root:

# Light off the leds
echo 0 > /sys/class/leds/smc::kbd_backlight/brightness
# Light on the leds (full power)
echo 100 > /sys/class/leds/smc::kbd_backlight/brightness

我知道这是可能的,因为 Gnome3 对此有支持,但我不知道他们到底是如何进行的......

现在,我的~/.config/i3/config样子是这样的:

# screen brightness controls
bindsym XF86MonBrightnessUp exec xbacklight -inc 10
bindsym XF86MonBrightnessDown exec xbacklight -dec 10

# keyboard backlight controls
#TODO
# XF86KbdBrightnessUp
# XF86KbdBrightnessDown

那么,有没有一种工具,类似于xbacklight用键盘背光做比屏幕亮度相同的事情呢?如果该工具能够同时控制(屏幕和键盘),那就更好了。

答案1

乔治·克拉米达斯写了一个脚本它依赖于 dbus 和 UPower - 大多数桌面发行版都已启动并运行。

我建议使用它而不是写入的脚本,/sys/class/...因为它们需要以 root 身份运行 - 通过 sudo 或设置 SUID - 这是不好的安全实践。

基本用法很简单

kbdbacklight up
kbdbacklight down
kbdbacklight [ 0 | 1 | 2 | 3 ]

将其添加到 i3 配置中

# increase/decrease keyboard brightness
bindsym XF86KbdBrightnessUp exec kbdbacklight up
bindsym XF86KbdBrightnessDown exec kbdbacklight down 

脚本本身非常简单

#!/bin/sh
# By Giorgos Keramidas

# backlight_get
#       Print current keyboard brightness from UPower to stdout.
backlight_get()
{
    dbus-send --type=method_call --print-reply=literal --system         \
        --dest='org.freedesktop.UPower'                                 \
        '/org/freedesktop/UPower/KbdBacklight'                          \
        'org.freedesktop.UPower.KbdBacklight.GetBrightness'             \
        | awk '{print $2}'
}

# backlight_get_max
#       Print the maximum keyboard brightness from UPower to stdout.
backlight_get_max()
{
    dbus-send --type=method_call --print-reply=literal --system       \
        --dest='org.freedesktop.UPower'                               \
        '/org/freedesktop/UPower/KbdBacklight'                        \
        'org.freedesktop.UPower.KbdBacklight.GetMaxBrightness'        \
        | awk '{print $2}'
}

# backlight_set NUMBER
#       Set the current backlight brighness to NUMBER, through UPower
backlight_set()
{
    value="$1"
    if test -z "${value}" ; then
        echo "Invalid backlight value ${value}"
    fi

    dbus-send --type=method_call --print-reply=literal --system       \
        --dest='org.freedesktop.UPower'                               \
        '/org/freedesktop/UPower/KbdBacklight'                        \
        'org.freedesktop.UPower.KbdBacklight.SetBrightness'           \
        "int32:${value}}"
}

# backlight_change [ UP | DOWN | NUMBER ]
#       Change the current backlight value upwards or downwards, or
#       set it to a specific numeric value.
backlight_change()
{
    change="$1"
    if test -z "${change}" ; then
        echo "Invalid backlight change ${change}."                    \
            "Should be 'up' or 'down'." >&2
        return 1
    fi

    case ${change} in
    [1234567890]|[[1234567890][[1234567890])
        current=$( backlight_get )
        max=$( backlight_get_max )
        value=$( expr ${change} + 0 )
        if test ${value} -lt 0 || test ${value} -gt ${max} ; then
            echo "Invalid backlight value ${value}."                  \
                "Should be a number between 0 .. ${max}" >&2
            return 1
        else
            backlight_set "${value}"
            notify-send -t 800 "Keyboard brightness set to ${value}"
        fi
        ;;

    [uU][pP])
        current=$( backlight_get )
        max=$( backlight_get_max )
        if test "${current}" -lt "${max}" ; then
            value=$(( ${current} + 1 ))
            backlight_set "${value}"
            notify-send -t 800 "Keyboard brightness set to ${value}"
        fi
        ;;

    [dD][oO][wW][nN])
        current=$( backlight_get )
        if test "${current}" -gt 0 ; then
            value=$(( ${current}  - 1 ))
            backlight_set "${value}"
            notify-send -t 800 "Keyboard brightness set to ${value}"
        fi
        ;;

    *)
        echo "Invalid backlight change ${change}." >&2
        echo "Should be 'up' or 'down' or a number between"           \
            "1 .. $( backlight_get_max )" >&2
        return 1
        ;;
    esac
}

if test $# -eq 0 ; then
    current_brightness=$( backlight_get )
    notify-send -t 800 "Keyboard brightness is ${current_brightness}"
else
    # Handle multiple backlight changes, e.g.:
    #   backlight.sh up up down down up
    for change in "$@" ; do
        backlight_change "${change}"
    done
fi

只需保存在您的某个地方PATH即可享受。我使用了这个名称kbdbacklight并在上面的示例和 i3 配置中使用了它,如果您的名称不同,请注意更新它们。

请注意,Giorgio 的脚本也使用了notify-send,因此请确保您安装了正确的软件包(libnotify-bin在 Debian 和 Ubuntu 上)或从脚本中注释/删除这些行。

答案2

使用light

bindsym XF86KbdBrightnessUp     exec light -k -A 10
bindsym XF86KbdBrightnessDown   exec light -k -U 10

目前它有 Arch 和 Fedora 的打包版本。但您始终可以轻松地从源代码构建 if 。在这里找到 git 存储库:https://github.com/haikarainen/light

答案3

你可以很容易地编写自己的。

创建两个 shell 脚本,其中包含上面路径中某处的 echo 行(/usr/local 是正常位置)。设置root拥有的权限755。然后编辑您的 sudoers 文件以允许它们以 root 身份运行,或者用于chmod +s将它们设置为 SUID。

顺便说一句,此类事情被认为是安全风险,因此请绝对确保权限设置正确。您不希望任何没有 root 权限的人能够编辑脚本,并且您不希望脚本使用任何输入。

添加对亮度级别标志的支持是微不足道的,但除非您是一位熟练的 shell 脚本编写者,否则我建议您不要使用它,因为代码中的错误将成为安全漏洞。

相关内容