private func startMonitoring() timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) [weak self] _ in DispatchQueue.main.async self?.statusItem?.button?.title = self?.getBatteryPercentage() ?? "??%"
private func getBatteryPercentage() -> String guard let snapshot = IOPSCopyPowerSourcesInfo()?.takeRetainedValue(), let sources = IOPSCopyPowerSourcesList(snapshot)?.takeRetainedValue() as? [CFTypeRef], let source = sources.first else return "??%" guard let info = IOPSGetPowerSourceDescription(snapshot, source)?.takeUnretainedValue() as? [String: Any] else return "??%" if let currentCapacity = info[kIOPSCurrentCapacityKey] as? Int, let maxCapacity = info[kIOPSMaxCapacityKey] as? Int let percentage = (currentCapacity * 100) / maxCapacity return "\(percentage)%" return "??%" add battery icon to taskbar
private func setupMenu() let menu = NSMenu() menu.addItem(NSMenuItem(title: "Battery Info", action: #selector(showInfo), keyEquivalent: "")) menu.addItem(NSMenuItem.separator()) menu.addItem(NSMenuItem(title: "Quit", action: #selector(quit), keyEquivalent: "q")) statusItem?.menu = menu private func startMonitoring() timer = Timer
def update_icon(self): percent, is_charging = self.get_battery_info() if percent is not None: icon_name = self.get_icon_name(percent, is_charging) self.indicator.set_icon(icon_name) # Update menu items for item in self.menu.get_children(): if item.get_label() == "Battery Percentage": item.set_label(f"Battery Percentage: percent%") elif item.get_label() == "Status": status = "Charging" if is_charging else "Discharging" item.set_label(f"Status: status") # Update every minute threading.Timer(60, self.update_icon).start() [String: Any] else return "
def create_menu(self): # Battery percentage item percent_item = Gtk.MenuItem(label="Battery Percentage: --%") percent_item.set_sensitive(False) self.menu.append(percent_item) # Status item status_item = Gtk.MenuItem(label="Status: --") status_item.set_sensitive(False) self.menu.append(status_item) # Separator separator = Gtk.SeparatorMenuItem() self.menu.append(separator) # Quit item quit_item = Gtk.MenuItem(label="Quit") quit_item.connect("activate", self.quit) self.menu.append(quit_item) self.menu.show_all()
def quit(self, source): Gtk.main_quit() if == " main ": indicator = BatteryIndicator() Gtk.main() macOS (Swift) import Cocoa import IOKit.ps class BatteryStatusItem: NSObject private var statusItem: NSStatusItem? private var timer: Timer?
private func setupStatusItem() statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) if let button = statusItem?.button button.title = getBatteryPercentage() button.action = #selector(toggleMenu) button.target = self setupMenu()
