#keyboard #backlight #laptop #thinkpad

app keyboard-backlightd

笔记本电脑键盘背光超时守护进程

12个版本

0.1.11 2024年7月14日
0.1.10 2024年7月13日
0.1.9 2024年4月2日
0.1.8 2024年2月9日
0.1.1 2023年2月19日

#45 in 硬件支持

GPL-3.0-only

34KB
513

keyboard-backlightd

[ crates.io ] [ lib.rs ] [ AUR ]

当空闲时关闭键盘背光的守护进程。

特性

  • 体积小,依赖最少,编译速度快。
  • 支持使用常规键调整键盘背光(通过监视硬件是否更改了亮度并相应调整)。

局限性

  • 仅测试于现代ThinkPad。
  • 自动检测很少,您需要配置您的输入设备
  • 仅支持Linux。使用一些非常低级的API。

安装

虽然这个包可以用cargo构建,就像大多数Rust包一样,但它使用make进行安装。这是因为cargo无法安装所需的附加文件:配置文件和systemd单元文件。

为什么需要这个?因为这个是一个系统守护进程,它需要全局安装并作为root运行(以便能够访问/dev/sys中的某些文件)。

因此,您最好使用您的发行版包管理器安装此软件。Arch Linux的软件包可在AUR上获得(由本软件包的作者维护)。

如果您不使用Arch Linux,我将非常感激您能为此创建一个软件包!但是,如果您不想创建软件包,可以将以下内容安装到/usr/local

# NOTE! Not recommended! This will overwrite your config file for this
# program, which sucks if you customised it. Use your package manager
# instead!
make
sudo make install

警告!

此程序将监控您的按键,但仅用于检测您何时按下键。然而,它并不关心您按了什么键。代码唯一检查的是LED状态是否改变,如果是,则忽略(否则,在外部键盘上按下Caps Lock会点亮键盘背光)。

总之:此代码的工作方式与键盘记录器非常相似,但它是良性的。但您应该先阅读代码,以确保您信任我!(这通常是一个好主意!)

执行此功能的代码位于handlers.rs中,在mod ev_dev部分。

识别输入设备和LED

您可能希望这个守护进程在以下任何一种情况下开启键盘背光:

  • 键盘按键
  • 特殊的Fn键组合?
  • 触摸板
  • Trackpoint

最简单的方法是运行sudo evtest(您可能需要安装一个如evtest的包)。这将给出如下输出

$ sudo evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:  Sleep Button
/dev/input/event1:  Lid Switch
/dev/input/event10: ThinkPad Extra Buttons
/dev/input/event11: HDA Intel PCH Mic
/dev/input/event12: HDA Intel PCH Headphone
/dev/input/event13: HDA Intel PCH HDMI/DP,pcm=3
/dev/input/event14: HDA Intel PCH HDMI/DP,pcm=7
/dev/input/event15: HDA Intel PCH HDMI/DP,pcm=8
/dev/input/event16: Synaptics TM3276-022
/dev/input/event17: TPPS/2 IBM TrackPoint
/dev/input/event18: Integrated Camera: Integrated C
/dev/input/event19: MX Vertical Mouse
/dev/input/event2:  Power Button
/dev/input/event3:  AT Translated Set 2 keyboard
/dev/input/event4:  Video Bus
/dev/input/event5:  Video Bus
/dev/input/event6:  Microsoft Comfort Curve Keyboard 3000
/dev/input/event7:  Microsoft Comfort Curve Keyboard 3000
/dev/input/event8:  Raydium Corporation Raydium Touch System
/dev/input/event9:  PC Speaker
Select the device event number [0-19]:

这可以让您识别Linux所看到的输入设备。然而,这并不是您想要的,因为编号在重启后可能不会保持稳定。

接下来您需要找到一个稳定的ID

