github.com/kolbycrouch/elvish@v0.14.1-0.20210614162631-215b9ac1c423/cmd/examples/win_tty/main_windows.go (about)

     1  package main
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  
     7  	"golang.org/x/sys/windows"
     8  	"src.elv.sh/pkg/sys"
     9  )
    10  
    11  func main() {
    12  	restore := setup(os.Stdin, os.Stdout)
    13  	defer restore()
    14  
    15  	log.Println("ready")
    16  	console, err := windows.GetStdHandle(windows.STD_INPUT_HANDLE)
    17  	if err != nil {
    18  		log.Fatalf("GetStdHandle(STD_INPUT_HANDLE): %v", err)
    19  	}
    20  	for {
    21  		event, err := sys.ReadInputEvent(console)
    22  		if err != nil {
    23  			log.Fatal(err)
    24  		}
    25  		log.Printf("input: %#v", event)
    26  	}
    27  }
    28  
    29  const (
    30  	wantedInMode = windows.ENABLE_WINDOW_INPUT |
    31  		windows.ENABLE_MOUSE_INPUT | windows.ENABLE_PROCESSED_INPUT
    32  	wantedOutMode = windows.ENABLE_PROCESSED_OUTPUT |
    33  		windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
    34  )
    35  
    36  func setup(in, out *os.File) func() {
    37  	hIn := windows.Handle(in.Fd())
    38  	hOut := windows.Handle(out.Fd())
    39  
    40  	var oldInMode, oldOutMode uint32
    41  	err := windows.GetConsoleMode(hIn, &oldInMode)
    42  	if err != nil {
    43  		log.Fatal(err)
    44  	}
    45  	err = windows.GetConsoleMode(hOut, &oldOutMode)
    46  	if err != nil {
    47  		log.Fatal(err)
    48  	}
    49  
    50  	err = windows.SetConsoleMode(hIn, wantedInMode)
    51  	if err != nil {
    52  		log.Fatal(err)
    53  	}
    54  	err = windows.SetConsoleMode(hOut, wantedOutMode)
    55  	if err != nil {
    56  		log.Fatal(err)
    57  	}
    58  
    59  	return func() {
    60  		err := windows.SetConsoleMode(hIn, oldInMode)
    61  		if err != nil {
    62  			log.Fatal(err)
    63  		}
    64  		err = windows.SetConsoleMode(hOut, oldOutMode)
    65  		if err != nil {
    66  			log.Fatal(err)
    67  		}
    68  	}
    69  }