github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/osutils/termsize/termsize_windows.go (about)

     1  // +build windows
     2  
     3  package termsize
     4  
     5  import (
     6  	"syscall"
     7  
     8  	"github.com/Azure/go-ansiterm/winterm"
     9  )
    10  
    11  func getStdHandle(stdhandle int) (uintptr, error) {
    12  	handle, err := syscall.GetStdHandle(stdhandle)
    13  	if err != nil {
    14  		return 0, err
    15  	}
    16  	return uintptr(handle), nil
    17  }
    18  
    19  // GetTerminalColumns returns the number of columns available in the current terminal
    20  func GetTerminalColumns() int {
    21  	defaultWidth := 80
    22  
    23  	stdoutHandle, err := getStdHandle(syscall.STD_OUTPUT_HANDLE)
    24  	if err != nil {
    25  		return defaultWidth
    26  	}
    27  
    28  	info, err := winterm.GetConsoleScreenBufferInfo(stdoutHandle)
    29  	if err != nil {
    30  		return defaultWidth
    31  	}
    32  
    33  	if info.MaximumWindowSize.X > 0 {
    34  		return int(info.MaximumWindowSize.X)
    35  	}
    36  
    37  	return defaultWidth
    38  }