#!/usr/bin/env python3
# Copyright © 2014, 2015, 2016, 2017 Mattias Andrée (m@maandree.se)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This module implements support for backlight control.
import os
import sys
from subprocess import Popen
def list_backlights():
'''
List backlight controllers
@return list<str> List of all backlight controllers on the system
'''
return os.listdir('/sys/class/backlight')
class Backlight:
'''
Backlight controller
@variable maxmimum:int The maximum value, after minimum value modification
'''
def __init__(self, controller, adjbacklight = True, minimum = 0):
'''
Constructor
@param controller:str The name or path of the backlight controller
@param adjbacklight:bool Whether to the `adjbacklight` commmand when adjusting
@param minimum:int Artificially raise the minimum from zero to avoid the
backlight from getting stuck at zero when reached,
as happens on some controllers
'''
self.__controller = controller
if '/' not in controller:
self.__controller = '/sys/class/backlight/%s' % controller
with open('%s/max_brightness' % self.__controller, 'rb') as file:
self.maximum = int(file.read().decode('utf-8', 'replace')[:-1]) - minimum
self.__minimum = minimum
self.__adjbacklight = adjbacklight
@property
def actual(self):
'''
Get the actual brightness
@return :int The brightness, can be below zero if the minimum value was modified at contruction
'''
with open('%s/actual_brightness' % self.__controller, 'rb') as file:
return int(file.read().decode('utf-8', 'replace')[:-1]) - self.__minimum
@property
def brightness(self):
'''
Get the brightness
@return :int The brightness, can be below zero if the minimum value was modified at contruction
'''
with open('%s/brightness' % self.__controller, 'rb') as file:
return int(file.read().decode('utf-8', 'replace')[:-1]) - self.__minimum
@brightness.setter
def brightness(self, value):
'''
Set the brightness
@param value:int The brightness, inside the range [0, `self.maxmimum`], can be below zero,
but should not be below zero, if the minimum value was modified at contruction
'''
if not self.__adjbacklight:
with open('%s/brightness' % self.__controller, 'wb') as file:
file.write(('%i\n' % (value + self.__minimum)).encode('utf-8'))
file.flush()
else:
cmd = ['adjbacklight', '-s', str(value + self.__minimum), self.__controller]
Popen(cmd, stdout = sys.stdout, stderr = sys.stderr).wait()