Function to drain controlling tty

This commit is contained in:
Kovid Goyal 2023-01-23 16:07:00 +05:30
parent a009d6b258
commit cc1f0bc3fe
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 29 additions and 3 deletions

View File

@ -315,3 +315,25 @@ func DebugPrintln(a ...any) {
term.DebugPrintln(a...) 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
}
}

View File

@ -7,6 +7,8 @@ import (
"io" "io"
"os" "os"
"golang.org/x/sys/unix"
"kitty/tools/tty" "kitty/tools/tty"
"kitty/tools/utils" "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() { wait_for_read_available := func() {
for { for {
n, err := selector.WaitForever() n, err := selector.WaitForever()
if err != nil { if err != nil && err != unix.EINTR {
err_channel <- err err_channel <- err
keep_going = false keep_going = false
return return

View File

@ -8,6 +8,8 @@ import (
"os" "os"
"time" "time"
"golang.org/x/sys/unix"
"kitty/tools/tty" "kitty/tools/tty"
"kitty/tools/utils" "kitty/tools/utils"
) )
@ -143,7 +145,7 @@ func write_to_tty(
wait_for_write_available := func() { wait_for_write_available := func() {
for { for {
n, err := selector.WaitForever() n, err := selector.WaitForever()
if err != nil { if err != nil && err != unix.EINTR {
err_channel <- err err_channel <- err
keep_going = false keep_going = false
return return

View File

@ -75,7 +75,7 @@ func (self *Selector) Wait(timeout time.Duration) (num_ready int, err error) {
self.read_set.Zero() self.read_set.Zero()
self.write_set.Zero() self.write_set.Zero()
self.err_set.Zero() self.err_set.Zero()
return 0, nil return 0, err
} }
return return
} }