package main // import "hhvn.uk/hbspbar" import ( "os" "os/signal" "strings" "syscall" "hhvn.uk/hbspbar/bspc" "hhvn.uk/hbspbar/common" "hhvn.uk/hbspbar/drw" "hhvn.uk/hbspbar/status" ) // Store the state for when bar.Cleanup() is called // This is a bit hacky but I don't really see any alternative var finalstate *bspc.State = nil func main() { signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM) if drw.InitErr != nil { common.Error("Couldn't initialize X: %s\n", drw.InitErr) return } if bspc.InitErr != nil { common.Error("Couldn't subscribe to bspwm: %s\n", bspc.InitErr) return } defer bspc.Cleanup() state := <- bspc.NewState for _, m := range state.Monitors { Create(state, m.ID) } var blocks []*status.Block = nil mainloop: for { select { case s := <-signals: common.Error("%s\n", s) break mainloop case e := <- drw.Events: if e.Ev == nil && e.Err == nil { common.Error("X connection clossed\n") break mainloop } if e.Err != nil { common.Perror("X.WaitForEvents", e.Err) continue } // switch e.Ev.(type) { // case xproto.DestroyNotifyEvent: // Err <- fmt.Errorf("Window destroyed") // return // default: // } case err := <-bspc.EvErr: common.Error("Couldn't read event: %s\n", err) break mainloop case event := <-bspc.Event: if strings.HasPrefix(event.Name, "monitor_") { id, err := common.Intify(event.Tokens[0]) if err == nil { switch event.Name { case "monitor_add": case "monitor_geometry": Create(state, id) case "monitor_remove": Destroy(state, id) } } } case err := <-bspc.StErr: common.Error("Couldn't load bspwm state: %s\n", err) break mainloop case blocks = <- status.NewBlocks: Redraw(state, blocks) case state = <- bspc.NewState: finalstate = state Redraw(state, blocks) } } Cleanup(finalstate) }