summaryrefslogtreecommitdiff
path: root/src/tui/light.go
diff options
context:
space:
mode:
authorMichael Kelley <michael.a.kelley@gmail.com>2019-02-04 22:51:39 -0800
committerJunegunn Choi <junegunn.c@gmail.com>2020-03-10 00:03:34 +0900
commit7d5985baf927cdd04070679cbfbb5ff6b0728f6d (patch)
tree5b67c8ac90f2a040832c1d17b1ed10746f1d6b36 /src/tui/light.go
parent7c40a424c0bf5a8967816d51ead6a71a334f30bb (diff)
downloadfzf-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.go78
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 {