src.hhvn.uk > hbspbar > file > main.go

custom status bar for bspwm
Log | Files | Refs

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 }