linux中的键盘背光自动调光

linux中的键盘背光自动调光,linux,bash,systemd,dbus,Linux,Bash,Systemd,Dbus,我想在我的Thinkpad X1上自动设置键盘背光,就像我在旧的XPS13中使用的一样。在任何按键时,背光都应打开,在一定的空闲时间(此处为30秒)后,背光应关闭。 我已经编写了这个基本的bash脚本,虽然它每秒都通过xprintidle进行轮询,但运行良好,并且可能会耗尽一些电池: #!/bin/bash function switch { echo $1 > /sys/devices/platform/thinkpad_acpi/leds/tpacpi\:\:kbd_backli

我想在我的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
#/bin/bash
空闲时间=30000#毫秒
预路径=/sys/class/led/tpacpi\:\:kbd\u背光
sudo chmod a+w$预路径/亮度
功能开关{
回声$1>$prepath/亮度
#QDBUS的替代方案:工作,但显示嘈杂的叠加图标
#qdbus local.org_kde_powerdevil/org/kde/Solid/PowerManagement/Actions/KeyboardBrightnessControl setKeyboardBrightness$1
}
虽然(正确);做
#下面两个都可以,但是第二个不能作为根
#last=`xprintidle`
last=`qdbus org.kde.screensaver/screensaver GetSessionIdleTime`
#下面两个都可以,但是第二个不能作为根
状态=`<$prepath/亮度`
#状态=`qdbus org.kde.Solid.PowerManagement/org/kde/Solid/PowerManagement/Actions/keyboardBrightness控制键盘亮度`
val=`<$prepath/brightness\u hw\u已更改`
[$last-lt$idletime-a$status-lt$val]&&switch$val&&sleep${idletime}e-3&&continue#打开
[$last-ge$idletime-a$status-ge$val]&切换0#关闭
睡眠1
完成

编辑:现在脚本跟踪用户用fn键选择的亮度

设置
状态
,即
状态=$(谢谢,好提示:)时,您可以通过读取stdin保存一个进程。顺便说一句,不需要在子shell中运行
true
,您可以省去括号。“解决”您自己的问题。好东西,但是加入90`并以
var=$(cmd\u带\u输出)
的形式使用“modern”cmd substation。这些可以很容易地嵌套,因此养成使用它们的习惯是很好的。祝你好运。事实上,我有时也使用$(),尤其是在需要筑巢的时候。否则我会发现
cmd
cleaner:)