我想在我的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键选择的亮度

07-27 19:11