diff --git a/pkg/term/term_windows.go b/pkg/term/term_windows.go index 5b637928fa..f46c9c8acf 100644 --- a/pkg/term/term_windows.go +++ b/pkg/term/term_windows.go @@ -5,6 +5,7 @@ import ( "io" "os" + "github.com/Sirupsen/logrus" "github.com/docker/docker/pkg/term/winconsole" ) @@ -57,6 +58,7 @@ func GetWinsize(fd uintptr) (*Winsize, error) { // SetWinsize sets the size of the given terminal connected to the passed file descriptor. func SetWinsize(fd uintptr, ws *Winsize) error { // TODO(azlinux): Implement SetWinsize + logrus.Debugf("[windows] SetWinsize: WARNING -- Unsupported method invoked") return nil } @@ -120,11 +122,10 @@ func MakeRaw(fd uintptr) (*State, error) { mode &^= winconsole.ENABLE_ECHO_INPUT mode &^= winconsole.ENABLE_LINE_INPUT mode &^= winconsole.ENABLE_MOUSE_INPUT - // TODO(azlinux): Enable window input to handle window resizing - mode |= winconsole.ENABLE_WINDOW_INPUT + mode &^= winconsole.ENABLE_WINDOW_INPUT + mode &^= winconsole.ENABLE_PROCESSED_INPUT // Enable these modes - mode |= winconsole.ENABLE_PROCESSED_INPUT mode |= winconsole.ENABLE_EXTENDED_FLAGS mode |= winconsole.ENABLE_INSERT_MODE mode |= winconsole.ENABLE_QUICK_EDIT_MODE diff --git a/pkg/term/winconsole/console_windows.go b/pkg/term/winconsole/console_windows.go index e6e3f9bcba..ce40a93167 100644 --- a/pkg/term/winconsole/console_windows.go +++ b/pkg/term/winconsole/console_windows.go @@ -12,6 +12,8 @@ import ( "sync" "syscall" "unsafe" + + "github.com/Sirupsen/logrus" ) const ( @@ -593,6 +595,7 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) n = len(command) parsedCommand := parseAnsiCommand(command) + logrus.Debugf("[windows] HandleOutputCommand: %v", parsedCommand) // console settings changes need to happen in atomic way term.outMutex.Lock() @@ -648,6 +651,7 @@ func (term *WindowsTerminal) HandleOutputCommand(handle uintptr, command []byte) column = int16(screenBufferInfo.Window.Right) + 1 } // The numbers are not 0 based, but 1 based + logrus.Debugf("[windows] HandleOutputCommmand: Moving cursor to (%v,%v)", column-1, line-1) if err := setConsoleCursorPosition(handle, false, column-1, line-1); err != nil { return n, err } @@ -1038,8 +1042,7 @@ func (term *WindowsTerminal) HandleInputSequence(fd uintptr, command []byte) (n } func marshal(c COORD) uintptr { - // works only on intel-endian machines - return uintptr(uint32(uint32(uint16(c.Y))<<16 | uint32(uint16(c.X)))) + return uintptr(*((*DWORD)(unsafe.Pointer(&c)))) } // IsConsole returns true if the given file descriptor is a terminal. diff --git a/pkg/term/winconsole/term_emulator.go b/pkg/term/winconsole/term_emulator.go index 8c9f34284d..2d5edc0390 100644 --- a/pkg/term/winconsole/term_emulator.go +++ b/pkg/term/winconsole/term_emulator.go @@ -1,6 +1,7 @@ package winconsole import ( + "fmt" "io" "strconv" "strings" @@ -206,6 +207,21 @@ func (c *ansiCommand) getParam(index int) string { return "" } +func (ac *ansiCommand) String() string { + return fmt.Sprintf("0x%v \"%v\" (\"%v\")", + bytesToHex(ac.CommandBytes), + ac.Command, + strings.Join(ac.Parameters, "\",\"")) +} + +func bytesToHex(b []byte) string { + hex := make([]string, len(b)) + for i, ch := range b { + hex[i] = fmt.Sprintf("%X", ch) + } + return strings.Join(hex, "") +} + func parseInt16OrDefault(s string, defaultValue int16) (n int16, err error) { if s == "" { return defaultValue, nil