diff --git a/tools/tui/tmux.go b/tools/tui/tmux.go index 95b56dcda..b0db172e4 100644 --- a/tools/tui/tmux.go +++ b/tools/tui/tmux.go @@ -3,6 +3,7 @@ package tui import ( + "errors" "fmt" "kitty/tools/utils" "os" @@ -10,6 +11,7 @@ import ( "path/filepath" "strconv" "strings" + "time" "github.com/shirou/gopsutil/v3/process" "golang.org/x/sys/unix" @@ -50,7 +52,34 @@ func tmux_socket_address() (socket string) { var TmuxSocketAddress = (&utils.Once[string]{Run: tmux_socket_address}).Get func tmux_allow_passthrough() error { - return exec.Command("tmux", "set", "-p", "allow-passthrough", "on").Run() + c := exec.Command("tmux", "show", "-Ap", "allow-passthrough") + allowed, not_allowed := errors.New("allowed"), errors.New("not allowed") + get_result := make(chan error) + go func() { + output, err := c.Output() + if err != nil { + get_result <- err + } else { + q := strings.TrimSpace(utils.UnsafeBytesToString(output)) + if strings.HasSuffix(q, " on") || strings.HasSuffix(q, " all") { + get_result <- allowed + } else { + get_result <- not_allowed + } + } + }() + select { + case r := <-get_result: + if r == allowed { + return nil + } + if r != not_allowed { + return r + } + return exec.Command("tmux", "set", "-p", "allow-passthrough", "on").Run() + case <-time.After(2 * time.Second): + return fmt.Errorf("Tmux command timed out. This often happens when the version of tmux on your PATH is older than the version of the running tmux server") + } } var TmuxAllowPassthrough = (&utils.Once[error]{Run: tmux_allow_passthrough}).Get