This commit is contained in:
2026-06-03 21:32:45 +02:00
parent f2328ff319
commit 1e869b49c7
126 changed files with 41986 additions and 1 deletions
+154
View File
@@ -0,0 +1,154 @@
import subprocess
from fabric.utils.helpers import exec_shell_command_async
from fabric.widgets.box import Box
from fabric.widgets.button import Button
from fabric.widgets.label import Label
import config.data as data
import modules.icons as icons
class Systemprofiles(Box):
def __init__(self, **kwargs):
super().__init__(
name="systemprofiles",
orientation="h" if not data.VERTICAL else "v",
spacing=3,
)
if data.BAR_THEME == "Dense" or data.BAR_THEME == "Edge":
self.add_style_class("invert")
self.bat_save = None
self.bat_balanced = None
self.bat_perf = None
children = []
try:
result = subprocess.run(
["powerprofilesctl", "list"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=True,
)
available_profiles = result.stdout
except (subprocess.CalledProcessError, FileNotFoundError):
available_profiles = ""
if "power-saver" in available_profiles:
self.bat_save = Button(
name="battery-save",
child=Label(name="battery-save-label", markup=icons.power_saving),
on_clicked=lambda *_: self.set_power_mode("power-saver"),
tooltip_text="Power saving mode",
)
children.append(self.bat_save)
if "balanced" in available_profiles:
self.bat_balanced = Button(
name="battery-balanced",
child=Label(name="battery-balanced-label", markup=icons.power_balanced),
on_clicked=lambda *_: self.set_power_mode("balanced"),
tooltip_text="Balanced mode",
)
children.append(self.bat_balanced)
if "performance" in available_profiles:
self.bat_perf = Button(
name="battery-performance",
child=Label(
name="battery-performance-label", markup=icons.power_performance
),
on_clicked=lambda *_: self.set_power_mode("performance"),
tooltip_text="Performance mode",
)
children.append(self.bat_perf)
# Group the mode buttons into a container.
if children:
self.add(
Box(
name="power-mode-switcher",
orientation="h" if not data.VERTICAL else "v",
spacing=4,
children=children,
)
)
if data.BAR_COMPONENTS_VISIBILITY.get("sysprofiles", False):
self.get_current_power_mode()
self.hide_timer = None
self.hover_counter = 0
# self.set_power_mode("balanced")
def get_current_power_mode(self):
try:
# Run the command to get the current power mode
result = subprocess.run(
["powerprofilesctl", "get"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=True,
)
# Get the output and strip unnecessary whitespace
output = result.stdout.strip()
# Validate the output
if output in ["power-saver", "balanced", "performance"]:
self.current_mode = output
else:
self.current_mode = "balanced"
# Update button styles based on the current mode
self.update_button_styles()
except subprocess.CalledProcessError as err:
print(f"Command failed: {err}")
self.current_mode = "balanced"
except Exception as err:
print(f"Error retrieving current power mode: {err}")
self.current_mode = "balanced"
def set_power_mode(self, mode):
"""
Switches power mode by running the corresponding auto-cpufreq command.
mode: one of 'powersave', 'balanced', or 'performance'
"""
commands = {
"power-saver": "powerprofilesctl set power-saver",
"balanced": "powerprofilesctl set balanced",
"performance": "powerprofilesctl set performance",
}
if mode in commands:
try:
exec_shell_command_async(commands[mode])
self.current_mode = mode
self.update_button_styles()
except Exception as err:
# Optionally, handle errors or display a notification.
print(f"Error setting power mode: {err}")
def update_button_styles(self):
"""
Optionally updates button styles to reflect the current mode.
Adjust the styling method based on your toolkit's capabilities.
"""
if self.bat_save:
self.bat_save.remove_style_class("active")
if self.bat_balanced:
self.bat_balanced.remove_style_class("active")
if self.bat_perf:
self.bat_perf.remove_style_class("active")
if self.current_mode == "power-saver" and self.bat_save:
self.bat_save.add_style_class("active")
elif self.current_mode == "balanced" and self.bat_balanced:
self.bat_balanced.add_style_class("active")
elif self.current_mode == "performance" and self.bat_perf:
self.bat_perf.add_style_class("active")