github.com/josephvusich/fdf@v0.0.0-20230522095411-9326dd32e33f/terminal_windows.go (about)

     1  // +build windows
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"os"
     8  
     9  	"golang.org/x/sys/windows"
    10  	"golang.org/x/term"
    11  )
    12  
    13  func terminalANSI(enabled bool) (previous bool, err error) {
    14  	handle := windows.Handle(os.Stdout.Fd())
    15  	var mode uint32
    16  	if err := windows.GetConsoleMode(handle, &mode); err != nil {
    17  		return false, fmt.Errorf("unable to get console mode: %w", err)
    18  	}
    19  
    20  	previous = mode&windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0
    21  	if previous == enabled {
    22  		return previous, nil
    23  	}
    24  
    25  	if enabled {
    26  		mode |= windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
    27  	} else {
    28  		mode &= ^uint32(windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING)
    29  	}
    30  
    31  	if err := windows.SetConsoleMode(handle, mode); err != nil {
    32  		return false, fmt.Errorf("unable to set console mode: %w", err)
    33  	}
    34  
    35  	return previous, nil
    36  }
    37  
    38  func terminalWidth() (chars int, err error) {
    39  	if chars, _, err = term.GetSize(int(os.Stdout.Fd())); err != nil {
    40  		return -1, fmt.Errorf("unable to read info: %w", err)
    41  	}
    42  	return chars, nil
    43  }