diff options
| author | Michael Kelley <michael.a.kelley@gmail.com> | 2019-02-04 22:51:39 -0800 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2020-03-10 00:03:34 +0900 |
| commit | 7d5985baf927cdd04070679cbfbb5ff6b0728f6d (patch) | |
| tree | 5b67c8ac90f2a040832c1d17b1ed10746f1d6b36 /src/tui/light.go | |
| parent | 7c40a424c0bf5a8967816d51ead6a71a334f30bb (diff) | |
| download | fzf-7d5985baf927cdd04070679cbfbb5ff6b0728f6d.tar.gz | |
Make height option work under Windows (#1341)
Separate Unix & Windows code into platform specific files for light renderer
Diffstat (limited to 'src/tui/light.go')
| -rw-r--r-- | src/tui/light.go | 78 |
1 files changed, 12 insertions, 66 deletions
diff --git a/src/tui/light.go b/src/tui/light.go index d8de4b66..3ff84870 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -7,7 +7,6 @@ import ( "regexp" "strconv" "strings" - "syscall" "time" "unicode/utf8" @@ -30,21 +29,6 @@ const consoleDevice string = "/dev/tty" var offsetRegexp *regexp.Regexp = regexp.MustCompile("(.*)\x1b\\[([0-9]+);([0-9]+)R") -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) stderr(str string) { r.stderrInternal(str, true) } @@ -101,6 +85,13 @@ type LightRenderer struct { y int x int maxHeightFunc func(int) int + + // Windows only + ttyinChannel chan byte + inHandle uintptr + outHandle uintptr + origStateInput uint32 + origStateOutput uint32 } type LightWindow struct { @@ -134,10 +125,6 @@ func NewLightRenderer(theme *ColorTheme, forceBlack bool, mouse bool, tabstop in return &r } -func (r *LightRenderer) fd() int { - return int(r.ttyin.Fd()) -} - func (r *LightRenderer) defaultTheme() *ColorTheme { if strings.Contains(os.Getenv("TERM"), "256") { return Dark256 @@ -149,22 +136,6 @@ func (r *LightRenderer) defaultTheme() *ColorTheme { return Default16 } -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 repeat(r rune, times int) string { if times > 0 { return strings.Repeat(string(r), times) @@ -183,13 +154,9 @@ func atoi(s string, defaultValue int) int { func (r *LightRenderer) Init() { r.escDelay = atoi(os.Getenv("ESCDELAY"), defaultEscDelay) - fd := r.fd() - origState, err := terminal.GetState(fd) - if err != nil { + if err := r.initPlatform(); err != nil { errorExit(err.Error()) } - r.origState = origState - terminal.MakeRaw(fd) r.updateTerminalSize() initTheme(r.theme, r.defaultTheme(), r.forceBlack) @@ -262,28 +229,6 @@ func getEnv(name string, defaultValue int) int { return atoi(env, defaultValue) } -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) 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 -} - func (r *LightRenderer) getBytes() []byte { return r.getBytesInternal(r.buffer, false) } @@ -604,7 +549,7 @@ func (r *LightRenderer) rmcup() { } func (r *LightRenderer) Pause(clear bool) { - terminal.Restore(r.fd(), r.origState) + r.restoreTerminal() if clear { if r.fullscreen { r.rmcup() @@ -617,7 +562,7 @@ func (r *LightRenderer) Pause(clear bool) { } func (r *LightRenderer) Resume(clear bool) { - terminal.MakeRaw(r.fd()) + r.setupTerminal() if clear { if r.fullscreen { r.smcup() @@ -671,7 +616,8 @@ func (r *LightRenderer) Close() { r.csi("?1000l") } r.flush() - terminal.Restore(r.fd(), r.origState) + r.closePlatform() + r.restoreTerminal() } func (r *LightRenderer) MaxX() int { |
