1#!/usr/bin/env python32import argparse3import subprocess4from pathlib import Path56def backlight_dev() -> Path|None:7 syspath=Path("/sys/class/backlight")8 try:9 devpath = syspath.iterdir().__next__()10 except:11 return None12 return devpath1314def current_brightness() -> int:15 devpath = backlight_dev()16 if devpath is not None:17 devpath = devpath.joinpath("brightness")18 with devpath.open("r") as f :19 return int(f.read())20 else:21 (_, _, _, value, max_value) = subprocess.run(["ddcutil", "getvcp", "10", "--brief"], capture_output=True).stdout.decode().split()22 return int(value)232425def max_brightness() -> int:26 devpath = backlight_dev()27 if devpath is not None:28 devpath = devpath.joinpath("max_brightness")29 with devpath.open("r") as f :30 return int(f.read())31 else:32 (_, _, _, value, max_value) = subprocess.run(["ddcutil", "getvcp", "10", "--brief"], capture_output=True).stdout.decode().split()33 return int(max_value)3435def set_brightness(n: int):36 devpath = backlight_dev()37 if devpath is not None:38 devpath = devpath.joinpath("brightness")39 with devpath.open("w") as f :40 f.write(str(n))41 else:42 subprocess.run(["ddcutil", "setvcp", "10", str(n)])4344def brightness_ratio() -> float:45 return round(current_brightness()/max_brightness(), 2)4647def increase_brightness(n: int):48 set_brightness(current_brightness() + n)4950def increase_brightness_ratio(p :float):51 set_brightness(int(max_brightness() * (brightness_ratio() + p)))5253def set_brightness_ratio(p :float):54 set_brightness(int(max_brightness() * p))5556def main():57 parser = argparse.ArgumentParser(58 prog='light')59 parser.add_argument("-A", "--increase", type=int, default=0)60 parser.add_argument("-U", "--decrease", type=int, default=0)61 parser.add_argument("-S", "--set", type=int, default=-1)6263 args = parser.parse_args()6465 if args.increase != 0:66 increase_brightness_ratio(args.increase/100)67 elif args.decrease != 0:68 increase_brightness_ratio(-args.decrease/100)69 elif args.set != -1:70 set_brightness_ratio(args.set/100)71 else:72 print(f"{int(100 * brightness_ratio())}%")73 # print(f"{current_brightness()}/{max_brightness()}")7475if __name__ == '__main__':76 main()