подсветка клавиатуры автоматического затемнения в Linux - PullRequest
1 голос
/ 23 июня 2019

Я хотел бы автоматизировать подсветку клавиатуры на своем 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.

Заранее спасибо

1 Ответ

1 голос
/ 23 июня 2019

Мне удалось оптимизировать сценарий, чтобы он включал опросы гораздо реже, когда включается свет.Я также включил способ 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

edit: теперь скрипт отслеживает яркость, выбранную пользователем с помощью клавиши fn

...