fix battery usage

This commit is contained in:
2025-09-29 11:36:33 +02:00
parent fe87de7580
commit c4e522f17a
5 changed files with 177 additions and 50 deletions

View File

@@ -15,10 +15,8 @@ from fabric.river.widgets import (
RiverActiveWindow,
get_river_connection,
)
from fabric.utils import (
invoke_repeater,
)
from fabric.widgets.circularprogressbar import CircularProgressBar
from bar.services.system_stats import SystemStatsService
from bar.config import VINYL, BATTERY, BAR_HEIGHT, WINDOW_TITLE
@@ -134,14 +132,16 @@ class StatusBar(Window):
),
)
invoke_repeater(1000, self.update_progress_bars)
# Create system stats service with signal-based updates
self.system_stats_service = SystemStatsService(update_interval=3000)
self.system_stats_service.connect("stats-changed", self.update_progress_bars)
# Set the bar height
self.set_size_request(-1, BAR_HEIGHT)
self.show_all()
def update_progress_bars(self):
self.ram_progress_bar.value = psutil.virtual_memory().percent / 100
self.cpu_progress_bar.value = psutil.cpu_percent() / 100
return True
def update_progress_bars(self, service, cpu_percent, memory_percent):
"""Update progress bars when system stats change"""
self.cpu_progress_bar.value = cpu_percent
self.ram_progress_bar.value = memory_percent

View File

@@ -1,38 +1,13 @@
import psutil
from gi.repository import GLib
from fabric.widgets.box import Box
from fabric.widgets.label import Label
from fabric.widgets.image import Image
from fabric import Fabricator
class BatteryProvider:
def __init__(self):
self.bat_percent = 0.0
self.bat_charging = None
self._update()
GLib.timeout_add_seconds(1, self._update)
def _update(self):
battery = psutil.sensors_battery()
if battery is None:
self.bat_percent = 0.0
self.bat_charging = None
else:
self.bat_percent = battery.percent
self.bat_charging = battery.power_plugged
return True
def get_battery(self):
return (self.bat_percent, self.bat_charging)
from bar.services.battery import BatteryService
class Battery(Box):
def __init__(self, **kwargs):
super().__init__(name="battery-widget", orientation="h", spacing=4, **kwargs)
self.bat_provider = BatteryProvider()
self.bat_icon = Image(
name="bat-icon", icon_name="battery-full-symbolic", icon_size=16
@@ -40,18 +15,17 @@ class Battery(Box):
self.bat_label = Label(name="bat-label", label="100%")
self.bat_fabricator = Fabricator(
poll_from=lambda *_: self.bat_provider.get_battery(),
on_changed=self.update_battery,
interval=1000,
stream=False,
default_value=(100, False),
)
# Create battery service with signal-based updates
self.battery_service = BatteryService(update_interval=10000) # Check every 10 seconds
self.battery_service.connect("battery-changed", self.update_battery)
self.children = [self.bat_icon, self.bat_label]
self.show_all()
GLib.idle_add(self.update_battery, None, self.bat_provider.get_battery())
# Initialize with current battery status
initial_percent = self.battery_service.percent
initial_charging = self.battery_service.charging
GLib.idle_add(self.update_battery, None, initial_percent, initial_charging)
def _icon_lookup(self, bat, charging):
# Round to nearest 10 for level-based icons
@@ -62,19 +36,16 @@ class Battery(Box):
else:
return f"battery-level-{level}-symbolic"
def update_battery(self, sender, battery_data):
value, charging = battery_data
icon_name = self._icon_lookup(value, charging)
def update_battery(self, service, percent, charging):
"""Update battery display when battery status changes"""
icon_name = self._icon_lookup(percent, charging)
self.bat_icon.set_property("icon-name", icon_name)
self.bat_label.set_text(f"{int(value)}%")
self.bat_label.set_text(f"{int(percent)}%")
if value < 20 and not charging:
if percent < 20 and not charging:
self.bat_label.add_style_class("battery-low")
self.bat_icon.add_style_class("battery-low")
else:
self.bat_label.remove_style_class("battery-low")
self.bat_icon.remove_style_class("battery-low")
return True

View File

@@ -13,10 +13,29 @@ from fabric.widgets.stack import Stack
from ..widgets.circle_image import CircleImage
import bar.modules.icons as icons
from bar.services.mpris import MprisPlayerManager, MprisPlayer
from fabric import Fabricator
# from bar.modules.cavalcade import SpectrumRender
def get_player_progress(fabricator, mpris_player):
"""Get player progress for Fabricator"""
if not mpris_player:
return (0, 0, 0.0)
try:
current = mpris_player.position
except Exception:
current = 0
try:
total = int(mpris_player.length or 0)
except Exception:
total = 0
progress = current / total if total > 0 else 0.0
return (current, total, progress)
def get_player_icon_markup_by_name(player_name):
if player_name:
pn = player_name.lower()