mirror of https://github.com/coder/coder.git
66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package pty
|
|
|
|
import "golang.org/x/sys/windows"
|
|
|
|
type terminalState uint32
|
|
|
|
// This is adapted from term.MakeRaw, but adds
|
|
// ENABLE_VIRTUAL_TERMINAL_PROCESSING to the output mode and
|
|
// ENABLE_VIRTUAL_TERMINAL_INPUT to the input mode.
|
|
//
|
|
// See: https://github.com/golang/term/blob/5b15d269ba1f54e8da86c8aa5574253aea0c2198/term_windows.go#L23
|
|
//
|
|
// Copyright 2019 The Go Authors. BSD-3-Clause license. See:
|
|
// https://github.com/golang/term/blob/master/LICENSE
|
|
func makeRaw(handle windows.Handle, input bool) (uint32, error) {
|
|
var prevState uint32
|
|
if err := windows.GetConsoleMode(handle, &prevState); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
var raw uint32
|
|
if input {
|
|
raw = prevState &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
|
|
raw |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT
|
|
} else {
|
|
raw = prevState | windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
|
}
|
|
|
|
if err := windows.SetConsoleMode(handle, raw); err != nil {
|
|
return 0, err
|
|
}
|
|
return prevState, nil
|
|
}
|
|
|
|
//nolint:revive
|
|
func makeInputRaw(handle uintptr) (*TerminalState, error) {
|
|
prevState, err := makeRaw(windows.Handle(handle), true)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &TerminalState{
|
|
state: terminalState(prevState),
|
|
}, nil
|
|
}
|
|
|
|
//nolint:revive
|
|
func makeOutputRaw(handle uintptr) (*TerminalState, error) {
|
|
prevState, err := makeRaw(windows.Handle(handle), false)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &TerminalState{
|
|
state: terminalState(prevState),
|
|
}, nil
|
|
}
|
|
|
|
//nolint:revive
|
|
func restoreTerminal(handle uintptr, state *TerminalState) error {
|
|
return windows.SetConsoleMode(windows.Handle(handle), uint32(state.state))
|
|
}
|