diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c1e4aa --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +i3-wrapper* diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a072565 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.tordarus.net/tordarus/i3-wrapper + +go 1.17 diff --git a/main.go b/main.go new file mode 100644 index 0000000..ffdffb3 --- /dev/null +++ b/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "os" + "os/exec" + "os/signal" + "path/filepath" + "strings" + "syscall" +) + +var ( + envFile = flag.String("env", "$HOME/.config/i3-wrapper/environment", "environment file with variable definitions") +) + +var ( + i3 *os.Process + running bool +) + +func main() { + logFile, err := os.Create(filepath.Join(os.Getenv("HOME"), ".i3.log")) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + defer logFile.Close() + + os.Stdout = logFile + os.Stderr = logFile + + fmt.Println("environment file:", os.ExpandEnv(*envFile)) + + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-sigs + running = false + i3.Signal(sig) + }() + + running = true + for running { + cmd := exec.Command("i3") + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + cmd.Env = os.Environ() + if envData, err := ioutil.ReadFile(os.ExpandEnv(*envFile)); err == nil { + cmd.Env = append(cmd.Env, strings.Split(string(envData), "\n")...) + } else { + fmt.Println(err) + } + + err = cmd.Start() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + i3 = cmd.Process + + err = cmd.Wait() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + + if _, ok := err.(*exec.ExitError); ok { + break + } + } +}