package status // import "hhvn.uk/hbspbar/status" import ( "fmt" "time" "sync" "image" "hhvn.uk/hbspbar/drw" "hhvn.uk/hbspbar/config" "hhvn.uk/hbspbar/common" ) var Status map[int]*status var Mutex sync.Mutex var statusid map[string]int var Updated chan bool var updates chan *status const ( Red = 0xffaa2222 Orange = 0xffaa7700 Green = 0xff00aa00 Black = 0xff000000 Grey = 0xff888888 Yellow = 0xffaaaa00 White = 0xffcccccc ) func init() { Status = make(map[int]*status) statusid = make(map[string]int) Updated = make(chan bool) updates = make(chan *status) go func() { for { s := <- updates id := statusid[s.Name] Mutex.Lock() Status[id] = s Mutex.Unlock() Updated <- true } }() } func register(name string) { nid := 0 for _, id := range statusid { if id >= nid { nid = id + 1 } } statusid[name] = nid } type status struct { Name string I *image.RGBA W int } func newUpdate(name string) (*status) { var s status s.Name = name s.W = 0 s.I = image.NewRGBA(image.Rect(0, 0, 1000, int(config.H))) // Use drw's in order not to modify s.W drw.DrawRect(s.I, 0, 0, 1000, int(config.H), config.Status, true) return &s } func checkError(name string, err error) { if err == nil { return } common.Error("status \"%s\": %s\n", name, err) u := newUpdate(name) u.drawText(0, Red, fmt.Sprintf("[err: %s]", name)) updates <- u sleep(5) } func sleep(s int) { time.Sleep(time.Duration(s) * time.Second) } func blendGYR(percent int) uint32 { return drw.Blend3(Green, Yellow, Red, percent) } func (s *status) furthest(x int) { if x > s.W { s.W = x } } func (s *status) drawText(x int, col uint32, text string) (int, error) { w, err := drw.DrawText(s.I, x, col, text) s.furthest(x + w) return w, err } func (s *status) drawRect(x, y, w, h int, c uint32, fill bool) { drw.DrawRect(s.I, x, y, w, h, c, fill) s.furthest(x + w) }