package main import ( "fmt" "os" "strconv" "strings" "time" "github.com/mattn/go-gtk/glib" ) func initBattery(a *App) { base := "/sys/class/power_supply" entries, err := os.ReadDir(base) if err != nil { fmt.Println("battery init:", err) return } var folder string for _, e := range entries { if strings.Contains(strings.ToLower(e.Name()), "bat") { folder = e.Name() break } } if folder == "" { fmt.Println("no battery folder found") return } rootPath := base + "/" + folder info, err := readBattery(rootPath) if err != nil { fmt.Println("read battery:", err) return } a.battery = info a.updateBatteryLabel(info) go func() { last := info for { cur, err := readBattery(rootPath) if err == nil && (cur.Percent != last.Percent || cur.Charging != last.Charging) { last = cur a.battery = cur glib.IdleAdd(func() { a.updateBatteryLabel(cur) }) } time.Sleep(30 * time.Second) } }() } func readBattery(rootPath string) (BatteryInfo, error) { val, err := os.ReadFile(rootPath + "/capacity") if err != nil { return BatteryInfo{}, err } status, err := os.ReadFile(rootPath + "/status") if err != nil { return BatteryInfo{}, err } p, err := strconv.Atoi(strings.TrimSpace(string(val))) if err != nil { return BatteryInfo{}, err } s := strings.ToLower(strings.TrimSpace(string(status))) charging := !strings.Contains(s, "dis") return BatteryInfo{Percent: p, Charging: charging, Path: rootPath}, nil }