github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/cmds/core/elvish/edit/tty/setup_windows.go (about)

     1  package tty
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/u-root/u-root/cmds/core/elvish/util"
     7  	"golang.org/x/sys/windows"
     8  )
     9  
    10  const (
    11  	wantedInMode = windows.ENABLE_WINDOW_INPUT |
    12  		windows.ENABLE_MOUSE_INPUT | windows.ENABLE_PROCESSED_INPUT
    13  	wantedOutMode = windows.ENABLE_PROCESSED_OUTPUT |
    14  		windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
    15  )
    16  
    17  func setup(in, out *os.File) (func() error, error) {
    18  	hIn := windows.Handle(in.Fd())
    19  	hOut := windows.Handle(out.Fd())
    20  
    21  	var oldInMode, oldOutMode uint32
    22  	err := windows.GetConsoleMode(hIn, &oldInMode)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	err = windows.GetConsoleMode(hOut, &oldOutMode)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  
    31  	errSetIn := windows.SetConsoleMode(hIn, wantedInMode)
    32  	errSetOut := windows.SetConsoleMode(hOut, wantedOutMode)
    33  	errVT := setupVT(out)
    34  
    35  	return func() error {
    36  		return util.Errors(
    37  			windows.SetConsoleMode(hIn, oldInMode),
    38  			windows.SetConsoleMode(hOut, oldOutMode),
    39  			restoreVT(out))
    40  	}, util.Errors(errSetIn, errSetOut, errVT)
    41  }