Browse Source

Refactor brightness to use web-greeter's controller

sisyphus
JezerM 3 years ago
parent
commit
b2f9f100af
No known key found for this signature in database
GPG Key ID: 66BBC5D01388C6B5
  1. 61
      web-greeter/bridge/Greeter.py
  2. 16
      web-greeter/bridge/__init__.py
  3. 15
      web-greeter/browser/window.py
  4. 6
      web-greeter/utils/battery.py
  5. 165
      web-greeter/utils/brightness.py

61
web-greeter/bridge/Greeter.py

@ -42,6 +42,7 @@ from PyQt5.QtCore import QFileSystemWatcher, QVariant, QTimer
from config import web_greeter_config from config import web_greeter_config
from utils.battery import Battery from utils.battery import Battery
from utils.screensaver import reset_screensaver from utils.screensaver import reset_screensaver
from utils.brightness import BrightnessController
import globals import globals
# This Application # This Application
@ -59,54 +60,6 @@ from . import (
LightDMGreeter = LightDM.Greeter() LightDMGreeter = LightDM.Greeter()
LightDMUsers = LightDM.UserList() LightDMUsers = LightDM.UserList()
def changeBrightness(method: str, quantity: int = None):
backlight = web_greeter_config["config"]["features"]["backlight"]
if not backlight["enabled"]:
return
if not quantity:
quantity = backlight["value"]
try:
steps = backlight["steps"]
child = subprocess.run(["xbacklight", method, str(quantity), "-steps", str(steps)])
if child.returncode == 1:
raise ChildProcessError("xbacklight returned 1")
except Exception as err:
logger.error("Brightness: {}".format(err))
else:
if globals.greeter:
globals.greeter.greeter.brightness_update.emit()
def increaseBrightness(quantity: int = None):
backlight = web_greeter_config["config"]["features"]["backlight"]
if not backlight["enabled"]:
return
if not quantity:
quantity = backlight["value"]
thread = threading.Thread(target=changeBrightness,
args=("-inc", quantity))
thread.start()
def decreaseBrightness(quantity: int = None):
backlight = web_greeter_config["config"]["features"]["backlight"]
if not backlight["enabled"]:
return
if not quantity:
quantity = backlight["value"]
thread = threading.Thread(target=changeBrightness,
args=("-dec", quantity))
thread.start()
def setBrightness(quantity: int = None):
backlight = web_greeter_config["config"]["features"]["backlight"]
if not backlight["enabled"]:
return
if not quantity:
quantity = backlight["value"]
thread = threading.Thread(target=changeBrightness,
args=("-set", quantity))
thread.start()
def getBrightness(self): def getBrightness(self):
if self._config["features"]["backlight"]["enabled"] != True: if self._config["features"]["backlight"]["enabled"] != True:
return -1 return -1
@ -146,6 +99,8 @@ class Greeter(BridgeObject):
if self._config["features"]["battery"]: if self._config["features"]["battery"]:
self._battery = Battery() self._battery = Battery()
self._brightness_controller = BrightnessController()
try: try:
LightDMGreeter.connect_to_daemon_sync() LightDMGreeter.connect_to_daemon_sync()
except Exception as err: except Exception as err:
@ -220,11 +175,11 @@ class Greeter(BridgeObject):
@Bridge.prop(int, notify=brightness_update) @Bridge.prop(int, notify=brightness_update)
def brightness(self): def brightness(self):
return getBrightness(self) return self._brightness_controller.brightness
@brightness.setter @brightness.setter
def brightness(self, quantity): def brightness(self, quantity):
setBrightness(quantity) self._brightness_controller.brightness = quantity
@Bridge.prop(bool, notify=noop_signal) @Bridge.prop(bool, notify=noop_signal)
def can_hibernate(self): def can_hibernate(self):
@ -353,15 +308,15 @@ class Greeter(BridgeObject):
@Bridge.method(int) @Bridge.method(int)
def brightnessSet(self, quantity): def brightnessSet(self, quantity):
setBrightness(quantity) self._brightness_controller.set_brightness(quantity)
@Bridge.method(int) @Bridge.method(int)
def brightnessIncrease(self, quantity): def brightnessIncrease(self, quantity):
increaseBrightness(quantity) self._brightness_controller.inc_brightness(quantity)
@Bridge.method(int) @Bridge.method(int)
def brightnessDecrease(self, quantity): def brightnessDecrease(self, quantity):
decreaseBrightness(quantity) self._brightness_controller.dec_brightness(quantity)
@Bridge.method() @Bridge.method()
def cancel_authentication(self): def cancel_authentication(self):

16
web-greeter/bridge/__init__.py

@ -50,22 +50,6 @@ stream_handler.setFormatter(formatter)
logger.setLevel(DEBUG) logger.setLevel(DEBUG)
logger.addHandler(stream_handler) logger.addHandler(stream_handler)
class setInterval:
def __init__(self, interval, action):
self.interval = interval
self.action = action
self.stopEvent = threading.Event()
thread = threading.Thread(target=self.__setInterval)
thread.start()
def __setInterval(self):
nextTime = time.time() + self.interval
while not self.stopEvent.wait(nextTime - time.time()):
nextTime += self.interval
self.action()
def language_to_dict(lang): def language_to_dict(lang):
if (not lang): if (not lang):
return dict() return dict()

15
web-greeter/browser/window.py

@ -25,7 +25,6 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Web Greeter; If not, see <http://www.gnu.org/licenses/>. # along with Web Greeter; If not, see <http://www.gnu.org/licenses/>.
from bridge.Greeter import changeBrightness, decreaseBrightness, increaseBrightness
from PyQt5.QtCore import QFileSystemWatcher, Qt from PyQt5.QtCore import QFileSystemWatcher, Qt
from PyQt5.QtWidgets import QAction, QMainWindow from PyQt5.QtWidgets import QAction, QMainWindow
from PyQt5.QtGui import QKeyEvent from PyQt5.QtGui import QKeyEvent
@ -37,7 +36,6 @@ class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.init_actions() self.init_actions()
# self.watchBrightness()
def init_actions(self): def init_actions(self):
devAct = QAction(text="&Toggle Devtools", parent=self) devAct = QAction(text="&Toggle Devtools", parent=self)
@ -59,14 +57,13 @@ class MainWindow(QMainWindow):
globals.greeter.toggle_devtools() globals.greeter.toggle_devtools()
def inc_brightness(self): def inc_brightness(self):
increaseBrightness() if globals.greeter:
value = web_greeter_config["config"]["features"]["backlight"]["value"]
globals.greeter.greeter.inc_brightness(value)
def dec_brightness(self): def dec_brightness(self):
decreaseBrightness() if globals.greeter:
value = web_greeter_config["config"]["features"]["backlight"]["value"]
def watchBrightness(self): globals.greeter.greeter.dec_brightness(value)
self.watcher = QFileSystemWatcher(parent=self)
self.watcher.addPath("/sys/class/backlight/intel_backlight/brightness")
self.watcher.fileChanged.connect(self.updateBrightness)
def updateBrightness(self): def updateBrightness(self):
if globals.greeter: if globals.greeter:

6
web-greeter/utils/battery.py

@ -23,7 +23,7 @@ class Battery:
callbacks = [] callbacks = []
def __init__(self): def __init__(self):
if self._batteries.__len__() == 0: if len(self._batteries) == 0:
scandir_line(self.pspath, self._update_batteries) scandir_line(self.pspath, self._update_batteries)
start_timer(self.full_update, self.onerror) start_timer(self.full_update, self.onerror)
self.full_update() self.full_update()
@ -53,8 +53,8 @@ class Battery:
self.ac = match.group() if match else self.ac self.ac = match.group() if match else self.ac
# Based on "bat" widget from "lain" awesome-wm library # Based on "bat" widget from "lain" awesome-wm library
# * (c) 2013, Luca CPZ # * (c) 2013, Luca CPZ
# * (c) 2010-2012, Peter Hofmann # * (c) 2010-2012, Peter Hofmann
# @see https://github.com/lcpz/lain/blob/master/widget/bat.lua # @see https://github.com/lcpz/lain/blob/master/widget/bat.lua
def full_update(self): def full_update(self):
global running global running

165
web-greeter/utils/brightness.py

@ -0,0 +1,165 @@
# -*- coding: utf-8 -*-
#
# brightness.py
#
# Copyright © 2021 JezerM
#
# This file is part of Web Greeter.
#
# Web Greeter 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.
#
# Web Greeter 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.
#
# The following additional terms are in effect as per Section 7 of the license:
#
# The preservation of all legal notices and author attributions in
# the material or in the Appropriate Legal Notices displayed
# by works containing it is required.
#
# You should have received a copy of the GNU General Public License
# along with Web Greeter; If not, see <http://www.gnu.org/licenses/>.
import os
import stat
import time
import pyinotify
from typing import List
from threading import Thread
import globals
from logger import logger
from config import web_greeter_config
sys_path = ["/sys/class/backlight/"]
def get_controllers() -> List[str]:
ctrls: List[str] = []
for dev in sys_path:
if os.path.exists(dev) and stat.S_ISDIR(os.stat(dev).st_mode):
drs = os.listdir(dev)
for name in drs:
ctrls.append(os.path.join(dev, name))
return ctrls
class EventHandler(pyinotify.ProcessEvent):
def process_IN_MODIFY(self, event):
if globals.greeter:
globals.greeter.greeter.brightness_update.emit()
# Behavior based on "acpilight"
# Copyright(c) 2016-2019 by wave++ "Yuri D'Elia" <wavexx@thregr.org>
# See https://gitlab.com/wavexx/acpilight
class BrightnessController:
_controllers: List[str] = []
_available: bool = False
_brightness_path: str
_max_brightness_path: str
steps: int
delay: int
_brightness: int
_max_brightness: int = -1
def __init__(self):
self._controllers = get_controllers()
if (len(self._controllers) == 0 or
self._controllers[0] == None or
web_greeter_config["config"]["features"]["backlight"]["enabled"] == False):
self._available = False
return
b_path = self._controllers[0]
self._available = True
self._brightness_path = os.path.join(b_path, "brightness")
self._max_brightness_path = os.path.join(b_path, "max_brightness")
with open(self._max_brightness_path, "r") as f:
self._max_brightness = int(f.read())
steps = web_greeter_config["config"]["features"]["backlight"]["steps"]
self.steps = 1 if steps <= 1 else steps
self.delay = 200
self.watch_brightness()
def _watch(self):
wm = pyinotify.WatchManager()
handler = EventHandler()
wm.add_watch(self._brightness_path, pyinotify.IN_MODIFY)
notifier = pyinotify.Notifier(wm, handler)
notifier.loop()
def watch_brightness(self):
if not self._available:
return
thread = Thread(target = self._watch)
thread.daemon = True
thread.start()
@property
def max_brightness(self) -> int:
return self._max_brightness
@property
def real_brightness(self) -> int:
if not self._available: return -1
try:
with open(self._brightness_path, "r") as f:
return int(f.read())
except OSError:
logger.error("Couldn't read from \"" + self._brightness_path + "\"")
return -1
@real_brightness.setter
def real_brightness(self, v: int):
if not self._available: return
if v > self.max_brightness: v = self.max_brightness
elif v <= 0: v = 0
if not os.path.exists(self._brightness_path): return
try:
with open(self._brightness_path, "w") as f:
f.write(str(round(v)))
except OSError:
logger.error("Couldn't write to \"" + self._brightness_path + "\"")
@property
def brightness(self) -> int:
if not self._available: return -1
return round(self.real_brightness * 100 / self.max_brightness)
@brightness.setter
def brightness(self, v: int):
self.real_brightness = round(v * self.max_brightness / 100)
def _set_brightness(self, value: int):
if not self._available: return
steps = self.steps or 1
sleep = self.delay / steps
current = self.brightness
if steps <= 1:
self.brightness = value
return
for i in range(steps + 1):
time.sleep(sleep / 1000)
brigh = current + ((value - current) * i) / steps
self.brightness = round(brigh)
def set_brightness(self, value: int):
thread = Thread(target = self._set_brightness, args = (value,))
thread.start()
def inc_brightness(self, value: int):
self.set_brightness(self.brightness + value)
def dec_brightness(self, value: int):
self.set_brightness(self.brightness - value)
Loading…
Cancel
Save