Set console mode for windows

Windows terminal handling is different than darwin and linux.  It needs to have the terminal mode set to enable virtual terminal processing.  This allows colors and other things to work.

Signed-off-by: Brent Baude <bbaude@redhat.com>
This commit is contained in:
Brent Baude
2020-06-26 16:22:04 -05:00
parent 771c887010
commit dfb2f92583
3 changed files with 51 additions and 0 deletions

View File

@ -16,7 +16,9 @@ import (
_ "github.com/containers/libpod/cmd/podman/system"
_ "github.com/containers/libpod/cmd/podman/volumes"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/libpod/pkg/terminal"
"github.com/containers/storage/pkg/reexec"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
@ -53,6 +55,10 @@ func main() {
}
}
}
if err := terminal.SetConsole(); err != nil {
logrus.Error(err)
os.Exit(1)
}
Execute()
os.Exit(0)

View File

@ -0,0 +1,8 @@
// +build !windows
package terminal
// SetConsole for non-windows environments is a no-op
func SetConsole() error {
return nil
}

View File

@ -0,0 +1,37 @@
// +build windows
package terminal
import (
"github.com/sirupsen/logrus"
"golang.org/x/sys/windows"
)
// SetConsole switches the windows terminal mode to be able to handle colors, etc
func SetConsole() error {
if err := setConsoleMode(windows.Stdout, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
if err := setConsoleMode(windows.Stderr, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
if err := setConsoleMode(windows.Stdin, windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err != nil {
return err
}
return nil
}
func setConsoleMode(handle windows.Handle, flags uint32) error {
var mode uint32
err := windows.GetConsoleMode(handle, &mode)
if err != nil {
return err
}
if err := windows.SetConsoleMode(handle, mode|flags); err != nil {
// In similar code, it is not considered an error if we cannot set the
// console mode. Following same line of thinking here.
logrus.WithError(err).Error("Failed to set console mode for cli")
}
return nil
}