// +build !windows package tui import ( "fmt" "os" "syscall" "github.com/junegunn/fzf/src/util" "golang.org/x/crypto/ssh/terminal" ) func IsLightRendererSupported() bool { return true } func (r *LightRenderer) fd() int { return int(r.ttyin.Fd()) } func (r *LightRenderer) initPlatform() error { fd := r.fd() origState, err := terminal.GetState(fd) if err != nil { return err } r.origState = origState terminal.MakeRaw(fd) return nil } func (r *LightRenderer) closePlatform() { // NOOP } func openTtyIn() *os.File { in, err := os.OpenFile(consoleDevice, syscall.O_RDONLY, 0) if err != nil { tty := ttyname() if len(tty) > 0 { if in, err := os.OpenFile(tty, syscall.O_RDONLY, 0); err == nil { return in } } fmt.Fprintln(os.Stderr, "Failed to open "+consoleDevice) os.Exit(2) } return in } func (r *LightRenderer) setupTerminal() { terminal.MakeRaw(r.fd()) } func (r *LightRenderer) restoreTerminal() { terminal.Restore(r.fd(), r.origState) } func (r *LightRenderer) updateTerminalSize() { width, height, err := terminal.GetSize(r.fd()) if err == nil { r.width = width r.height = r.maxHeightFunc(height) } else { r.width = getEnv("COLUMNS", defaultWidth) r.height = r.maxHeightFunc(getEnv("LINES", defaultHeight)) } } func (r *LightRenderer) findOffset() (row int, col int) { r.csi("6n") r.flush() bytes := []byte{} for tries := 0; tries < offsetPollTries; tries++ { bytes = r.getBytesInternal(bytes, tries > 0) offsets := offsetRegexp.FindSubmatch(bytes) if len(offsets) > 3 { // Add anything we skipped over to the input buffer r.buffer = append(r.buffer, offsets[1]...) return atoi(string(offsets[2]), 0) - 1, atoi(string(offsets[3]), 0) - 1 } } return -1, -1 } func (r *LightRenderer) getch(nonblock bool) (int, bool) { b := make([]byte, 1) fd := r.fd() util.SetNonblock(r.ttyin, nonblock) _, err := util.Read(fd, b) if err != nil { return 0, false } return int(b[0]), true }