From cc1f0bc3fe674ee6cf33c15b43a9e60faee9762a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 23 Jan 2023 16:07:00 +0530 Subject: [PATCH] Function to drain controlling tty --- tools/tty/tty.go | 22 ++++++++++++++++++++++ tools/tui/loop/read.go | 4 +++- tools/tui/loop/write.go | 4 +++- tools/utils/select.go | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/tools/tty/tty.go b/tools/tty/tty.go index aa6238cae..1542a59f5 100644 --- a/tools/tty/tty.go +++ b/tools/tty/tty.go @@ -315,3 +315,25 @@ func DebugPrintln(a ...any) { term.DebugPrintln(a...) } } + +func DrainControllingTTY(wait_for time.Duration) { + tty, err := OpenControllingTerm(SetRaw, SetNoEcho) + if err != nil { + return + } + sel := utils.CreateSelect(1) + sel.RegisterRead(tty.Fd()) + for { + n, err := sel.Wait(wait_for) + if err == unix.EINTR { + continue + } + if err != nil { + return + } + if n > 0 && sel.IsReadyToRead(tty.Fd()) { + tty.Read(make([]byte, 256)) + } + break + } +} diff --git a/tools/tui/loop/read.go b/tools/tui/loop/read.go index f7693e3d2..671864618 100644 --- a/tools/tui/loop/read.go +++ b/tools/tui/loop/read.go @@ -7,6 +7,8 @@ import ( "io" "os" + "golang.org/x/sys/unix" + "kitty/tools/tty" "kitty/tools/utils" ) @@ -56,7 +58,7 @@ func read_from_tty(pipe_r *os.File, term *tty.Term, results_channel chan<- []byt wait_for_read_available := func() { for { n, err := selector.WaitForever() - if err != nil { + if err != nil && err != unix.EINTR { err_channel <- err keep_going = false return diff --git a/tools/tui/loop/write.go b/tools/tui/loop/write.go index 29b948f2d..cc24b3b64 100644 --- a/tools/tui/loop/write.go +++ b/tools/tui/loop/write.go @@ -8,6 +8,8 @@ import ( "os" "time" + "golang.org/x/sys/unix" + "kitty/tools/tty" "kitty/tools/utils" ) @@ -143,7 +145,7 @@ func write_to_tty( wait_for_write_available := func() { for { n, err := selector.WaitForever() - if err != nil { + if err != nil && err != unix.EINTR { err_channel <- err keep_going = false return diff --git a/tools/utils/select.go b/tools/utils/select.go index 8c52f217d..9d85bb87b 100644 --- a/tools/utils/select.go +++ b/tools/utils/select.go @@ -75,7 +75,7 @@ func (self *Selector) Wait(timeout time.Duration) (num_ready int, err error) { self.read_set.Zero() self.write_set.Zero() self.err_set.Zero() - return 0, nil + return 0, err } return }