src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/sys/ewindows/console.go (about)

     1  //go:build windows
     2  
     3  package ewindows
     4  
     5  import (
     6  	"unsafe"
     7  
     8  	"golang.org/x/sys/windows"
     9  )
    10  
    11  // https://docs.microsoft.com/en-us/windows/console/readconsoleinput
    12  //
    13  // BOOL WINAPI ReadConsoleInput(
    14  //
    15  //		_In_  HANDLE        hConsoleInput,
    16  //		_Out_ PINPUT_RECORD lpBuffer,
    17  //		_In_  DWORD         nLength,
    18  //		_Out_ LPDWORD       lpNumberOfEventsRead
    19  //	  );
    20  var readConsoleInput = kernel32.NewProc("ReadConsoleInputW")
    21  
    22  // ReadConsoleInput input wraps the homonymous Windows API call.
    23  func ReadConsoleInput(h windows.Handle, buf []InputRecord) (int, error) {
    24  	var nr uintptr
    25  	r, _, err := readConsoleInput.Call(uintptr(h),
    26  		uintptr(unsafe.Pointer(&buf[0])), uintptr(len(buf)), uintptr(unsafe.Pointer(&nr)))
    27  	if r != 0 {
    28  		err = nil
    29  	}
    30  	return int(nr), err
    31  }
    32  
    33  // InputEvent is either a KeyEvent, MouseEvent, WindowBufferSizeEvent,
    34  // MenuEvent or FocusEvent.
    35  type InputEvent interface {
    36  	isInputEvent()
    37  }
    38  
    39  func (*KeyEvent) isInputEvent()              {}
    40  func (*MouseEvent) isInputEvent()            {}
    41  func (*WindowBufferSizeEvent) isInputEvent() {}
    42  func (*MenuEvent) isInputEvent()             {}
    43  func (*FocusEvent) isInputEvent()            {}
    44  
    45  // GetEvent converts InputRecord to InputEvent.
    46  func (input *InputRecord) GetEvent() InputEvent {
    47  	switch input.EventType {
    48  	case KEY_EVENT:
    49  		return (*KeyEvent)(unsafe.Pointer(&input.Event))
    50  	case MOUSE_EVENT:
    51  		return (*MouseEvent)(unsafe.Pointer(&input.Event))
    52  	case WINDOW_BUFFER_SIZE_EVENT:
    53  		return (*WindowBufferSizeEvent)(unsafe.Pointer(&input.Event))
    54  	case MENU_EVENT:
    55  		return (*MenuEvent)(unsafe.Pointer(&input.Event))
    56  	case FOCUS_EVENT:
    57  		return (*FocusEvent)(unsafe.Pointer(&input.Event))
    58  	default:
    59  		return nil
    60  	}
    61  }