diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 54 |
1 files changed, 38 insertions, 16 deletions
@@ -6,12 +6,16 @@ import ( "strings" "syscall" - "hhvn.uk/hbspbar/bar" "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, @@ -19,8 +23,6 @@ func main() { syscall.SIGHUP, syscall.SIGTERM) - defer bar.Cleanup() - if drw.InitErr != nil { common.Error("Couldn't initialize X: %s\n", drw.InitErr) return @@ -33,22 +35,37 @@ func main() { defer bspc.Cleanup() state := <- bspc.NewState - bar.NewState <- state for _, m := range state.Monitors { - bar.Create <- m.ID + Create(state, m.ID) } - for { + var blocks []*status.Block = nil + + mainloop: for { select { case s := <-signals: common.Error("%s\n", s) - return - case err := <-bar.Err: - common.Error("%s\n", err) - return + 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) - return + break mainloop case event := <-bspc.Event: if strings.HasPrefix(event.Name, "monitor_") { id, err := common.Intify(event.Tokens[0]) @@ -56,17 +73,22 @@ func main() { switch event.Name { case "monitor_add": case "monitor_geometry": - bar.Create <- id + Create(state, id) case "monitor_remove": - bar.Destroy <- id + Destroy(state, id) } } } case err := <-bspc.StErr: common.Error("Couldn't load bspwm state: %s\n", err) - return - case s := <-bspc.NewState: - bar.NewState <- s + break mainloop + case blocks = <- status.NewBlocks: + Redraw(state, blocks) + case state = <- bspc.NewState: + finalstate = state + Redraw(state, blocks) } } + + Cleanup(finalstate) } |