Path: blob/main/vendor/github.com/chzyer/readline/windows_api.go
2875 views
// +build windows12package readline34import (5"reflect"6"syscall"7"unsafe"8)910var (11kernel = NewKernel()12stdout = uintptr(syscall.Stdout)13stdin = uintptr(syscall.Stdin)14)1516type Kernel struct {17SetConsoleCursorPosition,18SetConsoleTextAttribute,19FillConsoleOutputCharacterW,20FillConsoleOutputAttribute,21ReadConsoleInputW,22GetConsoleScreenBufferInfo,23GetConsoleCursorInfo,24GetStdHandle CallFunc25}2627type short int1628type word uint1629type dword uint3230type wchar uint163132type _COORD struct {33x short34y short35}3637func (c *_COORD) ptr() uintptr {38return uintptr(*(*int32)(unsafe.Pointer(c)))39}4041const (42EVENT_KEY = 0x000143EVENT_MOUSE = 0x000244EVENT_WINDOW_BUFFER_SIZE = 0x000445EVENT_MENU = 0x000846EVENT_FOCUS = 0x001047)4849type _KEY_EVENT_RECORD struct {50bKeyDown int3251wRepeatCount word52wVirtualKeyCode word53wVirtualScanCode word54unicodeChar wchar55dwControlKeyState dword56}5758// KEY_EVENT_RECORD KeyEvent;59// MOUSE_EVENT_RECORD MouseEvent;60// WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;61// MENU_EVENT_RECORD MenuEvent;62// FOCUS_EVENT_RECORD FocusEvent;63type _INPUT_RECORD struct {64EventType word65Padding uint1666Event [16]byte67}6869type _CONSOLE_SCREEN_BUFFER_INFO struct {70dwSize _COORD71dwCursorPosition _COORD72wAttributes word73srWindow _SMALL_RECT74dwMaximumWindowSize _COORD75}7677type _SMALL_RECT struct {78left short79top short80right short81bottom short82}8384type _CONSOLE_CURSOR_INFO struct {85dwSize dword86bVisible bool87}8889type CallFunc func(u ...uintptr) error9091func NewKernel() *Kernel {92k := &Kernel{}93kernel32 := syscall.NewLazyDLL("kernel32.dll")94v := reflect.ValueOf(k).Elem()95t := v.Type()96for i := 0; i < t.NumField(); i++ {97name := t.Field(i).Name98f := kernel32.NewProc(name)99v.Field(i).Set(reflect.ValueOf(k.Wrap(f)))100}101return k102}103104func (k *Kernel) Wrap(p *syscall.LazyProc) CallFunc {105return func(args ...uintptr) error {106var r0 uintptr107var e1 syscall.Errno108size := uintptr(len(args))109if len(args) <= 3 {110buf := make([]uintptr, 3)111copy(buf, args)112r0, _, e1 = syscall.Syscall(p.Addr(), size,113buf[0], buf[1], buf[2])114} else {115buf := make([]uintptr, 6)116copy(buf, args)117r0, _, e1 = syscall.Syscall6(p.Addr(), size,118buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],119)120}121122if int(r0) == 0 {123if e1 != 0 {124return error(e1)125} else {126return syscall.EINVAL127}128}129return nil130}131132}133134func GetConsoleScreenBufferInfo() (*_CONSOLE_SCREEN_BUFFER_INFO, error) {135t := new(_CONSOLE_SCREEN_BUFFER_INFO)136err := kernel.GetConsoleScreenBufferInfo(137stdout,138uintptr(unsafe.Pointer(t)),139)140return t, err141}142143func GetConsoleCursorInfo() (*_CONSOLE_CURSOR_INFO, error) {144t := new(_CONSOLE_CURSOR_INFO)145err := kernel.GetConsoleCursorInfo(stdout, uintptr(unsafe.Pointer(t)))146return t, err147}148149func SetConsoleCursorPosition(c *_COORD) error {150return kernel.SetConsoleCursorPosition(stdout, c.ptr())151}152153154