// usage: // go build -o waybar-gammastep gammastep.go package main import ( "encoding/json" "log" "os" "os/exec" "os/signal" "strings" . "syscall" ) func main() { var ( update = make(chan os.Signal, 1) cancel = make(chan os.Signal, 1) ) signal.Notify(update, SIGUSR1, SIGUSR2, SIGHUP) signal.Notify(cancel, SIGTERM, SIGINT) // could use golang.org/x/sys/unix.Prctl here // but I want to avoid the dependency if _, _, e := Syscall6(SYS_PRCTL, uintptr(PR_SET_PDEATHSIG), uintptr(SIGTERM), 0, 0, 0, 0); e != 0 { log.Printf("error: %v", e) os.Exit(1) } lookup() for { select { case sig := <-update: switch sig { case SIGUSR1: printJson("day") case SIGUSR2: printJson("night") case SIGHUP: lookup() } case <-cancel: log.Printf("%v exiting\n", os.Args[0]) os.Exit(0) } } } func printJson(phase string) { _ = json.NewEncoder(os.Stdout).Encode(map[string]interface{}{ "class": phase, "alt": phase, "tooltip": "gamma: " + phase, "text": phase, }) } func lookup() { cmdEnv, ok := os.LookupEnv("GAMMA_COMMAND") if !ok { printJson("unknown") return } log.Println(cmdEnv) b, err := exec.Command("bash", "-c", cmdEnv).Output() if err != nil { log.Printf("error: %v", err) return } phase := strings.TrimSpace(string(b)) printJson(phase) }