92 lines
1.6 KiB
Go
92 lines
1.6 KiB
Go
package providers
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/codemicro/bar/internal/i3bar"
|
|
)
|
|
|
|
type Backlight struct {
|
|
name string
|
|
|
|
showUntil time.Time
|
|
lastValue int
|
|
|
|
maxValue int
|
|
}
|
|
|
|
func NewBacklight() i3bar.BlockGenerator {
|
|
return &Backlight{
|
|
name: "backlight",
|
|
}
|
|
}
|
|
|
|
func (g *Backlight) Frequency() uint8 {
|
|
return 1
|
|
}
|
|
|
|
func (g *Backlight) parseIntFromFile(fname string) (int, error) {
|
|
fcont, err := os.ReadFile(fname)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
i, err := strconv.Atoi(strings.TrimSpace(string(fcont)))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return i, nil
|
|
}
|
|
|
|
func (g *Backlight) getMaxVal() (int, error) {
|
|
if g.maxValue != 0 {
|
|
return g.maxValue, nil
|
|
}
|
|
|
|
i, err := g.parseIntFromFile("/sys/class/backlight/intel_backlight/max_brightness")
|
|
if err != nil {
|
|
return 0, nil
|
|
}
|
|
|
|
g.maxValue = i
|
|
return g.maxValue, nil
|
|
}
|
|
|
|
func (g *Backlight) getCurrentVal() (int, error) {
|
|
return g.parseIntFromFile("/sys/class/backlight/intel_backlight/brightness")
|
|
}
|
|
|
|
func (g *Backlight) Block(cs *i3bar.ColorSet) (*i3bar.Block, error) {
|
|
// this is a sun emoji: ☀
|
|
|
|
if g.maxValue == 0 {
|
|
if _, err := g.getMaxVal(); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
if cv, err := g.getCurrentVal(); err != nil {
|
|
return nil, err
|
|
} else if cv != g.lastValue {
|
|
g.lastValue = cv
|
|
g.showUntil = time.Now().Add(time.Second * 5)
|
|
}
|
|
|
|
if g.showUntil.After(time.Now()) {
|
|
return &i3bar.Block{
|
|
Name: g.name,
|
|
FullText: fmt.Sprintf("☀ %s%%", leftPad(fmt.Sprint((g.lastValue*100)/g.maxValue), ' ', 3)),
|
|
}, nil
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func (g *Backlight) GetNameAndInstance() (string, string) {
|
|
return g.name, ""
|
|
}
|