aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/peterh/liner/input_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/peterh/liner/input_windows.go')
-rw-r--r--vendor/github.com/peterh/liner/input_windows.go35
1 files changed, 30 insertions, 5 deletions
diff --git a/vendor/github.com/peterh/liner/input_windows.go b/vendor/github.com/peterh/liner/input_windows.go
index a48eb0f1d..36e95161a 100644
--- a/vendor/github.com/peterh/liner/input_windows.go
+++ b/vendor/github.com/peterh/liner/input_windows.go
@@ -4,6 +4,7 @@ import (
"bufio"
"os"
"syscall"
+ "unicode/utf16"
"unsafe"
)
@@ -103,7 +104,7 @@ type key_event_record struct {
RepeatCount uint16
VirtualKeyCode uint16
VirtualScanCode uint16
- Char int16
+ Char uint16
ControlKeyState uint32
}
@@ -111,6 +112,7 @@ type key_event_record struct {
// what golint suggests)
const (
vk_tab = 0x09
+ vk_menu = 0x12 // ALT key
vk_prior = 0x21
vk_next = 0x22
vk_end = 0x23
@@ -134,6 +136,7 @@ const (
vk_f11 = 0x7a
vk_f12 = 0x7b
bKey = 0x42
+ dKey = 0x44
fKey = 0x46
yKey = 0x59
)
@@ -174,6 +177,8 @@ func (s *State) readNext() (interface{}, error) {
var rv uint32
prv := uintptr(unsafe.Pointer(&rv))
+ var surrogate uint16
+
for {
ok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv)
@@ -184,9 +189,6 @@ func (s *State) readNext() (interface{}, error) {
if input.eventType == window_buffer_size_event {
xy := (*coord)(unsafe.Pointer(&input.blob[0]))
s.columns = int(xy.x)
- if s.columns > 1 {
- s.columns--
- }
return winch, nil
}
if input.eventType != key_event {
@@ -194,6 +196,17 @@ func (s *State) readNext() (interface{}, error) {
}
ke := (*key_event_record)(unsafe.Pointer(&input.blob[0]))
if ke.KeyDown == 0 {
+ if ke.VirtualKeyCode == vk_menu && ke.Char > 0 {
+ // paste of unicode (eg. via ALT-numpad)
+ if surrogate > 0 {
+ return utf16.DecodeRune(rune(surrogate), rune(ke.Char)), nil
+ } else if utf16.IsSurrogate(rune(ke.Char)) {
+ surrogate = ke.Char
+ continue
+ } else {
+ return rune(ke.Char), nil
+ }
+ }
continue
}
@@ -202,6 +215,9 @@ func (s *State) readNext() (interface{}, error) {
} else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
ke.ControlKeyState&modKeys == rightAltPressed) {
s.key = altB
+ } else if ke.VirtualKeyCode == dKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
+ ke.ControlKeyState&modKeys == rightAltPressed) {
+ s.key = altD
} else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed ||
ke.ControlKeyState&modKeys == rightAltPressed) {
s.key = altF
@@ -209,7 +225,14 @@ func (s *State) readNext() (interface{}, error) {
ke.ControlKeyState&modKeys == rightAltPressed) {
s.key = altY
} else if ke.Char > 0 {
- s.key = rune(ke.Char)
+ if surrogate > 0 {
+ s.key = utf16.DecodeRune(rune(surrogate), rune(ke.Char))
+ } else if utf16.IsSurrogate(rune(ke.Char)) {
+ surrogate = ke.Char
+ continue
+ } else {
+ s.key = rune(ke.Char)
+ }
} else {
switch ke.VirtualKeyCode {
case vk_prior:
@@ -337,3 +360,5 @@ func TerminalMode() (ModeApplier, error) {
}
return mode, err
}
+
+const cursorColumn = true