Brightness Thinkpad W530
Table of Contents
Lenovo thinkpad W530 custom brightness
Running Linux on my W530 is awesome, but some issues exists.
For example I can’t figure out how to change the display brightness hardware-wise.
While it’s okay that the display brightness is stuck at 100%, sometimes it becomes a bit annoying so I decided to make my own implementation using
No, this soution is not the best but does the job decent enough for me to continue using it.
Using Python I’ve created a script that watches
/sys/class/backlight/acpi_video0/actual_brightness so I can use the brightness adjustment keys on my keyboard (FN+F8 & FN+F9).
This Python script is executed when I, the user, logs in using a systemd service.
Place this Python script in a logical place that is not prune for user error (eg. deletion).
#!/usr/bin/python3 import os import time sys_brightness_min = 0 sys_brightness_max = 15 actual_brightness_min = 0.1 actual_brightness_max = 1 last_actual_brightness = -1 def main(): global last_actual_brightness while True: sys_brightness = 15 with open("/sys/class/backlight/acpi_video0/actual_brightness", "r") as file: sys_brightness = int(file.read()) actual_brightness = _map(sys_brightness, sys_brightness_min, sys_brightness_max, actual_brightness_min, actual_brightness_max) if actual_brightness is not last_actual_brightness: last_actual_brightness = actual_brightness os.system("xrandr -display :1 --output LVDS-0 --brightness " + str(actual_brightness)) time.sleep(.25) def _map(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min def follow(thefile): thefile.seek(0, 2) while True: line = thefile.readline() if not line: time.sleep(0.1) continue yield line if __name__ == "__main__": main()
ExecStart requires to be modified with the actual location of the Python script.
[Unit] # After=network.service Description=Display Brightness [Service] Type=simple WorkingDirectory=/home/[USER] ExecStart=/home/[USER]/Documents/python/display_brightness/main.py User=[USER] [Install] WantedBy=multi-user.target
And finally make it all effective
# systemctl daemon-reload # systemctl enable brightness.service # systemctl start brightness.service
While far from ideal because this is just artificially chaning the brightness using software, it works and it becomes easier on the eyes later in the night (which was the main purpose for me).
It is important to note that my solution is not a general solution for all laptops and should not be used when hardware brightness control works, but it works for me for my ThinkPad W530.
And the nice thing is that it remembers the brightness since it reads from the hardware event, when restarting the previous brightness is automatically applied after logging in.