mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
windows: monitorTtySize correctly by polling
This change makes `monitorTtySize` work correctly on windows by polling into win32 API to get terminal size (because there's no SIGWINCH on windows) and send it to the engine over Remove API properly. Average getttysize syscall takes around 30-40 ms on an average windows machine as far as I can tell, therefore in a `for` loop, checking every 250ms if size has changed or not. I'm not sure if there's a better way to do it on windows, if so, somebody please send a link 'cause I could not find. Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
This commit is contained in:
parent
42f9594fd3
commit
ebbceea8a7
1 changed files with 25 additions and 7 deletions
|
@ -12,8 +12,10 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
gosignal "os/signal"
|
gosignal "os/signal"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/docker/api"
|
"github.com/docker/docker/api"
|
||||||
|
@ -279,13 +281,29 @@ func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) {
|
||||||
func (cli *DockerCli) monitorTtySize(id string, isExec bool) error {
|
func (cli *DockerCli) monitorTtySize(id string, isExec bool) error {
|
||||||
cli.resizeTty(id, isExec)
|
cli.resizeTty(id, isExec)
|
||||||
|
|
||||||
sigchan := make(chan os.Signal, 1)
|
if runtime.GOOS == "windows" {
|
||||||
gosignal.Notify(sigchan, signal.SIGWINCH)
|
go func() {
|
||||||
go func() {
|
prevW, prevH := cli.getTtySize()
|
||||||
for _ = range sigchan {
|
for {
|
||||||
cli.resizeTty(id, isExec)
|
time.Sleep(time.Millisecond * 250)
|
||||||
}
|
w, h := cli.getTtySize()
|
||||||
}()
|
|
||||||
|
if prevW != w || prevH != h {
|
||||||
|
cli.resizeTty(id, isExec)
|
||||||
|
}
|
||||||
|
prevW = w
|
||||||
|
prevH = h
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
} else {
|
||||||
|
sigchan := make(chan os.Signal, 1)
|
||||||
|
gosignal.Notify(sigchan, signal.SIGWINCH)
|
||||||
|
go func() {
|
||||||
|
for _ = range sigchan {
|
||||||
|
cli.resizeTty(id, isExec)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue