diff options
Diffstat (limited to 'bar/bar.go')
| -rw-r--r-- | bar/bar.go | 54 |
1 files changed, 35 insertions, 19 deletions
@@ -2,7 +2,6 @@ package bar // import "hhvn.uk/hbspbar/bar" import ( "fmt" - "sync" "image" "errors" "image/color" @@ -17,11 +16,16 @@ import ( var bars map[int]*bar +type drawinfo struct { + State *bspc.State + Blocks *status.Blocks +} + type bar struct { id int w *drw.Window i *image.RGBA - drawing sync.Mutex + redraw chan drawinfo } func (b *bar) init(state *bspc.State) error { @@ -38,10 +42,26 @@ func (b *bar) init(state *bspc.State) error { rect := image.Rect(0, 0, int(mon.Rectangle.Width), int(config.H)) b.i = image.NewRGBA(rect) + b.redraw = make(chan drawinfo, 20) + + go func(){ + for d := range b.redraw { + // Gobble up excess redraws + gobble: for { + select { + case d = <- b.redraw: + default: break gobble + } + } + + b.draw(d) + } + }() + return nil } -func (b *bar) getmon(state *bspc.State) (*bspc.Monitor, error) { +func (b bar) getmon(state *bspc.State) (*bspc.Monitor, error) { return state.GetMon(b.id) } @@ -53,12 +73,12 @@ func (b *bar) drawRect(x, y, w, h int, c color.Color, fill bool) { drw.DrawRect(b.i, x, y, w, h, c, fill) } -func (b *bar) draw(state *bspc.State) { +func (b bar) draw(d drawinfo) { var bg color.Color var filled bool - b.drawing.Lock() - defer b.drawing.Unlock() + state := d.State + blocks := d.Blocks mon, err := b.getmon(state) if err != nil { @@ -117,10 +137,9 @@ func (b *bar) draw(state *bspc.State) { cx += ax + 2 } - status.Mutex.Lock() cx = int(mon.Rectangle.Width) - 6 - for i := len(status.Status) - 1; i >= 0; i -= 1 { - s, ok := status.Status[i] + for i := blocks.Len() - 1; i >= 0; i -= 1 { + s, ok := blocks.Get(i) if ok { cx -= s.W cx -= config.StatusPad @@ -133,8 +152,8 @@ func (b *bar) draw(state *bspc.State) { config.Status, true) cx = int(mon.Rectangle.Width) - 6 - for i := len(status.Status) - 1; i >= 0; i -= 1 { - s, ok := status.Status[i] + for i := blocks.Len() - 1; i >= 0; i -= 1 { + s, ok := blocks.Get(i) if ok { cx -= s.W @@ -143,7 +162,6 @@ func (b *bar) draw(state *bspc.State) { cx -= config.StatusPad } } - status.Mutex.Unlock() b.w.Paint(b.i) } @@ -170,8 +188,8 @@ var Handle handle var finalstate *bspc.State = nil func init() { - var state *bspc.State - state = nil + var state *bspc.State = nil + var blocks *status.Blocks = nil Handle.Create = make(chan int) Handle.Destroy = make(chan int) @@ -218,14 +236,14 @@ func init() { Handle.Err <- fmt.Errorf("Couldn't create window: %s\n", err) return } - case <- status.Updated: + case blocks = <- status.NewBlocks: for _, b := range bars { - go b.draw(state) + b.redraw <- drawinfo{state, blocks} } case state = <- Handle.NewState: finalstate = state for _, b := range bars { - go b.draw(state) + b.redraw <- drawinfo{state, blocks} } } } @@ -242,8 +260,6 @@ func create(state *bspc.State, id int) (error) { return err } - go b.draw(state) - if bars == nil { bars = make(map[int]*bar) } |