소스 검색

Turned off Ctrl+C processing by Windows shell

Signed-off-by: Brendan Dixon <brendand@microsoft.com>
Brendan Dixon 10 년 전
부모
커밋
c337bfd2e0
3개의 변경된 파일25개의 추가작업 그리고 5개의 파일을 삭제
  1. 4 3
      pkg/term/term_windows.go
  2. 5 2
      pkg/term/winconsole/console_windows.go
  3. 16 0
      pkg/term/winconsole/term_emulator.go

+ 4 - 3
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

+ 5 - 2
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.

+ 16 - 0
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