main.go (1979B)
1 package main // import "hhvn.uk/hbspbar" 2 3 import ( 4 "os" 5 "os/signal" 6 "strings" 7 "syscall" 8 9 "hhvn.uk/hbspbar/bspc" 10 "hhvn.uk/hbspbar/common" 11 "hhvn.uk/hbspbar/drw" 12 "hhvn.uk/hbspbar/status" 13 ) 14 15 func main() { 16 signals := make(chan os.Signal, 1) 17 signal.Notify(signals, 18 syscall.SIGINT, 19 syscall.SIGHUP, 20 syscall.SIGTERM) 21 22 if drw.InitErr != nil { 23 common.Error("Couldn't initialize X: %s\n", drw.InitErr) 24 return 25 } 26 27 if bspc.InitErr != nil { 28 common.Error("Couldn't subscribe to bspwm: %s\n", bspc.InitErr) 29 return 30 } 31 defer bspc.Cleanup() 32 33 state := <- bspc.NewState 34 35 for _, m := range state.Monitors { 36 if err := Create(state, m.ID); err != nil { 37 common.Error("%s\n", err) 38 } 39 } 40 41 var blocks []*status.Block = nil 42 43 mainloop: for { 44 select { 45 case s := <-signals: 46 common.Error("%s\n", s) 47 break mainloop 48 case <- drw.XClosed: 49 break mainloop 50 case err := <-bspc.EvErr: 51 common.Error("Couldn't read event: %s\n", err) 52 break mainloop 53 case event := <-bspc.Event: 54 if strings.HasPrefix(event.Name, "monitor_") { 55 id, err := common.Intify(event.Tokens[0]) 56 if err == nil { 57 switch event.Name { 58 case "monitor_add": 59 fallthrough 60 case "monitor_geometry": 61 err = Create(state, id) 62 if err != nil { 63 common.Error("%s\n", err) 64 } 65 case "monitor_remove": 66 err = Destroy(state, id) 67 if err != nil { 68 common.Error("%s\n", err) 69 } 70 } 71 } else { 72 common.Perror("Intify", err) 73 } 74 } 75 case err := <-bspc.StErr: 76 common.Error("Couldn't load bspwm state: %s\n", err) 77 break mainloop 78 case blocks = <- status.NewBlocks: 79 select { 80 case <- drw.XClosed: 81 break mainloop 82 default: 83 // Will hang if X is closed 84 Redraw(state, blocks) 85 } 86 case state = <- bspc.NewState: 87 // Would've used a fallthrough, 88 // but go doesn't allow it 89 select { 90 case <- drw.XClosed: 91 break mainloop 92 default: 93 Redraw(state, blocks) 94 } 95 } 96 } 97 98 Cleanup(state) 99 }