From 2e1bea143f20a0bee86555f1e2dcc318dd222dd7 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Wed, 10 Jan 2024 17:30:30 -0500 Subject: [PATCH] feat(term): support setting terminal state (#30) --- term/term.go | 5 +++++ term/term_other.go | 4 ++++ term/term_unix.go | 8 ++++++++ term/term_windows.go | 8 ++++++++ 4 files changed, 25 insertions(+) diff --git a/term/term.go b/term/term.go index 8503fab3..893fe956 100644 --- a/term/term.go +++ b/term/term.go @@ -23,6 +23,11 @@ func GetState(fd int) (*State, error) { return getState(fd) } +// SetState sets the given state of the terminal. +func SetState(fd int, state *State) error { + return setState(fd, state) +} + // Restore restores the terminal connected to the given file descriptor to a // previous state. func Restore(fd int, oldState *State) error { diff --git a/term/term_other.go b/term/term_other.go index aae14549..13ed2cf7 100644 --- a/term/term_other.go +++ b/term/term_other.go @@ -30,6 +30,10 @@ func getSize(fd int) (width, height int, err error) { return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) } +func setState(fd int, state *State) error { + return fmt.Errorf("terminal: SetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + func readPassword(fd int) ([]byte, error) { return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) } diff --git a/term/term_unix.go b/term/term_unix.go index b0ac6785..ad7e313c 100644 --- a/term/term_unix.go +++ b/term/term_unix.go @@ -40,6 +40,14 @@ func makeRaw(fd int) (*State, error) { return &oldState, nil } +func setState(fd int, state *State) error { + var termios *unix.Termios + if state != nil { + termios = &state.Termios + } + return unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) +} + func getState(fd int) (*State, error) { termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) if err != nil { diff --git a/term/term_windows.go b/term/term_windows.go index 68452f06..825ed01f 100644 --- a/term/term_windows.go +++ b/term/term_windows.go @@ -31,6 +31,14 @@ func makeRaw(fd int) (*State, error) { return &State{state{st}}, nil } +func setState(fd int, state *State) error { + var mode uint32 + if state != nil { + mode = state.Mode + } + return windows.SetConsoleMode(windows.Handle(fd), mode) +} + func getState(fd int) (*State, error) { var st uint32 if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {