diff options
Diffstat (limited to '.config/waybar/modules/redshift.go')
| -rw-r--r-- | .config/waybar/modules/redshift.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/.config/waybar/modules/redshift.go b/.config/waybar/modules/redshift.go new file mode 100644 index 0000000..43b623c --- /dev/null +++ b/.config/waybar/modules/redshift.go @@ -0,0 +1,92 @@ +// usage: +// go build -o waybar-redshift redshift.go +package main + +import ( + "encoding/json" + "fmt" + "os" + "os/exec" + "os/signal" + "strings" + + . "syscall" +) + +const ( + ICON = "" +) + +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 { + 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", ICON) + case SIGUSR2: + // redshift on + printJson("night", "night", ICON) + case SIGHUP: + lookup() + } + case <-cancel: + fmt.Fprintln(os.Stderr, "bye") + os.Exit(0) + } + } +} + +func printJson(class, tooltip, text string) { + _ = json.NewEncoder(os.Stdout).Encode(map[string]string{ + "class": class, + "tooltip": "redshift: " + tooltip, + "text": text, + }) +} + +func lookup() { + b, err := exec.Command("redshift", "-p").Output() + if err != nil { + return + } + fds := strings.Fields(string(b)) + for idx, f := range fds { + if f == "Period:" { + fds = fds[idx+1:] + break + } + } + switch fds[0] { + case "Night": + printJson("night", "night", ICON) + case "Transition": + printJson("night", "transition", ICON) + case "Day": + printJson("day", "day", ICON) + } +} |