// 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) } // if err := Prctl(PR_SET_PDEATHSIG, // SIGTERM, // 0, 0, 0); err != nil { // fmt.Fprintln(os.Stderr, err) // os.Exit(1) // } lookup() for { select { case sig := <-update: switch sig { case SIGUSR1: // redshift off printJson("day", "day") case SIGUSR2: // redshift on printJson("night", "night") case SIGHUP: lookup() } case <-cancel: log.Printf("%v exiting\n", os.Args[0]) os.Exit(0) } } } func printJson(state, tooltip string) { _ = json.NewEncoder(os.Stdout).Encode(map[string]interface{}{ "class": state, "alt": state, "tooltip": "gammastep: " + tooltip, "text": state, }) } func lookup() { b, err := exec.Command("gammastep", "-p").CombinedOutput() if err != nil { log.Printf("error: %v", err) return } var period string var fds = strings.Fields(string(b)) for idx, f := range fds { if f == "Period:" { period = fds[idx+1] break } } switch period { case "Night": printJson("night", "night") case "Transition": printJson("night", "transition") case "Daytime": printJson("day", "day") default: printJson("unknown", "unknown") } }