$ ls -l /dev/input/by-id                                
lrwxrwxrwx 1 root root  9  7 feb 16.31 usb-Microsoft_Comfort_Curve_Keyboard_3000-event-kbd -> ../event6
lrwxrwxrwx 1 root root  9  7 feb 16.31 usb-Microsoft_Comfort_Curve_Keyboard_3000-if01-event-kbd -> ../event7
lrwxrwxrwx 1 root root  9  7 feb 16.31 usb-Raydium_Corporation_Raydium_Touch_System-event-if00 -> ../event8
lrwxrwxrwx 1 root root 10  7 feb 16.31 usb-SunplusIT_Inc_Integrated_Camera-event-if00 -> ../event18
$ ls -l /dev/input/by-path
lrwxrwxrwx 1 root root  9  7 feb 16.31 pci-0000:00:14.0-usb-0:10:1.0-event -> ../event8
lrwxrwxrwx 1 root root  9  7 feb 16.31 pci-0000:00:14.0-usb-0:1:1.0-event-kbd -> ../event6
lrwxrwxrwx 1 root root  9  7 feb 16.31 pci-0000:00:14.0-usb-0:1:1.1-event-kbd -> ../event7
lrwxrwxrwx 1 root root 10  7 feb 16.31 pci-0000:00:14.0-usb-0:8:1.0-event -> ../event18
lrwxrwxrwx 1 root root 10  7 feb 16.31 pci-0000:00:1f.4-event-mouse -> ../event16
lrwxrwxrwx 1 root root  9  7 feb 16.31 pci-0000:00:1f.4-mouse -> ../mouse1
lrwxrwxrwx 1 root root 10  7 feb 16.31 pci-0000:00:1f.4-serio-2-event-mouse -> ../event17
lrwxrwxrwx 1 root root  9  7 feb 16.31 pci-0000:00:1f.4-serio-2-mouse -> ../mouse2
lrwxrwxrwx 1 root root  9  7 feb 16.31 platform-i8042-serio-0-event-kbd -> ../event3
lrwxrwxrwx 1 root root  9  7 feb 16.31 platform-pcspkr-event-spkr -> ../event9
lrwxrwxrwx 1 root root 10  7 feb 16.31 platform-thinkpad_acpi-event -> ../event10

这里,如果您的设备有by-id映射,您应该优先考虑它,尽管对于非USB设备,by-path可能也可以正常工作。

从上面的输出中,我们可以得出以下结论

设备 可读名称 编号 我们想要的路径
键盘 AT Translated Set 2键盘 3 /dev/input/by-path/platform-i8042-serio-0-event-kbd
特殊按钮 ThinkPad Extra Buttons 10 /dev/input/by-path/platform-thinkpad_acpi-event
触摸板 Synaptics TM3276-022 16 /dev/input/by-path/pci-0000:00:1f.4-event-mouse
Trackpoint TPPS/2 IBM TrackPoint 17 /dev/input/by-path/pci-0000:00:1f.4-serio-2-event-mouse
触摸屏 Raydium Corporation Raydium Touch System 8 /dev/input/by-id/usb-Raydium_Corporation_Raydium_Touch_System-event-if00

这些都是(对于这个笔记本电脑,ThinkPad T480)我们要监控的所有输入。

以下是一些识别这些信息的提示

  • 我见过的触摸板最常见的供应商是Synaptics和ALPS。
  • 您可以使用evtest检查按键是否发送到特定设备。

因此,我们的keyboard-backlightd命令行将如下所示

-i /dev/input/by-path/platform-i8042-serio-0-event-kbd \
-i /dev/input/by-path/platform-thinkpad_acpi-event \
-i /dev/input/by-path/pci-0000:00:1f.4-event-mouse \
-i /dev/input/by-path/pci-0000:00:1f.4-serio-2-event-mouse \
-i /dev/input/by-id/usb-Raydium_Corporation_Raydium_Touch_System-event-if00

然后您还需要确定键盘背光LED的路径。这要容易得多

$ ls -d /sys/class/leds/*kbd*
/sys/class/leds/tpacpi::kbd_backlight

在这种情况下,只有一个选项。这意味着我们想要

-l /sys/class/leds/tpacpi::kbd_backlight

配置

一旦找到所需的命令行参数,编辑/etc/conf.d/keyboard-backlightd以在systemd服务中使用它们。

然后启用并启动systemd服务,确保一切正常

systemctl enable keyboard-backlightd
systemctl start keyboard-backlightd

如果在启动期间服务无法启动,考虑在配置文件中增加WAIT。这可能有助于解决因较晚加载的内核模块导致在守护进程启动时设备节点不可用的问题。

故障排除

如果我按下手动控制背光的键,键盘背光就不再开启

这是故意为之。守护进程(在支持的笔记本电脑上)监视键盘背光的更改。这可能是其他软件或用户按下一些特定于笔记本电脑的键组合(通常涉及Fn键)。在2020年左右的现代ThinkPad上,这个键组合是Fn+Space,它会在“关闭”、“半亮”和“全亮”之间循环。

keyboard-backlightd将适应用户设置的设置,并在“关闭”和用户刚刚设置的任何亮度级别之间切换。如果您将其设置为关闭,那么您将得到在“关闭”和“关闭”之间的切换。只需再次按键组合即可在下一个亮度级别上恢复操作。

如果您真的不想使用它,可以使用标志 --no-adaptive-brightness 通知守护进程。但请先试试,您可能会逐渐喜欢它的。

最低支持的Rust版本(MSRV)

目前至少需要Rust 1.74.0,但如果需要,这可能会随时更改。MSRV的更改不被视为破坏性更改,因此即使在补丁版本中也可能更改。

许可证

keyboard-backlightd 在GPL 3.0(仅此,不是“或更高”)下发布。

依赖项

约8MB
约160K SLoC