From ebbceea8a79766b7624dd7970a79054ecf582b6d Mon Sep 17 00:00:00 2001 From: Ahmet Alp Balkan Date: Thu, 26 Mar 2015 15:52:16 -0700 Subject: [PATCH] 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 --- api/client/utils.go | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/api/client/utils.go b/api/client/utils.go index 7ce0592ed6..1e4c0487c6 100644 --- a/api/client/utils.go +++ b/api/client/utils.go @@ -12,8 +12,10 @@ import ( "net/url" "os" gosignal "os/signal" + "runtime" "strconv" "strings" + "time" log "github.com/Sirupsen/logrus" "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 { cli.resizeTty(id, isExec) - sigchan := make(chan os.Signal, 1) - gosignal.Notify(sigchan, signal.SIGWINCH) - go func() { - for _ = range sigchan { - cli.resizeTty(id, isExec) - } - }() + if runtime.GOOS == "windows" { + go func() { + prevW, prevH := cli.getTtySize() + for { + 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 }