Apparently, somehow the led is not set automatically. The background- patch below will take care of that:
#!/usr/bin/env python3
import subprocess
import time
led = "/sys/class/leds/input45::capslock/brightness"
while True:
time.sleep(1)
ledstate = open(led).read().strip() == "1"
capstate = "Caps Lock: on" in \
subprocess.check_output(["xset", "-q"]).decode("utf-8")
if ledstate != capstate:
newled = "0" if capstate == False else "1"
open(led, "wt").write(newled)
How to use:
- Copy the script into an empty file, save it as
fix_led
(no extension) in /usr/local/bin
and make it executable.
- Since you need to edit the file
/sys/class/leds/input45::capslock/brightness
you need to add the script to the sudoers file, as explained e.g. here.
Test- run the script by running
sudo /usr/local/bin/fix_led
in a terminal, test your Caps Lock key.
Now add the script to your startup applications: Dash > Startup Applications > Add. Add the command:
/bin/bash -c "sleep 10 && sudo /usr/local/bin/fix_led"
That's it. On next restart (log in), it should work.
Notes
Of course, the patch should work in all situations where the led is not functioning. the exact location of the file capslock/brightness
may vary however. Set, if necessary, the location in the line:
led = "/sys/class/leds/input45::capslock/brightness"
in the head of the script (don't escape the :
in python
). I tested the script by making it set the led the wrong way :) (led off when Caps Lock was on, on when it was off).
- The extra load of the script is none.
Explanation
Information on the current Caps Lock state can be fetched by the command:
xset -q
Once per second, the script checks if Caps Lock: on
is in the output. The script also checks if the current state matches the led state (either 1 or 0), as read from the capslock/brightness
file.
If these two do not match, the script sets the led state according to the real Caps Lock state.