diff options
Diffstat (limited to 'bar')
| -rw-r--r-- | bar/bar.go | 64 |
1 files changed, 45 insertions, 19 deletions
@@ -3,6 +3,7 @@ package bar // import "hhvn.uk/hbspbar/bar" import ( "fmt" "sync" + "errors" "container/list" "hhvn.uk/hbspbar/common" @@ -172,33 +173,49 @@ type eventwrap struct { } // External interface -type Handle struct { +type handle struct { Create chan int Destroy chan int NewState chan *bspc.State Err chan error } -func Init(state *bspc.State) (*Handle, error) { +var InitErr error +var Handle handle + +func init() { + InitErr = nil + bars = list.New() x, err := xgb.NewConn() - if err != nil { return nil, err } + if err != nil { + InitErr = err + return + } xu, err := xgbutil.NewConnXgb(x) - if err != nil { return nil, err } + if err != nil { + InitErr = err + return + } font, err = getFont(conf.Font) - if err != nil { return nil, err } + if err != nil { + InitErr = err + return + } setup := xproto.Setup(x) screen := setup.DefaultScreen(x) - var h Handle - h.Create = make(chan int) - h.Destroy = make(chan int) - h.NewState = make(chan *bspc.State) - h.Err = make(chan error) + var state *bspc.State + state = nil + + Handle.Create = make(chan int) + Handle.Destroy = make(chan int) + Handle.NewState = make(chan *bspc.State) + Handle.Err = make(chan error) events := make(chan *eventwrap) stoploop = make(chan bool, 1) @@ -217,13 +234,19 @@ func Init(state *bspc.State) (*Handle, error) { }}() go func() { - defer func() { xstop <- true }() + defer func() { + xstop <- true + close(Handle.Create) + close(Handle.Destroy) + close(Handle.NewState) + close(Handle.Err) + }() for { select { case e := <- events: if e.Ev == nil && e.Err == nil { - h.Err <- fmt.Errorf("X connection clossed") + Handle.Err <- fmt.Errorf("X connection clossed") return } @@ -234,19 +257,24 @@ func Init(state *bspc.State) (*Handle, error) { // switch e.Ev.(type) { // case xproto.DestroyNotifyEvent: - // h.Err <- fmt.Errorf("Window destroyed") + // Handle.Err <- fmt.Errorf("Window destroyed") // return // default: // } - case id := <- h.Destroy: + case id := <- Handle.Destroy: destroy(id) - case id := <- h.Create: + case id := <- Handle.Create: + if state == nil { + Handle.Err <- errors.New("attempted to create a bar with uninitialized state") + return + } if getbar(id) != nil { break } if err := create(x, xu, screen, state.GetMon(id)); err != nil { - h.Err <- fmt.Errorf("Couldn't create window: %s\n", err) + Handle.Err <- fmt.Errorf("Couldn't create window: %s\n", err) return } - case state := <- h.NewState: + case state = <- Handle.NewState: + fmt.Println(state) for e := bars.Front(); e != nil; e = e.Next() { v := e.Value.(*bar) v.Mon = state.GetMon(v.Mon.ID) @@ -257,8 +285,6 @@ func Init(state *bspc.State) (*Handle, error) { } } }() - - return &h, nil } func getbar(monid int) (*bar) { |