aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/peterh/liner/input_windows.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-11-04 02:51:19 +0800
committerFelix Lange <fjl@twurst.com>2016-11-04 02:51:19 +0800
commitac9013162e51aad9525fcac084973a0cfbc1575a (patch)
tree54c6f2480cbb23a18c81e367b3c89b8aaead86c2 /vendor/github.com/peterh/liner/input_windows.go
parented2bc7fbe9a30c1861cffdd7d0fd570847a2ae0c (diff)
downloadgo-tangerine-ac9013162e51aad9525fcac084973a0cfbc1575a.tar.gz
go-tangerine-ac9013162e51aad9525fcac084973a0cfbc1575a.tar.zst
go-tangerine-ac9013162e51aad9525fcac084973a0cfbc1575a.zip
vendor: update github.com/peterh/liner
Diffstat (limited to 'vendor/github.com/peterh/liner/input_windows.go')
-rw-r--r--vendor/github.com/peterh/liner/input_windows.go31
1 files changed, 23 insertions, 8 deletions
diff --git a/vendor/github.com/peterh/liner/input_windows.go b/vendor/github.com/peterh/liner/input_windows.go
index 199b9428e..a48eb0f1d 100644
--- a/vendor/github.com/peterh/liner/input_windows.go
+++ b/vendor/github.com/peterh/liner/input_windows.go
@@ -10,13 +10,14 @@ import (
var (
kernel32 = syscall.NewLazyDLL("kernel32.dll")
- procGetStdHandle = kernel32.NewProc("GetStdHandle")
- procReadConsoleInput = kernel32.NewProc("ReadConsoleInputW")
- procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
- procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
- procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition")
- procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
- procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW")
+ procGetStdHandle = kernel32.NewProc("GetStdHandle")
+ procReadConsoleInput = kernel32.NewProc("ReadConsoleInputW")
+ procGetNumberOfConsoleInputEvents = kernel32.NewProc("GetNumberOfConsoleInputEvents")
+ procGetConsoleMode = kernel32.NewProc("GetConsoleMode")
+ procSetConsoleMode = kernel32.NewProc("SetConsoleMode")
+ procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition")
+ procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
+ procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW")
)
// These names are from the Win32 api, so they use underscores (contrary to
@@ -147,6 +148,21 @@ const (
modKeys = shiftPressed | leftAltPressed | rightAltPressed | leftCtrlPressed | rightCtrlPressed
)
+// inputWaiting only returns true if the next call to readNext will return immediately.
+func (s *State) inputWaiting() bool {
+ var num uint32
+ ok, _, _ := procGetNumberOfConsoleInputEvents.Call(uintptr(s.handle), uintptr(unsafe.Pointer(&num)))
+ if ok == 0 {
+ // call failed, so we cannot guarantee a non-blocking readNext
+ return false
+ }
+
+ // during a "paste" input events are always an odd number, and
+ // the last one results in a blocking readNext, so return false
+ // when num is 1 or 0.
+ return num > 1
+}
+
func (s *State) readNext() (interface{}, error) {
if s.repeat > 0 {
s.repeat--
@@ -263,7 +279,6 @@ func (s *State) readNext() (interface{}, error) {
}
return s.key, nil
}
- return unknown, nil
}
// Close returns the terminal to its previous mode