我想在我的thinkpad x1上实现键盘背光的自动化,就像我以前在xps13中使用的一样。按任意键时,背光灯应打开,在一定的空闲时间(此处为30秒)后,背光灯应关闭。
我已经编写了这个基本的bash脚本,它工作得很好,尽管它通过xprintidle
每秒轮询一次,而且可能会消耗一些电池:
#!/bin/bash
function switch {
echo $1 > /sys/devices/platform/thinkpad_acpi/leds/tpacpi\:\:kbd_backlight/brightness
}
while (true); do
sleep 1
last=`xprintidle`
status=`cat /sys/devices/platform/thinkpad_acpi/leds/tpacpi\:\:kbd_backlight/brightness`
[ $last -lt 20000 -a $status -lt 2 ] && switch 2 && continue
[ $last -ge 20000 -a $status -eq 2 ] && switch 1 && continue
[ $last -ge 30000 -a $status -ge 1 ] && switch 0 && continue
done
我想知道是否可以使用一些非轮询方式,比如通过systemd或dbus。
提前谢谢你
最佳答案
我已经设法优化了脚本,这样当灯亮起时,它轮询的频率就大大降低了。我还包括dbus方法来检测状态和切换背光。为了使用qdbus,脚本必须以用户身份运行,因此需要对/sys/devices/../kbd_backlight/brightness
的写入权限。
#!/bin/bash
idletime=30000 # in milliseconds
prepath=/sys/class/leds/tpacpi\:\:kbd_backlight
sudo chmod a+w $prepath/brightness
function switch {
echo $1 > $prepath/brightness
# ALTERNATIVE WITH QDBUS: WORKS BUT SHOWS NOISY OVERLAY ICON
#qdbus local.org_kde_powerdevil /org/kde/Solid/PowerManagement/Actions/KeyboardBrightnessControl setKeyboardBrightness $1
}
while (true); do
# BOTH THE FOLLOWING WORK FINE, BUT THE SECOND DONT WORK AS ROOT
#last=`xprintidle`
last=`qdbus org.kde.screensaver /ScreenSaver GetSessionIdleTime`
# BOTH THE FOLLOWING WORK FINE, BUT THE SECOND DONT WORK AS ROOT
status=`< $prepath/brightness`
#status=`qdbus org.kde.Solid.PowerManagement /org/kde/Solid/PowerManagement/Actions/KeyboardBrightnessControl keyboardBrightness`
val=`< $prepath/brightness_hw_changed`
[ $last -lt $idletime -a $status -lt $val ] && switch $val && sleep ${idletime}e-3 && continue #SWITCH ON
[ $last -ge $idletime -a $status -ge $val ] && switch 0 #SWITCH OFF
sleep 1
done
编辑:现在脚本跟踪用户用fn键选择的亮度