Setting Keyboard Backlight Timeout (on Linux)

04 Jan 2019

This guide is split up into two sections, one for laptop manufacturers like Dell which have a built-in file for timeout (which can be edited to set up the timeout), and manufacturers like Asus,which need a bit of bash scripting to achieve the same.

On Dell Laptops

You’ve lucked out if you have a Dell machine, setting the timeout is relatively simple on most of their models. Their timeout values are stored in a file; editing the file should be sufficient.

  1. Navigate to the directory containing the file.
    cd "/sys/devices/platform/dell-laptop/leds/dell::kbd_backlight/"
    

    NOTE: If you don’t have such a file (and you’re using Dell), then search around in /sys/devices for a similar folder. If you searched and still can’t find it, follow the instructions in the next section.

  2. Open the stop_timeout file in a your text editor.
    sudo vim stop_timeout
    
  3. Write your desired timeout value in seconds with a s for “second” after that. (ex. 30s for 30 seconds) NOTE: For values over 1 minute, place a m for “minute” after the value. (ex. 2m for 2 minutes.)

For all other Laptops (including Asus)

Though a file for setting the timeout doesn’t exist in most laptops, there would a file to display the current brightness level. Our first step is to poke around our /sys/ directory and find such a file.

In my Asus machine, it is at /sys/class/leds/asus::kbd_backlight/brightness. Checking the contents of this file should give you the current brightness level of your keyboard.

sudo cat "/sys/class/leds/asus::kbd_backlight/brightness"

This should show a value (0,1,2,3,etc.) depending on the brightness levels of your keyboard. Now, editing this file with a new value should change the brightness.
NOTE: Editing this file requires superuser priviledges; you need to run it through the /bin/sh -c command like so:

sudo /bin/sh -c "sudo echo 0 >> /sys/class/leds/asus::kbd_backlight/brightness"

This above line should make your backlight dark. This means that our approach is working. The next step is to create a script that automates this procedure everytime your keyboard is idle for x amount of seconds.

  1. Install xprintidle through your package manager.
    Ubuntu:
    sudo apt-get install xprintidle
    

    Arch Linux:

    yay -S xprintidle
    
  2. Store the following bash code into a file in your home directory as a file called kbd_idle. Edit the x on line 4 with the desired timeout. Edit the /sys/ file too, if it differs.
    #!/bin/bash
    idle=false
    idleAfter=x #edit this x with the timeout in milliseconds
    savedState=0
    while true; do
      idleTimeMillis=$(sudo -u vkk env DISPLAY=:0.0 xprintidle)
      if [[ $idle = false && $idleTimeMillis -gt $idleAfter ]] ; then
     savedState=$(cat /sys/class/leds/asus::kbd_backlight/brightness) 
     sudo /bin/sh -c "echo 0 >> /sys/class/leds/asus::kbd_backlight/brightness"
     idle=true
     echo "Keyboard dimmed."
      fi
      if [[ $idle = true && $idleTimeMillis -lt $idleAfter ]] ; then
     sudo /bin/sh -c "echo $savedState >> /sys/class/leds/asus::kbd_backlight/brightness"
     idle=false
     echo "Keyboard brightened."
      fi
      sleep 1
    done
    
  3. Make this file executable.
    chmod ugo+x ~/scripts/kbd_idle
    
  4. Now, we have to create a systemctl service unit that can run this script in the background each time our computer starts. Save the following code in /etc/systemd/system as kbd_idle.service
    [Unit]
    Description=Disables keyboard backlight when inactive.
    [Service]
    ExecStart=/home/*user_name*/scripts/kbd_idle
    [Install]
    WantedBy=multi-user.target
    
  5. Start this system unit and enable it.
    sudo systemctl enable --now kbd_idle.service
    

    This is probably a inefficient way to do it actually, but it works. If anyone has a better method, let me know.