From 7d5985baf927cdd04070679cbfbb5ff6b0728f6d Mon Sep 17 00:00:00 2001 From: Michael Kelley Date: Mon, 4 Feb 2019 22:51:39 -0800 Subject: Make height option work under Windows (#1341) Separate Unix & Windows code into platform specific files for light renderer --- src/tui/light_unix.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/tui/light_unix.go (limited to 'src/tui/light_unix.go') diff --git a/src/tui/light_unix.go b/src/tui/light_unix.go new file mode 100644 index 00000000..e4ce6313 --- /dev/null +++ b/src/tui/light_unix.go @@ -0,0 +1,97 @@ +// +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 +} -- cgit v1.2.3