Source code for i3pystatus.backlight
from i3pystatus.file import File
from i3pystatus import Module
from i3pystatus.core.command import run_through_shell
import glob
import shutil
[docs]class Backlight(File):
"""
Screen backlight info
- (Optional) requires `xbacklight` to change the backlight brightness with the scollwheel.
.. rubric:: Available formatters
* `{brightness}` — current brightness relative to max_brightness
* `{max_brightness}` — maximum brightness value
* `{percentage}` — current brightness in percent
"""
settings = (
("format", "format string, formatters: brightness, max_brightness, percentage"),
("format_no_backlight", "format string when no backlight file available"),
("backlight",
"backlight, see `/sys/class/backlight/`. Supports glob expansion, i.e. `*` matches anything. "
"If it matches more than one filename, selects the first one in alphabetical order"),
"color",
)
required = ()
backlight = "*"
format = "{brightness}/{max_brightness}"
format_no_backlight = "No backlight"
base_path = "/sys/class/backlight/{backlight}/"
components = {
"brightness": (int, "brightness"),
"max_brightness": (int, "max_brightness"),
}
transforms = {
"percentage": lambda cdict: round((cdict["brightness"] / cdict["max_brightness"]) * 100),
}
on_upscroll = "lighter"
on_downscroll = "darker"
def init(self):
self.base_path = self.base_path.format(backlight=self.backlight)
backlight_entries = sorted(glob.glob(self.base_path))
if len(backlight_entries) == 0:
self.run = self.run_no_backlight
super().init()
return
self.base_path = backlight_entries[0]
self.has_xbacklight = shutil.which("xbacklight") is not None
# xbacklight expects a percentage as parameter. Calculate the percentage
# for one step (if smaller xbacklight doesn't increases the brightness)
if self.has_xbacklight:
parsefunc = self.components['max_brightness'][0]
maxbfile = self.components['max_brightness'][1]
with open(self.base_path + maxbfile, "r") as f:
max_steps = parsefunc(f.read().strip())
if max_steps:
self.step_size = 100 // max_steps + 1
else:
self.step_size = 5 # default?
super().init()
def run_no_backlight(self):
cdict = {
"brightness": -1,
"max_brightness": -1,
"percentage": -1
}
format = self.format_no_backlight
if not format:
format = self.format
self.data = cdict
self.output = {
"full_text": format.format(**cdict),
"color": self.color
}
def lighter(self):
if self.has_xbacklight:
run_through_shell(["xbacklight", "-inc", str(self.step_size)])
def darker(self):
if self.has_xbacklight:
run_through_shell(["xbacklight", "-dec", str(self.step_size)])