github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/bindings/containers/term_windows.go (about)

     1  package containers
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"time"
     7  
     8  	sig "github.com/hanks177/podman/v4/pkg/signal"
     9  	"golang.org/x/sys/windows"
    10  	"golang.org/x/term"
    11  )
    12  
    13  func makeRawTerm(stdin *os.File) (*term.State, error) {
    14  	state, err := term.MakeRaw(int(stdin.Fd()))
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  
    19  	// Attempt VT if supported (recent versions of Windows 10+)
    20  	var raw uint32
    21  	handle := windows.Handle(stdin.Fd())
    22  	if err := windows.GetConsoleMode(handle, &raw); err != nil {
    23  		return nil, err
    24  	}
    25  
    26  	tryVT := raw | windows.ENABLE_VIRTUAL_TERMINAL_INPUT
    27  
    28  	if err := windows.SetConsoleMode(handle, tryVT); err != nil {
    29  		if err := windows.SetConsoleMode(handle, raw); err != nil {
    30  			return nil, err
    31  		}
    32  	}
    33  
    34  	return state, nil
    35  }
    36  
    37  func notifyWinChange(ctx context.Context, winChange chan os.Signal, stdin *os.File, stdout *os.File) {
    38  	// Simulate WINCH with polling
    39  	go func() {
    40  		var lastW int
    41  		var lastH int
    42  
    43  		d := time.Millisecond * 250
    44  		timer := time.NewTimer(d)
    45  		defer timer.Stop()
    46  		for ; ; timer.Reset(d) {
    47  			select {
    48  			case <-ctx.Done():
    49  				return
    50  			case <-timer.C:
    51  				break
    52  			}
    53  
    54  			w, h, err := term.GetSize(int(stdout.Fd()))
    55  			if err != nil {
    56  				continue
    57  			}
    58  			if w != lastW || h != lastH {
    59  				winChange <- sig.SIGWINCH
    60  				lastW, lastH = w, h
    61  			}
    62  		}
    63  	}()
    64  
    65  }
    66  
    67  func getTermSize(stdin *os.File, stdout *os.File) (width, height int, err error) {
    68  	return term.GetSize(int(stdout.Fd()))
    69  }